2010-12-15 30 views
2

使用C++,我可以編寫如下代碼。在C#中傳遞具有相同類名字段變量的參數

class Terminal { 
    int uid; 

public: 
    void SetUid(int uid) {self.uid = uid;} 
}; 

我試過類似的東西在C#中,但我得到一個錯誤。我嘗試了以下,但它看起來很醜。

class Terminal { 
    int uid; 

public void SetUid(int uid_) {uid = uid_;} 
} 

當你想傳遞一個在C#中具有相同類名字段變量的參數時,你使用了什麼?

回答

3
class Terminal { 
    int uid; 

    public void SetUid(int uid) { this.uid = uid; } 
} 

不過,我會考慮使用一個屬性,而不是:

class Terminal { 
    public int Uid { get; set; } 
} 

getter和setter方法通常聞到的不當C#設計,因爲性能給你的getter/setter機制包裝成一個很好的語法糖。

+0

與屬性相比,getter/setter方法有一個優點;他們可以用作委託參考。是的,你可以將這個屬性包裝成一個看起來像一個setter的lambda表達式,但是當你基本上創建一個不增加值的方法時,它也開始聞起來了。 – KeithS 2010-12-15 21:23:06

+0

@KeithS:你實際上可以直接創建一個委託給純IL中的getter/setter。在C#中,你可以使用反射來實現這一點,如果你重用委託,這並不算太壞:'''''''''''''''''''''''''''''''''''' UID「)。GetGetMethod());' – cdhowie 2010-12-15 21:54:21

+0

...我想我寧願有lambda,實際上。所有這些,與()=> Uid。即使它爲調用堆棧添加了額外的層,但我認爲它實際上會更高效,並且當然更易於閱讀。 – KeithS 2010-12-15 22:22:22

4

你可以這樣做。只需使用:

public void SetUid(int uid) { this.uid = uid; } 
2

在C++中,它不是self,而是this,它在C#中實際上是一樣的;

public void SetUid(int uid) 
{ 
    this.uid = uid; 
} 
+0

帕斯卡爾不是'自我'嗎? – Ran 2010-12-15 21:01:26

+0

我知道Python使用'self'。自從我上次使用Pascal以來我就不記得它用了多久了:-) – 2010-12-16 15:00:58

1

public void SetUid(int uid) {this.uid = uid;}

2

我們不命名參數一樣我們的領域,因爲它是混亂。代碼的讀取次數比寫入次數要多,因此可讀性是最重要的。不得不在思想上解碼uid是參數,哪個是字段,只是不值得。

我們實際上在我們的字段中使用了一個下劃線前綴,使它立即明白什麼是字段和什麼是參數/本地。我知道不是每個人都喜歡那種慣例,但我們覺得它很有幫助。

另外,對於像你寫的一樣的SetXxx方法,我們通常會按照C#屬性設置器的約定命名參數value。由於只有一個參數,並且您已經知道方法名稱的含義,因此「value」與「uid」一樣有意義。

所以,在我們的商店,你的榜樣可能會最終看起來像這樣:

public class Terminal { 
    private int _uid; 

    public void SetUid(int value) { 
     _uid = value; 
    } 
} 

這是假定uid是隻寫的。如果它是讀寫的,當然我們會使用屬性而不是getter/setter方法。

0

我已經開始養成用「the」加參數的習慣,比如在「theUID」或「the_uid」中,如果你更喜歡下劃線。

public void SetUID(int theUID) { 
    uid = theUID; 
} 

這是不是「價值」更有幫助,特別是如果你有多個參數:

public Actor(String theName, String theFilm) 
{ 
    name = theName; 
    film = theFilm; 
} 

(是的,我以前曾經使用「這個。」但發現它有麻煩和錯誤-pone)

相關問題