2

在引用类型上调用 ObjectIDGenerator 方法两次,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”只有一个 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(不是原来的)。

希望这会帮助你。

于 2012-12-11T03:49:16.100 回答
2

我认为答案一定是这个类(ObjectIDGenerator)不适合与值类型一起使用。从文档中查看这里:

唯一标识每个对象的对象引用是运行时垃圾收集堆中的地址。

当然,值类型不是存储在垃圾收集堆上,而是存储在堆栈上。因此,根据上述情况,ID 跟踪将无法正常工作(根据设计),值类型如int.

于 2012-12-10T03:11:04.560 回答