2013-07-16 49 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