繁体   English   中英

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

[英]Possible to store references to objects in list?

我希望能够为列表对象分配值而无需直接引用它们:

伪示例:

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

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放入数组或列表中。

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

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

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

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

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

有关示例,请参阅值类型的可变包装器以传递给迭代器

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM