C# 中 ObjectIDGenerator 方法的值类型

roa*_*oul 2 c# value-type

对引用类型调用两次 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

这就是为什么?

pin*_*ino 5

我认为这样做的根本原因是 int 是值类型,而 getid() 接受引用类型,因此,需要一个装箱过程。每次装箱时,您都会获得装箱 int 的新 ID(不是原始 ID)。

希望这会帮助你。