如何在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意味着如果传递了一个对象,则传递对象复制/克隆/复制该对象。 如果对象被突变,则对象被突变。 除非使用refout否则所有引用类型都在C#中具有Pass by Object语义。 ( class关键字声明一个新的引用类型,如post中的情况)。

另一方面, 值类型 (例如struct ),包括intGuid以及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?

 ClassA m_classA; public ClassB(ClassA classA) { m_classA = classA; }