可以存储对列表中对象的引用吗?

时间:2012-11-14 00:47:56

标签: c#

我希望能够在不直接引用它们的情况下为列表对象赋值:

伪示例:

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的示例,如果在托管代码中这是可行的,我很好奇。

3 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:4)

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

C#不支持对局部变量的引用,包括对本地容器元素的引用。

在C#中获取真正引用的唯一方法(即引用类型的实例,但实际引用另一个变量)是通过ref或{ {1}}参数关键字。这些关键字不能与任何类型的索引值或属性一起使用,其中包含out中的元素。您也无法直接控制这些引用:编译器会在幕后为您执行解除引用。

有趣的是,CLR 确实支持这种参考;如果您将CIL反编译为C#,您有时会看到List<>等类型的引用int&。 C#故意不允许您直接在代码中使用这些类型。

答案 2 :(得分:0)

使用诸如int之类的value type时,您无法提出要求。你需要一个额外的间接水平;例如,您可以包装整数。

有关此示例,请参阅Mutable wrapper of value types to pass into iterators