如何在C#中通过引用传递此信息?

如何在C#中通过引用传递此信息?,c#,.net,reference,this,C#,.net,Reference,This,在我的一个类(ClassA)中,我想创建另一个类(ClassB)的相关实例,为它提供对发起创建它的对象的引用。因此,我为ClassB提供了一个construcorr,它接受(ref ClassB master)参数。但在ClassA中,我不能只调用var slave=newClassB(请参阅此)。如何实现这一点?在这种情况下,不需要通过ref传递。如果您正在传递ClassB(this),那么它将通过引用传递,而不是通过值传递。 对传递到classB构造函数中的classA实例所做的任何更改也将

在我的一个类(ClassA)中,我想创建另一个类(ClassB)的相关实例,为它提供对发起创建它的对象的引用。因此,我为ClassB提供了一个construcorr,它接受(ref ClassB master)参数。但在ClassA中,我不能只调用var slave=newClassB(请参阅此)。如何实现这一点?

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

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

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

因此,构造函数和实例化中都不需要
ref
关键字:

public ClassB(ClassA master)
{
}

您不能更改
这个
指针,这是
ref
关键字允许的。为什么不能这样声明ClassB

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

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

关键字ref会产生语义-也就是说,如果变量在被调用函数中重新分配,它也会在调用者中重新分配变量

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

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

但是,Pass-by
ref
erence不应与1语义混淆。“按对象传递”是指如果传递了对象,则传递该对象。:不复制/克隆/复制该对象如果对象发生变异,则对象发生变异。除非使用
ref
out
,否则所有对象都具有C#中的传递对象语义。(关键字
class
声明了一个新的引用类型,如文章中的情况)

另一方面,(例如,
struct
),包括
int
Guid
KeyValuePair
,具有语义-在这种情况下,会制作一个副本,因此,如果修改了值,则只有值结构(即副本)会更改

快乐编码


1在C#/.NET下面,通过按值传递对对象的引用来实现按对象传递。然而,上述规则正确地描述了可观察的语义和效果


2与C#不同,C#只允许变量与
ref
一起使用,VB.NET允许使用属性。VB.NET编译器会在编译过程中自动创建一个临时变量和属性的隐式读/写指令。

我不完全确定您在这里要完成什么。您知道.NET中的引用类型已经通过指针实现了,对吗
newclassb(this)
将对当前对象的引用传递回
ClassB
的构造函数。你为什么需要
ref
?我不认为你真的想通过ref传递
这个
foo(ref bar)
意味着
foo
可以指向其他地方
是一个不能更改的常量,在大多数情况下,您只想保留它的值。不,它是按值传递的,但您传递的值是一个引用@LukeH-正确,这就是我想说的:)你的意思是“所有引用类型”。所有类型都是按值传递的(除非你使用
ref
out
修饰符)。@LukeH-我不明白你的意思-你的意思是说指针是按所有下面的值传递的?是的。您是通过value还是通过ref进行传递与您是通过ref类型还是通过value类型进行传递是正交的。在这种情况下不会复制任何内容吗?classB.classA将指向原始classA实例吗?是的,classB.m_classA将指向原始classA实例。
ClassA m_classA;
public ClassB(ClassA classA)
{
   m_classA = classA;
}
var me = this;
var slave = new ClassB(ref me);