2008-11-27 55 views
7

有沒有一種特定的情況下WriteOnly屬性更有意義,然後一種方法?方法方法對我來說更自然。WriteOnly屬性或方法?

什麼是正確的方法?

使用屬性

Public WriteOnly Property MyProperty As String 
    Set(ByVal value as String) 
     m_myField = value 
    End Set 
End Property 
public string MyProperty 
{ 
    set{ m_myField = value;} 
} 

使用方法

Public Sub SetMyProperty(ByVal value as String) 
    m_myField = value 
End Sub 
public void SetMyProperty(string value) 
{ 
    m_myField = value; 
} 

編輯 只是爲了澄清我指的是「WriteOnly」屬性。

回答

10

我覺得一個屬性表示的東西可以是隻讀或讀/寫。只寫屬性的行爲不明顯,所以我避免創建它們。

舉個例子,設置值的列表,在視圖上的下拉和訪問所選擇的項目:

public interface IWidgetSelector 
{ 
    void SetAvailableWidgets(string[] widgets); 

    string SelectedWidget { get; set; } 
} 

更有意義比:

public interface IWidgetSelector 
{ 
    string[] AvailableWidgets { set; } 

    string SelectedWidget { get; set; } 
} 
11

對於它的價值,微軟框架設計指南(如其FxCop工具中所體現的)由於該方法的不直觀性而不鼓勵只寫屬性並將其存在標記爲API設計問題。

1

我懷疑是否有正確的選擇。這是一個品味問題。

在這兩種情況下,您都會丟失一些封裝。使用該方法或屬性的開發人員需要了解有關內部實現的內容以瞭解結果。因此,我會盡可能避免使用它們,否則請謹慎使用它們。

對於我來說,屬性提示了一個關閉私人會員的可能訪問規則。如果你只是設置一個安全的私有成員,我會使用一個屬性:

public string Password { set; } 

如果您設置的效果幾名成員,我會用方法去。例如:

public void SetToRunMode(object[] runvars); 

最重要的是一致性。

2

我同意你的預感:使用方法。正如你從這些答案中看到的那樣,只寫屬性的想法有點奇怪。 SetInternalDataProperty()更容易理解 - 最終,這是一個問題,哪種方法會造成最小的混淆。我會隨着你的內心而去。

-1

但是我已經看到了。.NET框架本身使用的只讀屬性,出現在腦海的第一個是:

System.Net.Mail.MailMessage.To 

對於您必須調用一個方法來寫:

System.Net.Mail.MailMessage.To.Add(Recipient As String) 
3

只是一種思路:
的屬性應該是感覺和味道一樣,作爲一個字段。您無法創建WriteOnly字段。 ReadWrite是可能的,ReadOnly(const)是可能的,但不是WriteOnly。 不一致是壞[TM]

+0

+1不錯的想法.. – nawfal 2013-04-19 18:55:56

3

這裏是一個例子的代碼我已經在XNA項目中使用。正如你所看到的,規模是隻寫,它是有用的,(合理)直觀和讀取屬性(得到)將是沒有意義的。當然,它可以用一種方法替代,但我喜歡這種語法。

public class MyGraphicalObject 
     { 
     public double ScaleX { get; set; } 
     public double ScaleY { get; set; } 
     public double ScaleZ { get; set; } 

     public double Scale { set { ScaleX = ScaleY = ScaleZ = value; } } 

     // more... 
     } 
0

按代碼分析規則CA1044:

get訪問的讀訪問的屬性和set訪問提供寫訪問。

設計準則禁止使用只寫屬性。這是因爲讓用戶設置一個值然後阻止用戶查看該值不會提供任何安全性。另外,如果沒有讀取訪問權限,則無法查看共享對象的狀態,這限制了它們的實用性。

添加獲取屬性的訪問器。

或者,如果只寫屬性的行爲是必需的,則應考慮將此屬性轉換爲方法。

請參考http://msdn.microsoft.com/en-us/library/ms182165.aspx更多細節