2012-11-14 152 views
3

我希望能夠分配值列出對象,而不直接引用他們:是否可以存儲對列表中的對象的引用?

僞例如:

List<int> intList = new List<int> { 0 }; 
???? intPointer = ref intlist[0]; 

*intPointer = 1; // I know * isn't possible here, but it is what I'd like to do 

Console.WriteLine(intList[0]); 

,它將輸出1

我在想這是不可能的,但我只是想確保我沒有失去任何東西。

此外,我不在尋找一個使用unsafe的示例,我很好奇這是否可以在託管代碼中使用。

+0

「不直接引用它們」是指什麼? – Groo

+0

我想通過另一個變量 – afuzzyllama

+0

知道'list [0]中是什麼所以你想引用單個數組元素?請參閱C#中的[reference vs value types](http://www.albahari.com/valuevsreftypes.aspx)。 C#中的引用類型(任何'class'的實例)總是通過引用傳遞(*類似於*在C中傳遞指針)。另一方面,值類型在傳遞時總是被**複製。所以,對於值類型(像'int','float','struct'和類似的),這是不可能的。但是如果你讓它們成爲引用類型的屬性,那麼你將能夠獲得一個引用。 – Groo

回答

9

C#沒有「ref locals」(the CLR does though)的概念。所以你需要將值包裝在一個可以改變的引用類型中。例如,

public class Ref<T> where T : struct 
{ 
    public T Value {get; set;} 
} 

List<Ref<int>> intRefList = new List<Ref<int>>(); 
var myIntRef = new Ref<int> { Value = 1 }; 
intRefList.Add(myIntRef); 

Console.WriteLine(myIntRef.Value);//1 

Console.WriteLine(intRefList[0].Value);//1 

myIntRef.Value = 2; 

Console.WriteLine(intRefList[0].Value);//2 
4

不,這在C#中是不可能的。

C#不支持對局部變量的引用,其中包括對本地容器元素的引用。

,得到在C#真正的參考唯一的方法(即,不引用類型的實例,但是一個實際的參考另一變量)是經由refout參數的關鍵字。這些關鍵字不能與任何類型的索引值或屬性一起使用,其中包括List<>中的元素。您也無法直接控制這些引用:編譯器在後臺爲您執行取消引用。

有趣的是,CLR 確實支持這類參考;如果將CIL反編譯爲C#,則有時會看到類似int&這類引用int的類型。 C#故意不允許你直接在你的代碼中使用這些類型。

+0

+1 - 有趣的見解。謝謝! – afuzzyllama

相關問題