2013-07-10 119 views
3
class Student 
{ 
    private string firstName; 

    public string FirstName 
    { 
     get 
     { 
      return firstName; 
     } 
     set 
     { 
      firstName = value; // Possible logical checks may be implemented here in the future 
     } 
    } 

    public Student (firstName) 
    { 

     this.firstName = firstName; // Option 1 
     // Or 
     FirstName = firstName; // Option 2 

    } 
} 

這兩條線是更標準?C#構造函數中使用私有/公共領域

我們在構造函數中使用私有還是公共成員?

+2

你應該將你的問題和你的代碼片段分開 – Sayse

+0

我更喜歡在我的'new object'構造函數中使用公共屬性,但是在'clone object'構造函數中使用私有屬性。這是情況依賴和受到意見。 – tuespetre

+0

擁有這樣一個公共屬性,而不是僅僅暴露成員本身的目的是,如果你希望在數據出現時將來做某些事情,那麼你應該在Property的setter中定義該邏輯,而不是在設置財產之前,無處不在。 – crush

回答

4

這取決於...往往不包含在你的榜樣的事情。首先,您的整個財產可以縮短爲一個自動實施的財產:

public string FirstName { get; set; } 

這將使問題在這種情況下進行模擬。除此之外,問題歸結爲屬性中可能存在(現在或將來)的哪種邏輯,以及該構造是否需要調用該邏輯。

例如,該屬性是否在內部檢查所需值或執行其他驗證?事情是這樣的:

private string firstName; 
public string FirstName 
{ 
    get { return firstName; } 
    set 
    { 
     if (string.IsNullOrWhiteSpace(value)) 
      throw new ArgumentNullException("FirstName"); 
     firstName = value; 
    } 
} 

在這樣的情況下,顯然你會想,這樣構造對象時所應用的邏輯構造函數使用屬性,而不是支持字段。相反,您可能只有在訪問setter時才使用邏輯,但在構建對象時不應該使用該邏輯。關於我的頭頂,一個例子可能是一個維護關於位置信息的對象。它可能具有Address屬性和Coordinates屬性,並且任何時候其中一個發生更改時都會有後端進程來對新值進行地理定位並更新另一個值。但是你可能有一個構造函數可以接受這兩個構造函數(可能在重建數據庫中的現有位置時),並且在構建過程中執行地理位置沒有意義。在這種情況下,您將設置後臺字段而不是屬性。

由於缺乏一個令人信服的理由不使用這些屬性,我通常寧願使用它們而不是支持字段。只是因爲邏輯可能後來被添加到所有訪問器應該使用的屬性。我還發現這些屬性更有可能是比後臺字段更有意義的名稱(例如,FirstName_firstName更具可讀性/有意義),所以優先選擇是讓其餘代碼儘可能易讀,並且更喜歡更多可讀的名字。

9

你可以使用選項3

public string FirstName {get; set;} 
public Student (firstName) 
{ 
    FirstName = firstName; 
} 
+0

準確地說,我在想我的答案。 –

+0

@Sayse除非你在進出的道路上按摩數據,否則這會更清潔。 – Curt

+2

這不是選項2嗎? – crush

0

這是一個風格上的選擇並不真正的問題去了。就我個人而言,我使用公共屬性名稱,因爲我喜歡使用自動屬性,並且這是唯一的選擇。使用公共屬性保持我的代碼一致。

0

當我寫波蘇斯(普通老式CLR對象)裏的東西是微不足道的,我去這種方法:

public class POCO 
{ 
    public POCO() 
    { 
     Name = "Moo-Juice"; 
    } 

    public string Name { get; set; } 
} 

在我實際需要的成員變量不平凡的情況下,我前綴它與_(這有助於智能感知,相信我 - 讓你的成員和當地居民之間的區別):

public class NonTrivial 
{ 
    private string _name; 

    public NonTrivial() 
    { 
     _name = "Jon Skeet"; // He is non-trivial 
    } 
} 

這樣,我避免污染我的代碼以this.無處不在。

0

這取決於:

private string firstName; 
public string FirstName 
{ 
    get 
    { 
     return firstName; 
    } 
    set 
    { 
     firstName = (value=="mycheck")?"default":value; 
    } 
} 

如果你的財產有一定的驗證,那麼你應該去:

public Student (firstName) 
{ 
    FirstName = firstName; 
} 
0

最常見的是使用該屬性,但這是一個選擇問題。

在這種情況下,特別是,你應該使用自動屬性:

public string FirstName { get; set; } 

,編譯器會自動將支持字段。

您也可以選擇不加參數的構造函數,如因爲C#3.5(IIRC),你可以使用自動初始化:

new Studant() { FirstName = "John Doe" } 

它調用構造函數,並將屬性設置在同一行。總的來說,我傾向於只爲它真正依賴的東西請求一個構造器參數(請參閱:dependency injection),並且讓它們不是必需的,直到它們是必需的爲止,例如在持久化之前進行驗證。

相關問題