2012-12-10 25 views
1

在引用類型上調用ObjectIDGenerator方法兩次,id值相同。值類型ObjectIDGenerator方法在C#中

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); 

輸出如下:


對象 '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); 

輸出:


這是爲什麼呢?

回答

3

我認爲這樣做的根本原因是int是值類型,並且getid()接受引用類型,所以需要有一個裝箱過程。每次你拳擊,你會得到一個新的盒裝int(不是原來的)id。

希望這會幫助你。

1

我認爲答案必須是這個類(ObjectIDGenerator)不能用於值類型。請參閱documentation

唯一標識每個對象的對象引用是運行時垃圾回收堆中的地址。

當然,值類型不會存儲在垃圾回收堆中,而是存儲在堆棧中。因此,根據以上所述,ID跟蹤將無法正確(按設計)使用像int這樣的值類型。