在C#中存储对象的引用

我想知道如何在.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,period中存储对变量的引用。 您可以存储对象的引用,但不能存储对变量的引用。

原因是如果允许存储对任意变量的引用,那么您可以存储对局部变量的引用。 如果可以存储对局部变量的引用,那么运行时不能使用在短期内存池(即堆栈)上存储局部变量的优化。

现在,即使您可以这样做,您描述的操作也不是因为其他原因而不是类型安全的。 你有一个(命名非常糟糕的)字段变量“a”类型为“对象变量的引用”和一个(非常严重且容易混淆的)局部变量“a”类型为“引用int变量”。 即使您可以存储对变量的引用,也不会将对int变量的引用存储在“对象变量引用”类型中,因为这两种类型在逻辑上是不兼容的。 您可以对它们执行的操作是不同的; 对象变量的引用可以写入一个字符串; 对int变量的引用不能。

也许我误解了,但是不会将上面的整数这样的变量装入一个可以存储为参考的对象中吗?

您对引用变量的 对象的引用感到困惑。 令人困惑的是,我们对两个不同的东西使用相同的术语。

是的,拳击将值类型(如int)转换为引用类型,如object。 对于变量的引用,这绝对没有任何意义。

当您对变量进行ref时,您正在为该变量创建别名。 当你说

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

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

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

 class Ref { private Func getter; private Action setter; public Ref(Func getter, Action setter) { this.getter = getter; this.setter = setter; } public T Value { get { return getter(); } set { setter(value); } } } ... int abc = 123; var refabc = new Ref(()=>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 ++的int& a的引用变量的概念。 有解决方法。 一个是使用闭包:

 class Test { private Func get_a; private Action set_a; public Test(Func get_a, Action set_a) { this.get_a = get_a; this.set_a = set_a; this.set_a(this.get_a() + 1); } public Object getA() { return this.get_a(); } } /* * ... */ static void Main(string[] args) { int a; a=3; Test t = new Test(() => a, n => { a = n; }); Console.WriteLine(a); Console.WriteLine(t.getA()); Console.ReadKey(); } 

我不在VS面前,所以请原谅任何令人尴尬的失礼。