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

标签 c# winforms reference

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

代码:

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;

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

最佳答案

i would like to be able to have a reference to a variable inside a instance of a class, but i'd like the reference to become a class variable so I dont need to send it around inside of the class as parameter

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

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

不允许在数组、字段等中存储。基本上,任何“在堆上”的东西都不能保留在 ref 上。

C# 公开了第一个特性:引用变量作为方法参数。它不公开其他两个功能(尽管我已经编写了一个 C# 的实验版本,它公开了,并且工作得很好。)

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

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

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

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

关于c#:从类中的构造函数中保留 ref 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5261174/

相关文章:

javascript - 尝试将 JS && 运算符函数转换为 C#

c# - KeyDown 未拾取 'Return' 键 C#

c# - 多表单应用程序显示和隐藏表单的最佳实践?

c# - 标签框中的换行符

c++ - 为什么不能引用指针以用于常量分配字符串文字

c++ - 将 C++ lambda 复制到函数指针引用

C# EF 将记录添加到客户表,其中包含 Zip 表的外键

c# - SQL Guid to Identity 主键,批量查询

c# - 缩放窗口窗体

git - 如何将 "dereference"字符串转换为 git sha1 哈希?