【问题标题】:WriteOnly Property or Method?WriteOnly 属性或方法?
【发布时间】:2010-09-24 06:56:47
【问题描述】:

是否存在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”属性。

【问题讨论】:

    标签: c# .net vb.net coding-style


    【解决方案1】:

    我认为属性表示可以是只读或读/写的东西。只写属性的行为并不明显,因此我避免创建它们。

    例如,在视图的下拉列表中设置值列表并访问所选项目:

    public interface IWidgetSelector
    {
      void SetAvailableWidgets(string[] widgets);
    
      string SelectedWidget { get; set; }
    }
    

    比以下更有意义:

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

    【讨论】:

      【解决方案2】:

      不管怎样,微软框架设计指南(体现在他们的 FxCop 工具中)不鼓励只写属性,并将其标记为 API 设计问题,因为这种方法不直观。

      【讨论】:

        【解决方案3】:

        我怀疑是否有正确的选择。这是一个品味问题。

        在这两种情况下,您都会丢失一些封装。使用该方法或属性的开发人员需要了解有关内部实现的一些信息才能理解结果。因此,我会尽可能避免使用它们,否则会谨慎使用它们。

        对我来说,Properties 建议与具有可能访问规则的私人成员建立紧密链接。如果您只是设置一个安全的私有成员,我会使用一个属性:

        public string Password { set; }
        

        如果你的系列影响了几个成员,我会采用这种方法。比如:

        public void SetToRunMode(object[] runvars);
        

        最重要的是一致性。

        【讨论】:

          【解决方案4】:

          我同意你的预感:使用方法。正如您从其中一些答案中看到的那样,只写属性的想法有点奇怪。 SetInternalDataProperty() 更容易理解——最终,这是一个问题,即哪种方法会造成最少的混乱。我会跟着你的直觉走。

          【讨论】:

            【解决方案5】:

            但是我看到 .Net Framework 本身使用 ReadOnly 属性,首先想到的是:

            System.Net.Mail.MailMessage.To
            

            你必须调用一个方法来写入:​​

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

            【讨论】:

              【解决方案6】:

              只是另一个想法:
              属性应该感觉和味道与字段相同。您无法创建只写的字段。 ReadWrite 是可能的,ReadOnly (const) 是可能的,但不是 WriteOnly。 不一致很糟糕 [tm]

              【讨论】:

                【解决方案7】:

                这是我在 XNA 项目中使用的代码的示例。如您所见,Scale 是只写的,它很有用且(相当)直观,读取属性 (get) 对它没有意义。当然可以用方法代替,但我喜欢这种语法。

                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...
                      }
                

                【讨论】:

                  【解决方案8】:

                  根据代码分析规则CA1044:

                  Get 访问器提供对属性的读取访问权限,而 set 访问器提供写入访问权限。

                  设计指南禁止使用只写属性。这是因为让用户设置一个值然后阻止用户查看该值不会提供任何安全性。此外,如果没有读取权限,则无法查看共享对象的状态,这限制了它们的实用性。

                  为属性添加一个 get 访问器。

                  或者,如果只写属性的行为是必要的,考虑将此属性转换为方法。

                  详情请咨询http://msdn.microsoft.com/en-us/library/ms182165.aspx

                  【讨论】:

                    猜你喜欢
                    • 2013-07-11
                    • 1970-01-01
                    • 2013-03-04
                    • 2014-12-04
                    • 2012-11-08
                    • 1970-01-01
                    • 2011-07-12
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多