如何在C#中通过ref传递这个?
在我的一个类(ClassA)中,我想创建另一个类(ClassB)的相关实例,为它提供对启动它创建的对象的引用。 所以我为ClassB提供了一个带有(ref ClassB master)参数的构造错误。 但是在ClassA中,我不能只调用var slave = new ClassB(ref this)。 怎么实现这个?
ref
关键字导致Pass by Reference语义 – 也就是说, 如果在被调用函数中重新赋值变量 ,它也将在调用者中重新分配变量 。
显然,这只有在变量 2 (可以重新分配)直接作为参数传递时才有效,如果传递任意表达式则不起作用。 在这种情况下, this
不是变量,而是一个不能重新赋值的特殊表达式,因此不能使用。
因此,这将起作用:(但请参阅其他答案,并继续阅读为什么这可能不需要和/或只是愚蠢。)
var me = this; var slave = new ClassB(ref me);
但是, 不应将 Pass by ref
与 Pass by Object [Sharing] 1语义混淆 。 Pass by Object意味着如果传递了一个对象,则传递该对象 : 不复制/克隆/复制该对象。 如果对象被突变,则对象被突变。 除非使用ref
或out
否则所有引用类型都在C#中具有Pass by Object语义。 ( class
关键字声明一个新的引用类型,如post中的情况)。
另一方面, 值类型 (例如struct
),包括int
和Guid
以及KeyValuePair
,具有Pass by Value语义 – 在这种情况下,会生成一个副本,因此, 如果修改了值,则只有值struct (这是副本)的变化 。
快乐的编码
1在C#/ .NET下面,通过Value传递对象的引用来实现Pass by Object。 但是,上面的规则正确地描述了可观察的语义和效果。
2与C#不同,C#只允许变量与ref
一起使用,VB.NET允许使用Properties。 VB.NET编译器在编译期间自动创建临时变量和属性的隐式读/写指令。
ref
是指变量引用,而不是对象引用。
如果您只想传递对象的ref
则不需要ref
关键字。 对象已经是引用类型,因此它们的引用按值传递。 对象本身不会被复制。
因此,您既不需要构造函数中的ref
关键字也不需要实例化:
public ClassB(ClassA master) { }
var slave = new ClassB(this);
在这种情况下,您不需要通过ref。 如果您传递ClassB(this),它将通过引用传递,而不是通过值传递。 对传递给classB的构造函数的classA实例所做的任何更改也将应用于类A.
你真的需要ref关键字吗? 所有类型基本上都是通过引用传递的,所以如果你有ClassB将ClassA作为构造函数参数,只需传递新的ClassB(this),不需要使用ref。
您无法更改this
指针,这是ref
关键字允许的内容。 为什么你不能像这样声明ClassB?
上述就是C#学习教程:如何在C#中通过ref传递这个?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
ClassA m_classA; public ClassB(ClassA classA) { m_classA = classA; }
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1010323.html