繁体   English   中英

使用带有此关键字的ref参数?

[英]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参数?

是。 在逻辑上进行操作。

  • 一个REF参数使得用于可变别名
  • “ this”不是引用类型中的变量
  • “ this”是值类型中的变量
  • 因此,传递“ ref this”的唯一方法是来自值类型的实例方法。

实际上,这就是在幕后以值类型实现“ 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM