C#:保留类中构造函数的引用参数

2024-04-29

基本上我希望能够引用类实例内的变量,但我希望引用成为类变量,因此我不需要将其作为参数在类内部发送

code:

int num = 0;
myClass(num);
print num; // output is 0 but i'd like it to be 10 :)
class myClass
{
    private int classNumber;
    myClass(ref int number)
    {
        print number; //output is 0

        // id like this to be a reference to the refenrence
        classNumber = number;

        DoSomething();
    }
    public void DoSomething()
    {
        ClassNumber = 10;
    }
}

为什么我问这个是因为我正在使用 winforms 并有一个主表单将类的实例发送到一个新表单,该新表单应该编辑该类并将其发送回来..现在我使用 Form.ShowDialog() 来避免用户在新表单中编辑时使用主表单,然后从新表单中获取数据

editForm edtfrm = new editForm(ref instanceOfClass);
edtfrm.showDialog();
//grab the instance back
instanceOfClass = edtfrm.editedClass;

我该如何解决这个问题?我不喜欢这个解决方案


我希望能够引用类实例内的变量,但我希望该引用成为类变量,因此我不需要将其作为参数在类内部发送

那时你将不得不生活在失望之中。 CLR 类型系统明确禁止将对变量的引用存储为类的成员。 CLR 允许对变量的引用

  • 作为与形式参数或“this”相对应的参数传递给方法
  • 存储为本地变量
  • 作为方法返回值返回

但确实not允许存储在数组、字段等中。基本上,任何“堆上”的东西都无法保留裁判。

C# 公开了第一个功能:将变量引用作为方法参数。它没有公开其他两个功能(尽管我已经编写了一个 C# 的实验版本,它公开了,而且效果非常好。)

请注意,C# 不允许您在需要堆存储 ref 的上下文中使用 ref —— 例如,ref 参数是 lambda 的封闭外部变量。在极少数情况下,编译器确实允许长期存储引用,并使用复制输入复制输出语义来模拟引用,但最好不要这样做。

为什么CLR有这个限制呢?正确的思考方式是,有两种存储:长期存储和短期存储,通常称为“堆”和“堆栈”。但数据结构的形状是无关紧要的;相关的是生命周期的长度。变量有一个存储位置;这就是变量。如果您可以在长期存储中保留对从短期存储分配的变量的引用,那么长期存储会保留对生命周期较短的内容的引用,因此在访问该变量时可能会崩溃并死亡它死后。

显然有很多方法可以解决这个问题。例如,CLR 团队可以选择将引用短期存储设为非法,并允许将引用存储在长期存储中。但这意味着您无法对局部变量或参数进行引用,您希望将其放入短期存储中,因为它们的生命周期非常短。

CLR 团队实际选择的方式是禁止长期存储任何引用。与任何设计决策一样,它是针对竞争目标进行多次权衡的结果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#:保留类中构造函数的引用参数 的相关文章

随机推荐