代码之家  ›  专栏  ›  技术社区  ›  grefly

对这个关键字使用ref参数?

  •  5
  • grefly  · 技术社区  · 16 年前

    有没有办法强制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 回复  |  直到 16 年前
        1
  •  10
  •   Fredrik Mörk    16 年前

    因为你实际上并没有改变什么 receiver 指的是没有必要 ref 关键字。但是,如果是这样的话,你就不能 this 请参阅其他实例。

    为了通过 作为一个 裁判 参数,您需要这样编写它:

    Visit(ref this);
    

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

        2
  •  5
  •   Graviton    16 年前

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

    类中的所有信息在方法中更改时都会自动更改

        3
  •  4
  •   Eric Lippert    16 年前

    听起来你对你的大问题已经有了答案。但我们还是考虑一下这个吧。

    有没有办法强制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的实例是 传递值 是怎么变异的?必须通过引用传递!实际上,我们生成的代码就好像您编写了如下内容:

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

        4
  •  0
  •   digEmAll    16 年前

    你真的需要ref关键字吗?

    如果更改接收方实例,ref将非常有用 例如 接收器=空;

    否则

    属性也可以不使用ref关键字访问。

    推荐文章