2

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

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

我正在寻找的语法是:

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

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

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

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

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

4

3 回答 3

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应该改为修改结构的新版本。

于 2013-07-16T11:19:37.210 回答
0

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

不正确。this 指针指向“当前”对象,它不会创建对象的深拷贝或浅拷贝。

所以这:

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

工作正常。

于 2013-07-16T11:19:43.847 回答
0

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

如果它是一个类实例,您可以通过返回“this”来实现您正在寻找的语法。不会复制对象。'this' 是一个参考,正如您所期望的那样。

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

于 2013-07-16T11:52:13.643 回答