- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
基本上我希望能够在一个类的实例中引用一个变量,但我希望引用成为一个类变量,所以我不需要在类内部将它作为参数发送
代码:
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 允许对变量的引用是
但不允许在数组、字段等中存储。基本上,任何“在堆上”的东西都不能保留在 ref 上。
C# 公开了第一个特性:引用变量作为方法参数。它不公开其他两个功能(尽管我已经编写了一个 C# 的实验版本,它公开了,并且工作得很好。)
请注意,C# 不允许您在需要堆存储 ref 的上下文中使用 ref——例如,ref 参数是 lambda 的封闭外部变量。在极少数情况下,编译器确实允许 ref 看起来像长期存储,并使用复制输入复制输出语义来模拟 ref,但最好不要去那里。
为什么CLR有这个限制?正确的思考方式是有两种存储方式:长期存储和短期存储,通常称为“堆”和“栈”。但是数据结构的形状无关紧要;重要的是生命的长度。一个变量有一个存储位置;这就是变量。如果您可以在长期存储中保留对从短期存储分配的变量的引用,那么长期存储会保留对生命周期较短的内容的引用,因此在访问变量时可能会崩溃并死亡在它死后。
显然有很多方法可以解决这个问题。例如,CLR 团队可以选择将 ref 放入短期存储是非法的,并允许将 ref 存储在长期存储中。但这意味着你不能引用局部变量或参数,你想将它们放在短期存储中,因为它们的生命周期很短。
CLR 团队实际选择的方式是禁止长期存储任何引用。与任何设计决策一样,它是针对竞争目标进行多次权衡的结果。
关于c#:从类中的构造函数中保留 ref 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5261174/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!