如何在C#中通过ref传递这个?

Iva*_*van 13 .net c# reference this

在我的一个类(ClassA)中,我想创建另一个类(ClassB)的相关实例,为它提供对启动它创建的对象的引用.所以我为ClassB提供了一个带有(ref ClassB master)参数的construcror.但是在ClassA中,我不能只调用var slave = new ClassB(ref this).怎么实现这个?

小智 24

ref关键字使通过引用传递语义-也就是说,如果该变量在被调用的函数重新分配,这将重新分配的变量在调用者为好.

显然,这只有在变量2(可以重新分配)直接作为参数传递时才有效,如果传递任意表达式则不起作用.在这种情况下,this不是变量,而是一个不能重新赋值的特殊表达式,因此不能使用.

因此,这将起作用:(但请参阅其他答案,并继续阅读为什么这可能不是必需的和/或只是愚蠢.)

var me = this;
var slave = new ClassB(ref me);
Run Code Online (Sandbox Code Playgroud)

但是,不应将 Pass by reference Pass by Object [Sharing] 1语义混淆.Pass by Object意味着如果传递了一个对象,则传递对象:复制/克隆/复制该对象.如果对象被突变,则对象被突变.除非使用或使用,否则所有引用类型都在C#中具有Pass by Object语义.(该关键字声明了一个新的引用类型,如帖子中的情况).refoutclass

在另一方面,值类型(例如struct),其中包括intGuidKeyValuePair<K,V>,具有通过值传递语义-在这种情况下,副本制成,因此,如果该值被修改,仅值结构(这是一个拷贝)的变化.

快乐的编码


1在C#/ .NET下面,通过Value 传递对象的引用来实现Pass by Object .但是,上面的规则正确地描述了可观察的语义和效果.

2与仅允许使用变量的C#不同ref,VB.NET允许使用属性.VB.NET编译器在编译期间自动创建临时变量和属性的隐式读/写指令.


Bol*_*ock 9

ref 是指变量引用,而不是对象引用.

如果您只想传递对象的引用,ref则不需要该关键字.对象已经是引用类型,因此它们的引用按值传递.不复制对象本身.

因此,您既不需要ref构造函数中的关键字也不需要实例化中的关键字:

public ClassB(ClassA master)
{
}
Run Code Online (Sandbox Code Playgroud)
var slave = new ClassB(this);
Run Code Online (Sandbox Code Playgroud)