对引用类型调用两次 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);
Run Code Online (Sandbox Code Playgroud)
输出如下:
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);
Run Code Online (Sandbox Code Playgroud)
输出:
1
真
2
假
这就是为什么?
我认为这样做的根本原因是 int 是值类型,而 getid() 接受引用类型,因此,需要一个装箱过程。每次装箱时,您都会获得装箱 int 的新 ID(不是原始 ID)。
希望这会帮助你。