2

参照型で ObjectIDGenerator メソッドを 2 回呼び出します。ID 値は同じです。

test a = new test();//reference type
bool isFirstTime;
ObjectIDGenerator IDGenerator = new ObjectIDGenerator();
long theID = IDGenerator.GetId(a, out isFirstTime);
Console.WriteLine(theID);
Console.WriteLine(isFirstTime);

theID = IDGenerator.GetId(a, out isFirstTime);
Console.WriteLine(theID);
Console.WriteLine(isFirstTime);

次のような出力:
1
True
1
False

オブジェクト「a」には 1 つの ID しかありません。

しかし、値の型で ObjectIDGenerator メソッドを呼び出すと、奇妙なことが起こります。

int a = 100;//value type
bool isFirstTime;
ObjectIDGenerator IDGenerator = new ObjectIDGenerator();
long theID = IDGenerator.GetId(a, out isFirstTime);
Console.WriteLine(theID);
Console.WriteLine(isFirstTime);

theID = IDGenerator.GetId(a, out isFirstTime);
Console.WriteLine(theID);
Console.WriteLine(isFirstTime);

出力:
1

2

それが理由です?

4

2 に答える 2

5

これの本質的な原因は、intが値型であり、getid()が参照型を受け入れるため、ボクシングプロセスが必要だと思います。ボックス化するたびに、ボックス化されたintの新しいID(元のIDではない)を取得します。

これがお役に立てば幸いです。

于 2012-12-11T03:49:16.100 に答える
2

答えは、このクラス (ObjectIDGenerator) は値型で使用することを意図していないということだと思います。ドキュメントからここを参照してください:

各オブジェクトを一意に識別するオブジェクト参照は、実行時のガベージ コレクション ヒープ内のアドレスです。

もちろん、値型はガベージ コレクション ヒープではなく、スタックに格納されます。したがって、上記によると、ID 追跡は (設計により) のような値の型では正しく機能しませんint

于 2012-12-10T03:11:04.560 に答える