2013-03-14 95 views
4

真的很簡單的問題,我應該使用我的屬性初始化構造函數中的字段或直接引用它們?應該使用屬性來初始化構造函數中的字段嗎?

例子:

public class Foo() 
{ 
    private string example; 

    public String Example 
    { 
     get/set etc.. 
    } 

    public Foo(string exampleIn) 
    { 
     Example = exampleIn; 
    } 
} 

或者是更好的做法,要做到這一點:

public class Foo() 
{ 
    private string example; 

    public String Example 
    { 
     get/set etc.. 
    } 

    public Foo(string exampleIn) 
    { 
     example = exampleIn; 
    } 
} 

無論哪種方式,我不認爲任何違反封裝,所以我想知道是否有一個首選去哪裏?

回答

0

在C#3.0中引入自動屬性之前,我認爲您的第二個示例更「合適」。現在有了自動屬性,我認爲這是最好的:

public class Foo() 
{ 
    private string example; 

    public String Example 
    { 
     { get; set; } 
    } 

    public Foo(string exampleIn) 
    { 
     Example = exampleIn; 
    } 
} 
+0

謝謝,我想了很多,但只是好奇,看看有沒有什麼「標準」,因爲C#3.0使這很容易做到。 – 2013-03-14 17:43:10

2

實在是沒有正確或錯誤的答案在這裏(正因爲如此,我幾乎想投票關閉)。但是,我傾向於同意Jacob。我更喜歡屬性getter和setter路由,特別是現在我們擁有自動屬性。請記住,如果因爲任何原因影響您的決定,您可以對獲取者和設置者進行不同的訪問修改。我的意思是,如果你打算在構造函數中使用該屬性,那麼儘量保持一致,並且只能在課程中的其他地方使用它。這可能意味着你不想讓接觸者暴露在外面。

public class Foo() 
{ 
    private string example; 

    public String Example 
    { 
    get { return example; } 
    private set { example = value; } 
    } 

    public Foo(string exampleIn) 
    { 
     Example = exampleIn; 
    } 
} 
+0

好點,謝謝你的洞察力。 – 2013-03-15 18:00:41

0

這取決於是否數據值將進一步設置器內進行處理。如果值需要處理,那麼最好使用@Jacob所說的內容,但如果值不會被進一步處理(在大多數情況下就是這種情況),最好使用私有成員來避免對setter方法的額外方法調用。當CLR編譯代碼時,它會爲Get和Set屬性創建兩個方法,並使用Property訪問/修改定義該屬性的值將導致不必要的額外方法調用(如果該值未被進一步處理)。

相關問題