2013-07-16 102 views
2

这返回在C#这个指针/链接参考命令主要是一个语法问题。 这里的表示,以实现相同的结果不同的替代方案相关的线程: Method-Chaining in C#由没有分配

现在,在C++中,可以链命令通过使方法返回指向其的方法是一个成员的对象的对象上。

我在寻找的语法是:

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

在C#中,如果我回到这个,值被复制(编辑:一半不正确,阅读的答案)。我不认为我可以返回一个参考或指针,我可以吗?有没有其他的方法来实现相同的语法?

现在我的解决方法就是结果分配给我的对象,像这样:

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

这不过不是最佳的解决方案,因为它不仅运行速度较慢(不我的情况关系),更冗长。我会很高兴任何指向正确的方向!

回答

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

+0

完美,非常感谢!我的错误 - 我认为结构和类之间的唯一区别是标准的可见性修饰符,(再一次,就像在C++中一样,呵呵)。 –

0

在C#中,如果我回到这个,值复制

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

所以这个:

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

工作正常。

+0

谢谢+1提及深浅拷贝! –

0

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

如果它是一个类的实例,你可以实现你通过返回“这个”寻找语法。该对象不会被复制。 '这'是一个参考,完全如你所料。

如果foo是一个结构实例,然后你想达到什么是一个坏主意。建议使结构不可改变,以便我们可以像原始数据(整数,布尔值等)推理它们。在这种情况下,你最好还是复印一份。

+0

这是一个结构,但我已经改变它现在是一个类。谢谢,+1对于基元不变性的提示! –

+0

没关系我说了什么,我改回它成为一个结构 - 只是因为你对基元的描述。 –

+0

你正在返回'this'还是你的struct的新副本? – Reda