[英]Using a ref Parameter with the this Keyword?
有没有办法强制this关键字充当ref参数? 我想传入一个修改该对象的多个属性的访问者,但这仅想充当值参数。
对象中的代码:
public void Accept(Visitor<MyObject> visitor)
{
visitor.Visit(this);
}
访客代码:
public void Visit(ref Visitor<MyObject> receiver)
{
receiver.Property = new PropertyValue();
receiver.Property2 = new PropertyValue();
}
由于您实际上并未更改receiver
指的是什么,因此不需要ref
关键字。 但是,如果本来的情况下,你将无法使this
引用另一个实例。
为了this
作为ref
参数传递,您需要像这样编写它:
Visit(ref this);
该代码将无法编译: “因为它是只读的,所以无法将'<this>'作为ref或out参数传递”
如果Visitor<T>
是一个类,则不需要ref
关键字。
如果在方法中进行了更改,则类中的所有信息都会自动更改
听起来您已经对较大的问题有了答案。 但是我们还是要考虑这一点。
有没有办法强制this关键字充当ref参数?
是。 在逻辑上进行操作。
实际上,这就是在幕后以值类型实现“ this”的方式。 当您有(最差的做法!实际上不这样做)可变值类型时:
struct S
{
private int x;
public void M()
{
this.x = 123;
}
}
...
S s = new S();
s.M();
由于S的实例是通过值传递的,因此M如何突变s? s必须通过引用传递! 实际上,我们生成的代码就像您编写了以下内容一样:
struct S
{
private int x;
public static void M(ref S THIS)
{
THIS.x = 123;
}
}
...
S s = new S();
S.M(ref s);
简而言之,结构中的“ this”已作为ref参数传递,因此再次传递它没有问题。 这样做几乎总是一个可怕的主意,但这是合法的。
您是否真的需要ref关键字?
如果您更改接收者实例,例如ref = null; ref将很有用。
除此以外
没有属性ref也可以访问属性
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.