gpt4 book ai didi

c# - 在 C# 中存储对对象的引用

转载 作者:太空狗 更新时间:2023-10-29 22:02:26 25 4
gpt4 key购买 nike

我想知道如何在 .net 中存储对对象的引用。

也就是说,我想要类似下面的代码(当然,请注意,下面的代码可能与实际执行的方式相去甚远):

class Test
{
private /*reference to*/ Object a;
public Test(ref int a)
{
this.a = a;
this.a = ((int)this.a) + 1;
}
public Object getA() { return this.a; }
}
/*
* ...
*/
static void Main(string[] args)
{
int a;
a=3;
Test t = new Test(ref a);
Console.WriteLine(a);
Console.WriteLine(t.getA());
Console.ReadKey();
}

产生以下输出:

4
4

理想情况下,我想在不围绕整数编写包装类的情况下执行此操作。

换句话说,我想我需要 .Net 中的指针。

最佳答案

您不能在 .NET 中存储对变量 的引用,句号。您可以存储对对象 的引用,但不能存储对变量 的引用。

原因是,如果您被允许存储对任意变量的引用,那么您就可以存储对局部变量的引用。如果您可以存储对局部变量的引用,则运行时无法使用在短期内存池(也称为堆栈)上存储局部变量的优化。

现在,即使您可以这样做,您所描述的操作也不是类型安全的,原因不同。您有一个(命名非常糟糕的)字段变量“a”,类型为“对对象变量的引用”,以及一个(命名非常糟糕且令人困惑的)局部变量“a”,类型为“对 int 变量的引用”。即使您可以存储对变量的引用,将对 int 变量的引用存储在“对对象变量的引用”类型的东西中也没有任何意义,因为这两种类型在逻辑上是不兼容的。您可以对它们执行的操作是不同的;对对象变量的引用可以写入一个字符串;不能引用 int 变量。

Perhaps I am misunderstanding but wouldn't a variable such as the integer above be boxed into an object which could then be stored as a reference?

您将对对象 的引用与对变量 的引用混淆了。令人困惑的是,我们对实际上是两种不同的事物使用相同的术语。

是的,装箱将值类型(如 int)转换为引用类型(如 object)。这与对变量 的引用绝对没有任何关系。

当你对一个变量进行引用时,你就是在为该变量创建一个别名。当你说

void M(ref int y) { y = 123; }
...
int x = 0;
M(ref x);

你是说“x 和 y 是同一个变量的两个不同名称”。

现在,如果您想做的是表示“我已经捕获了一个变量并且我希望能够读取和写入它”的概念,那么请使用委托(delegate):

class Ref<T>
{
private Func<T> getter;
private Action<T> setter;
public Ref(Func<T> getter, Action<T> setter)
{
this.getter = getter;
this.setter = setter;
}
public T Value
{
get { return getter(); }
set { setter(value); }
}
}
...
int abc = 123;
var refabc = new Ref<int>(()=>abc, x=>{abc=x;});
... now you can pass around refabc, store it in a field, and so on
refabc.Value = 456;
Console.WriteLine(abc); // 456
Console.WriteLine(refabc.Value); // 456

有道理吗?

关于c# - 在 C# 中存储对对象的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2760087/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com