2008-11-27 56 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更多细节