通过在C#中返回此指针/引用而不进行赋值来链接命令

时间:2013-07-16 11:15:22

标签: c# method-chaining this-pointer

这主要是语法问题。 这是一个相关的线程,显示了实现相同结果的不同替代方案: Method-Chaining in C#

现在,在C ++中,可以通过使方法返回指向该方法所属对象的指针来对对象进行链接。

我正在寻找的语法是:

foo.Transform(bar).TransformDifferently(yay);

在C#中,如果我返回此值,则复制该值(编辑:一半不正确,读取答案)。我不认为我可以返回引用或指针,是吗?有没有其他方法可以实现相同的语法?

现在我的解决方案是将结果分配给我的对象,如下所示:

foo = foo.Transform(bar).TransformDifferently(yay);

然而,这不是最佳解决方案,因为它既慢又慢(在我的情况下无关紧要)和更冗长。对于正确方向的任何指针,我都会感到非常高兴!

3 个答案:

答案 0 :(得分:1)

  

在C#中,如果我返回此值,则复制该值

事实并非如此,至少对于班级而言如此。 C#中的类是引用类型,这意味着该类型的每个变量实际上都是引用,因此返回this只返回对当前实例的引用

所以要做到这一点,它在C#中基本相同:

public class Foo
{
    public Foo Transform(Bar bar)
    {
        // transform
        return this;
    }

    public Foo TransformDifferently(Yay yay)
    {
        // transform
        return this;
    }
}

对于值类型,应该返回该类型的新实例。值类型应该是不可变的,因此如果您正确设计了struct,则应该没有修改原始值的方法。 Transform应该修改结构的新版本。

答案 1 :(得分:0)

  

在C#中,如果我返回此值,则复制该值

不正确的。这个指针指的是当前的'对象,它不会创建对象的深层或浅层副本。

所以这个:

foo.Transform(bar).TransformDifferently(yay);

工作正常。

答案 2 :(得分:0)

你的foo变量是什么类型的?它是类还是结构实例?

如果它是一个类实例,你可以通过返回'this'来实现你正在寻找的语法。该对象不会被复制。 'this'是一个参考,完全符合您的预期。

如果foo是一个struct实例,那么你想要实现的是一个坏主意。建议使结构不可变,因此我们可以像原语(整数,布尔值等)一样推理它们。在这种情况下,你最好还是复制一份。