2010-08-09 84 views
6

可能重複:
C# - When to use properties instead of functions何時以及爲什麼要使用C#訪問方法

我想了解什麼時候以及爲什麼使用 「干將」 和 「二傳手」

有人請提供一些指導。

以下結構之間有什麼區別 - 請僅查看訪問器方法。

//EXAMPLE 1: simple accessor method 
private static bool _isInitialEditMapPageLoad; 
public static bool isInitialEditMapPageLoad 
{ 
    get {return _isInitialEditMapPageLoad;} 
    set {_isInitialEditMapPageLoad = value;} 
} 

//EXAMPLE 2: accessor method with a conditional test 
private static bool _isInitialEditMapPageLoad; 
public static bool isInitialEditMapPageLoad 
{ 
    get 
    { 
     if (currentSession[isAuthorizedUseder] == null) 
      return false; 
     else 
      return _isInitialEditMapPageLoad;  
    } 
    set {isInitialEditMapPageLoad = value;} 
} 


//EXAMPLE 3: just a get accessor method - is this the same as EXAMPLE 4? 
private static bool _isInitialEditMapPageLoad = false; 
public static bool isInitialEditMapPageLoad 
{ 
    get {return _isInitialEditMapPageLoad;} 
} 


//EXAMPLE 4: simple method 
private static bool _isInitialEditMapPageLoad = false; 
public static bool isInitialEditMapPageLoad 
{ 
    return _isInitialEditMapPageLoad;  
} 
+6

示例2您有一個計算器錯誤;)和示例4不正確 – Gregoire 2010-08-09 21:29:48

+0

可能重複[C# - 何時使用屬性而不是函數](http://stackoverflow.com/questions/1374273/c-when-to - 使用屬性 - 而不是功能),其中很多。 – Rob 2010-08-09 21:37:17

+0

沒有看到..好。 – David 2010-08-09 21:38:28

回答

3

1:這是一個簡單的屬性,可以以與公共字段大致相同的方式使用。如果您有理由將getset操作暴露給其他用戶(即其他類),並且您不需要任何幻想,就是這樣。這也可以用「自動性」寫的,

public static bool isInitialEditMapPageLoad {get;set;} // behaves just like example 1 

汽車道具都快得多寫,在我看來是遠遠超過了完整的聲明更具可讀性(如果我看到有一個支持字段一個完整的聲明,我期望找到一些複雜性)。

2:這顯示了屬性的原因之一:使用一些邏輯來返回一個值,而不是總是直接返回一個值。有人可以設置這個價值,因爲他們會隨時隨地公開領域。他們可以隨時獲得價值,同時注意false意味着這不是初始加載或用戶未被授權 - 也就是說,某些(簡單)邏輯在返回值之前完成。

3:這表現爲公共領域只爲閱讀 - 有人可以檢索的價值,但沒有設置它。這本質上是一個只讀取外部代碼的值(不要與readonly關鍵字混淆)

4:導致我編譯錯誤。假設這應該是一個方法聲明,那麼手動定義一個getter就像Java一樣,那麼它就類似於例3。我相信還有其他一些問題會導致這種情況不盡相同,例如,如果您想將其變成依賴項屬性等等。不幸的是,我在該領域的知識很短。

==========

一般情況下,用戶屬性來限制類的數據訪問。作爲一個原則,任何可以阻止其他代碼接觸的東西都應該保持這種方式。實際上,您希望能夠設置類的值來改變它們的顯示方式,修改表示的數據等等。使用屬性來保持對這種交互的最大控制。

如果其他類需要查看類中的某些內容,則需要公開一個getter,而不是setter。除非使用編寫自定義getter方法的Java方法,否則這不適用於字段。他們還允許您在返回或設置數據之前執行計算或驗證。例如,如果您有一些整數值應該在某個範圍內(根據您的對象狀態,甚至可以更改該範圍),在您的setter中,您可以檢查以確保在實際更新值之前滿足此條件。

儘量避免將所有事情都設置爲自動駕駛儀的陷阱 - 這與將所有事情公諸於衆不同。儘可能保持私密。除非必要,否則不得使用吸氣劑,除非必要,否則不得使用吸盤劑,並且在適當情況下,接受器之前,吸盤人應執行驗證輸入所需的任何小邏輯。也就是說,避免另一個陷阱:在getter/setter中放置大量代碼。如果它只需要幾行代碼,那麼你可能應該創建一個方法而不是一個屬性,僅僅是因爲它向使用你的代碼的其他人提供了一個更大的提示,即將發生一些重大事件。

8

你的getter/setters應該是你的類的公共接口。

作爲一個經驗法則,你的所有成員應爲私有,除了你希望人們能夠訪問你的類以外的什麼,你永遠不希望如果你的類的私有變量被外界直接訪問

下面是一個簡單的例子。說你有一門課,你需要一個age變量。在這種情況下,您可以在setter中執行驗證,而無需外部類需要知道該值是否經過驗證。

class Person { 
    int age = 0; 

    public int Age { 
    get { return age; } 
    set { 
     //do validation 
     if (valid) { 
     age = value; 
     } 
     //Error conditions if you want them. 
    } 
    } 

    //More getters/setters 
} 
5

getter/setter方法背後的理由是保護類從當用戶在一個無效的方式改變一個場被打破,它們允許你改變你的類的實現,同時使公衆公開的屬性不變。

除非你需要某種驗證或延遲加載的屬性,那麼你通常可以使用自動屬性。

public string Name { get; set; } 
2

和其他人一樣,當你希望對象成員可用於其他對象時,使用getters/setters。

此外,使用自動屬性可以提高yoru代碼的可讀性(如果您使用的是.NET 2.0或更高版本)。您擁有的示例將如下所示:

// example 1 
public static bool IsInitialEditMapPageLoad { get; set; } 

// example 3/4 - note that false is the default for bools 
public static bool IsInitialEditMapPageLoad { get; private set; } 

由於驗證邏輯在那裏,因此示例3可能保持不變。

相關問題