能否在列表中存储对象的引用?

9
我希望能够在不直接引用列表对象的情况下为它们分配值:
伪代码示例:
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的示例,我只是好奇在托管代码中是否可能实现。


“Without directly referencing them” 是什么意思? - vgru
我想通过另一个变量了解list[0]中的内容。 - afuzzyllama
你想获取数组中单个元素的引用吗?请参考C#中的值类型与引用类型。在C#中,引用类型(任何class的实例)总是通过引用传递(类似于在C中传递指针)。另一方面,当传递值类型时(如intfloatstruct等),它们总是被复制。但如果将它们作为引用类型的属性,则可以获取引用。 - vgru
3个回答

13

C#没有“ref locals”的概念(但CLR有)。因此,您需要将值包装在可变的引用类型中。例如:

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

编辑:C# 7.0 添加了 ref locals,但仍然无法以这种方式使用,因为您无法将 ref locals 放入数组或列表中。


4

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

在C#中获取真正的引用(即不是引用类型的实例,而是对另一个变量的实际引用)的唯一方法是通过refout参数关键字。这些关键字不能用于任何类型的索引值或属性,包括List<>中的元素。您对这些引用也没有直接控制:编译器会在幕后为您执行解引用操作。

有趣的是,CLR支持这种引用类型;如果您将CIL反编译为C#,有时会看到像int&这样的类型,它们是对int的引用。C#有意不允许您直接在代码中使用这些类型。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接