c#:在类中保留构造函数的ref参数

Tis*_*tos 8 c# reference winforms

基本上我希望能够在类的实例中引用变量,但我希望引用成为类变量,所以我不需要在类的内部作为参数发送它

码:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

editForm edtfrm = new editForm(ref instanceOfClass);
edtfrm.showDialog();
//grab the instance back
instanceOfClass = edtfrm.editedClass;
Run Code Online (Sandbox Code Playgroud)

我怎么解决这个问题?我不喜欢这个解决方案

Eri*_*ert 14

我希望能够在类的实例中引用变量,但我希望引用成为类变量,所以我不需要在类的内部作为参数发送它

那时你将不得不忍受失望.CLR类型系统明确禁止将变量的引用存储为类的成员.CLR允许引用变量

  • 传递给方法作为对应于形式参数或'this'的参数
  • 存储为本地人
  • 作为方法返回值返回

但并没有允许在阵列中,存储领域,等等.基本上,任何"在堆上"的东西都无法保留参考.

C#公开了第一个特性:将变量作为方法参数引用.它没有公开其他两个功能(虽然我已经编写了一个C#的实验版本,它的功能非常好.)

请注意,C#不允许您在需要堆存储ref的上下文中使用ref - 例如,ref参数是lambda的封闭外部变量.有一些罕见的情况,编译器确实允许看起来像ref的长期存储,并使用copy-in-copy-out语义来模拟ref,但最好甚至不去那里.

为什么CLR有此限制?考虑它的正确方法是有两种存储:长期和短期,通常称为"堆"和"堆栈".但数据结构的形状无关紧要; 相关的是寿命的长短.变量具有存储位置; 这就是变量.如果你可以在长期存储中保留一个从短期存储分配的变量的ref,那么长期存储会保留一个更短的生命周期,因此当它访问变量时可能会崩溃并死亡死后.

显然有很多方法可以解决这个问题.例如,CLR团队可能选择将参考资料用于短期存储是非法的,并允许在长期存储中存储ref.但那意味着你不能把refs带到局部变量或参数,你想把它放在短期存储中,因为它们的生命很短暂.

CLR团队实际选择的方式是禁止长期存储任何参考.与任何设计决策一样,这是针对竞争目标的许多权衡的结果.


Fel*_*ano 0

创建一个包含您的号码作为属性的类,并将其传递到您的逻辑中。该类将代表您的“模型”。