【问题标题】:Private Set or Private member?私人套装还是私人会员?
【发布时间】:2011-07-06 20:13:12
【问题描述】:

我想知道什么是 C# 最佳实践,私有/受保护成员与公共 getter,或公共 getter 与私有/受保护 setter?

       public int PublicGetPrivateSetter
       {
            get;
            private set;
        }

        private int _privateMember;

        public int PublicGetPrivateMember
        {
            get { return _privateMember; }
        }

我觉得在您的代码中使用私有成员更明确,因为它是私有设置器(使用命名约定)。 另一方面,使用私有设置器可以让您选择使用虚拟(受保护),编写更少的代码,减少错误空间,并且可以让您在以后需要时添加副作用。

我找不到什么被认为是最佳做法,或者即使一个被认为比另一个更好。根据我所见,通常 80% 的时间(根据我所见的代码)人们不使用私有设置器...我不确定这是因为人们不了解私有设置器,还是因为它是被认为更好地实际使用私有成员。

编辑:

确实,使用私有成员时我忘记的其他好处是默认值和只读的使用。

【问题讨论】:

    标签: c#


    【解决方案1】:

    我更喜欢使用自动实现的属性,除非默认实现不能满足我的要求。所以在这种情况下,由于自动实现的属性可以满足您的需要,只需使用它:

    public int Foo { get; private set; }
    

    但是另一种情况是,如果您想将字段设置为readonly(意味着可以设置字段的唯一位置是在构造函数中)。然后您需要定义支持字段并将其标记为只读,因为自动实现的属性不支持:

    private readonly int foo;
    
    public int Foo
    {
        get { return foo; }
    }
    

    【讨论】:

    • 使用私有支持字段的另一个好处是属性更改通知器,实现 INotifyPropertyChanged。在这种情况下,您可能也需要限制 setter。在这种情况下,我通常有一个带有公共属性的私有字段和一个私有设置器。在 setter 中,我调用 NotifyPropertyChanged 事件。
    • 但如果它是readonly,有理由不将其设为公共成员吗? (pulic readonly int foo;)
    【解决方案2】:

    据我所知,没有最佳实践。我知道自动属性主要是为了让代码生成和 LINQ 相关的东西变得更容易。

    对我来说,我从自动属性开始,如果需要,稍后再进行重构。根据需要,我可能会像您提到的那样将某些内容更改为虚拟或受保护,或者重构以使用变量(当我想重构 set 访问器以具有一些逻辑时。

    【讨论】:

      【解决方案3】:

      同样的道理。在第一个示例中,编译器生成后备存储。在第二个中,您生成了后备存储。由于实现是类内部的,因此将一个重构为另一个并不是什么大问题。像 Resharper 这样的工具使这变得微不足道。您可能没有看到那么多私有 setter 的原因是它是 C# 3.0 的一个特性。

      【讨论】:

      • 自动实现的属性通常是 C# 3.0 的特性。
      【解决方案4】:

      私人二传手没有错。在大多数情况下,它与自动属性一起使用,以使该属性在对象范围之外只读。

      【讨论】:

      • 但如果您使用自己的支持字段,则与 readonly 关键字不同。
      【解决方案5】:

      从概念上讲,它不会改变任何东西。这主要是口味问题。

      我个人使用私人二传手,因为我很懒,经常使用propg sn-p。 (属性标签标签)

      另外,大多数时候我最终都会设置脏标志并将事件绑定到这些属性,所以我不妨现在就做一部分工作。如果您以后需要添加一个 setter,那么如果编写代码时不使用后面的成员,因为它会更容易更改代码。

      【讨论】:

        【解决方案6】:

        这个问题没有很好的答案。最好的做法是遵循我们的公司命名法,如果你一个人,那么你喜欢的方式

        【讨论】:

          【解决方案7】:

          在我看来,在生成的编译代码中没有最佳实践并且几乎没有(如果有的话)差异,这实际上仅取决于您的需求或自己的喜欢/不喜欢。如果您遵循小组的命名标准并满足要求(例如,不需要传播更改通知),那么这无关紧要。

          私有字段的一个优点是您可以在与声明相同的位置定义默认值。在自动实现的属性中,如果它不是 null 或类型的默认值,您必须在构造函数中定义默认值。

          但是,我仍然喜欢私人二传手。但是我们通常不使用自动实现的属性,因为我们的设置器通常具有更丰富的功能 - 例如属性更新通知、日志记录等。

          【讨论】:

            猜你喜欢
            • 2010-10-15
            • 1970-01-01
            • 1970-01-01
            • 2012-03-30
            • 2011-06-15
            • 2021-05-27
            • 2010-11-20
            • 2022-11-14
            • 2011-08-07
            相关资源
            最近更新 更多