5

有没有办法强制 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();
}
4

4 回答 4

10

由于您实际上并没有更改receiver所指的内容,因此不需要ref关键字。但是,如果是这种情况,您将无法this引用另一个实例。

为了this作为ref参数传递,您需要这样编写:

Visit(ref this);

该代码将无法编译:“不能将 '<this>' 作为 ref 或 out 参数传递,因为它是只读的”

于 2010-04-15T16:15:51.907 回答
5

如果你Visitor<T>是一个类,那么你不需要ref关键字。

如果在方法中更改了类中的所有信息,则会自动更改它们

于 2010-04-15T16:16:05.180 回答
4

听起来您已经得到了更大问题的答案。但无论如何,让我们考虑一下这个。

有没有办法强制 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 参数传递,因此再次传递它没有问题。这样做几乎总是一个糟糕的主意,但它是合法的。

于 2010-04-16T06:16:50.047 回答
0

你真的需要 ref 关键字吗?

如果您更改接收器实例, ref 将很有用,例如 receiver = null;

除此以外

receiver.Property 也可以在没有 ref 关键字的情况下访问

于 2010-04-15T16:19:24.677 回答