代码之家  ›  专栏  ›  技术社区  ›  Sarah Vessels

C保护字段到私有,添加属性——为什么?

  •  5
  • Sarah Vessels  · 技术社区  · 15 年前

    在Visual Studio 2008团队系统中,我只是在我的一个C项目上运行代码分析(从“分析”菜单)。产生的警告之一是:

    Microsoft.Design:由于字段“connection.\u domain”在其声明类型之外可见,请将其可访问性更改为private,并添加一个与字段当前具有相同可访问性的属性,以提供对它的访问。

    它指的是以下字段:

    public abstract class Connection
    {
        protected string _domain;
    }
    

    我不明白这个建议背后的理由。这就是我想让我做的:

    public abstract class Connection
    {
        private string _domain;
        protected string Domain { get { return _domain; } set { _domain = value; } }
    }
    

    两个问题:

    1. 我是否正确理解了建议,代码方面的要求?
    2. 为什么要我这么做?
    8 回复  |  直到 15 年前
        1
  •  13
  •   Gary McGill    15 年前

    是的,我认为你理解正确-尽管在C的较新版本中,有一种更简洁的方式来写它:

    public string Domain { get; set; }
    

    为什么?这都是关于封装的。如果按照它的建议进行操作,您可以稍后更改域属性的定义,而不影响使用该属性的任何调用代码。因为您的类是公共的,并且可能被您没有编写的代码调用,所以这可能非常重要。

        2
  •  2
  •   Wim    15 年前

    是的。这就是建议。您不应该有任何高于私有的可访问性作为直接实例字段公开。

    它是OOD封装的主要原则之一,也称为“数据隐藏”。

        3
  •  2
  •   Bob    15 年前
    1. 是的,您的确按代码纠正了问题。
    2. 它是关于封装的。 _domain 是关于对象的数据。您应该为客户机提供一个接口,让他们访问它,而不是直接公开它,这样任何客户机都可以进行未过滤的访问。实际上,这可能是在向setter添加验证,以便它不能设置为任何值。如果你是唯一一个编写代码的人,这可能看起来很愚蠢,因为你知道你的API是如何工作的。但是,试着在大型企业级考虑问题,最好有一个API,这样你的对象就可以被看作是一个包含任务的框。您可能会说,您将永远不需要向该对象添加验证之类的东西,但是这样做是为了保持它的可能性,也是为了保持一致性。
        4
  •  2
  •   Rob Walker    15 年前

    你的翻译是正确的。对于使用“protected”属性,可以使用与使用“public”属性相同的参数,而不是直接公开成员变量。

    如果这只会导致简单的getter和setter的激增,那么我认为对代码可读性的损害超过了将来能够更改代码的好处。随着C中编译器生成属性的开发,这并不是很糟糕,只需使用:

    protected string Domain { get; set; }
    
        5
  •  2
  •   GraemeF    15 年前

    这是因为,如果将来希望将字段更改为属性,则会破坏依赖它的任何其他程序集。

    最好的做法是保持所有字段都是私有的,并将它们包装在属性中,这样以后就可以选择添加验证或其他逻辑,而不必重新编译类的所有使用者(或者在本例中是继承者)。

        6
  •  0
  •   Freddie    15 年前

    为了回答你的问题…对。

    但是,我只使用自动属性语法:

    public abstract class Connection
    {
        protected string Domain { get; set; }
    }
    
        7
  •  0
  •   Ragepotato    15 年前

    基本上,属性提供的不仅仅是返回或设置成员。它们允许您添加逻辑来验证正确的输入格式、范围验证等。

    从链接中选择的答案是最好的,“属性提供封装。您可以在属性的代码中封装任何需要的验证/格式化/转换。这对于田地来说是很难做到的。”

    http://social.msdn.microsoft.com/Forums/en-IE/netfxbcl/thread/985f4887-92ae-4ec2-b7ae-ec8cc6eb3a42

        8
  •  0
  •   Joel Mueller    15 年前

    除了这里提到的其他答案外,以下划线开头的公共/受保护成员 CLS-compliant ,因为.NET语言不需要支持带前导下划线的成员,因此从您的类继承的其他.NET语言的成员可能无法访问该特定的受保护成员。

    我知道,它可能不适用于您,但它可能是代码分析警告的部分原因。

    推荐文章