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

时间:2011-06-29 22:40:47

标签: c# .net reference this

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

5 个答案:

答案 0 :(得分:23)

ref关键字会导致Pass by Reference语义 - 也就是说,如果在被调用函数中重新分配变量,它将重新分配调用者中的变量

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

因此,这可行:(但请看其他答案并继续阅读为什么这可能不需要和/或只是愚蠢。)

var me = this;
var slave = new ClassB(ref me);

但是,传递ref erence 不应与 Pass by Object [Sharing] 1 语义混淆。 Pass by Object意味着如果传递了一个对象,传递了对象:该对象被复制/克隆/复制。 如果对象发生了变异,那么对象就会发生变异。所有Reference Types都有C#中的Pass by Object语义,除非{{1}使用{}或ref。 (out关键字声明了一种新的引用类型,如帖子中的情况。)

另一方面,Value Types(例如class),包括structint以及Guid,具有Pass by Value语义 - 在这种情况下,复制,因此,如果修改了值,则只有值struct(这是一个副本)会发生变化

快乐编码


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

2 与只允许变量与KeyValuePair<K,V>一起使用的C#不同,VB.NET允许使用属性。 VB.NET编译器在编译期间自动创建临时变量和属性的隐式读/写指令。

答案 1 :(得分:9)

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

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

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

public ClassB(ClassA master)
{
}
var slave = new ClassB(this);

答案 2 :(得分:1)

在这种情况下,您不需要通过ref。如果您传递ClassB(this),它将通过引用传递,而不是通过值传递。 对传递给classB的构造函数的classA实例所做的任何更改也将应用于类A.

答案 3 :(得分:1)

您无法更改this指针,这是ref关键字允许的内容。为什么你不能像这样声明ClassB?

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

答案 4 :(得分:1)

你真的需要ref关键字吗?所有类型基本上都是通过引用传递的,所以如果你有ClassB将ClassA作为构造函数参数,只需传递新的ClassB(this),不需要使用ref。