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

标签 c# .net

我想知道如何在 .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/

相关文章:

c# - 为什么在这个数据库连接中使用while循环?

c# - FirstOrDefault/First 和 OrderByDescending 是否比 LastOrDefault/Last 和 OrderBy 更快?

c# - 使用分页时不显示用户详细信息

c# - 如何将 DTE.ActiveWindow.Selection 转换为 VS2008 宏中最接近的 CodeElement?

c# - 自定义 T4 生成器生成的类看起来很乱

.net - C++/CLI 程序集中定义的 Powershell 和枚举

c# - 在 try,catch block 之外运行代码是否有任何性能优势?

c# - 如何搜索包含 50,000 条加密记录的表

c# - 在 .NET Core 6.0 Razor 页面应用程序中配置 Serilog 的正确方法是什么?

.net - 创建一个简单的 POP3 *SERVER*