当前位置: 首页 > 编程语言 > C#

在类中保留构造函数的ref参数分享

时间:2023-04-10 12:59:36 C#

c#:在类中保留构造函数的ref参数基本上我希望能够在类的实例中引用变量,但我希望引用是类变量所以我不需要将它作为参数代码发送到类中:intnum=0;我的班级(人数);打印数字;//输出是0但我希望它是10:)classmyClass{privateintclassNumber;myClass(refintnumber){打印数字;//输出为0//像这样的id是对引用的引用classNumber=number;做一点事();}publicvoidDoSomething(){ClassNumber=10;为什么我问这是因为我正在使用winforms并且有一个主窗体将一个类的实例发送到一个新窗体应该编辑该类并将其发送回来......现在我使用Form.ShowDialog()来避免用户在新表单中编辑时使用主表单,然后从新表单中抓取数据editFormedtfrm=neweditForm(refinstanceOfClass);edtfrm.showDialog();//抓回实例instanceOfClass=edtfrm.editedClass;我该如何解决?我不喜欢这个解决方案我希望能够在类的实例中引用变量,但我希望引用是一个类变量所以我不需要将它作为参数发送到类中然后你将不得不忍受失望。CLR类型系统明确禁止将对变量的引用存储为类的成员。CLR允许引用变量,但不能将变量存储在数组、字段等中。基本上,“堆上”的任何东西都不能保留引用。C#公开了它的第一个特性:引用变量作为方法参数。它没有公开其他两个功能(尽管我已经用C#编写了一个实验版本,并且它工作得很好。)请注意,C#不允许您在需要堆存储引用的上下文中使用引用-例如,作为lambda封闭外部变量的引用参数。在极少数情况下,编译器确实允许看起来像ref的长期存储,并使用复制输入复制输出语义模拟ref,但最好不要去那里。为什么CLR有这个限制?正确的思考方式是存储有两种:长期存储和短期存储,通常称为“堆”和“栈”。但是数据结构的形状并不重要;重要的是寿命。变量有一个存储位置;这就是变量。如果您可以在长期存储中保留对从短期存储分配的变量的引用,那么长期存储会保持较短的生命周期,因此变量可能会在访问变量时崩溃并死后死掉。显然有很多方法可以解决这个问题。例如,CLR团队可以选择将引用用于短期存储定为非法,并允许将引用存储在长期存储中。但这意味着你不能引用局部变量或参数,你想把它放在短期存储中,因为它们是短暂的。CLR团队实际选择的方式是禁止长期存储任何引用。与任何设计决策一样,这是针对竞争目标进行许多权衡的结果。您尝试做的不是一个好主意,我会将修改后的对象公开为类的属性,如下所示:MyClassmyClass=newMyClass(var);StringBuildermySb=myClass.InstanceasStringBuilder;Console.WriteLine(mySb.ToString());}}publicclassMyClass{publicobjectInstance{get;set;}publicMyClass(objectvar){this.Instance=var;做一点事();}privatevoidDoSomething(){this.Instance=newStringBuilder("Hello");}}当然,你的测试代码是行不通的,因为它是原始类型。但是您的第二个代码将起作用,因为它是引用类型。(甚至不是'ref')不需要分配实例。公共课第二{公共第一f;publicSecond(Firstf){this.f=f;}publicvoidchange(){this.f.Name="PUli";}}publicclassFirst{privatestring_name;publicFirst(){Name="SUli";}publicstringName{get{return_name;}设置{_name=值;}}}classProgram{staticvoidMain(String[]args){Firstf=newFirst();第二秒=新的第二(f);Console.WriteLine(f.Name);sec.change();Console.WriteLine(f.Name);}}输出:-Sulipuri创建一个类并将其传递给您的逻辑。此类将代表您的“模型”。不能保存ref参数,ref不是引用,它只是一个别名。如果你有:publicvoidStuff(refinti){i=2;}并调用它:ints=1;东西(参考);ref的意思是“使i成为s的别名并将更改传播给它”。一旦离开方法的范围,别名就会消失。显然,EricLippert在他的博客上开始了关于这个问题的系列文章。您应该创建一个类并在您的逻辑中使用它。GUI不应操纵值,只能操纵后端。这里发生了几件事。首先,在你的构造函数中,你可能想做DoSomething();编号=班级编号;而不是classnumber=number;其次,尝试myClass(refnum);构造函数ref参数分享的所有内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注——myClass(num);本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: