小智 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),其中包括int与Guid和KeyValuePair<K,V>,具有通过值传递语义-在这种情况下,副本被制成,因此,如果该值被修改,仅值结构(这是一个拷贝)的变化.
快乐的编码
1在C#/ .NET下面,通过Value 传递对象的引用来实现Pass by Object .但是,上面的规则正确地描述了可观察的语义和效果.
2与仅允许使用变量的C#不同ref,VB.NET允许使用属性.VB.NET编译器在编译期间自动创建临时变量和属性的隐式读/写指令.
ref 是指变量引用,而不是对象引用.
如果您只想传递对象的引用,ref则不需要该关键字.对象已经是引用类型,因此它们的引用按值传递.不复制对象本身.
因此,您既不需要ref构造函数中的关键字也不需要实例化中的关键字:
public ClassB(ClassA master)
{
}
Run Code Online (Sandbox Code Playgroud)
var slave = new ClassB(this);
Run Code Online (Sandbox Code Playgroud)