私人套装或私人会员?

时间:2011-03-01 21:26:09

标签: c#

我想知道什么被认为是C#最佳实践,私人/受保护的成员与公共吸气者,或公共吸气者与私人/受保护的制定者?

       public int PublicGetPrivateSetter
       {
            get;
            private set;
        }

        private int _privateMember;

        public int PublicGetPrivateMember
        {
            get { return _privateMember; }
        }

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

我找不到什么是最佳做法,或者即使一个被认为比另一个更好。从我所看到的通常80%的时间(从我看到的代码)人们不使用私人制定者...我不确定这是因为人们不知道私人制定者,或者因为它是被认为更好地实际使用私人成员。

编辑:

实际上,我在使用私有成员时忘记的其他好处是默认值和readonly的使用。

7 个答案:

答案 0 :(得分:33)

我更喜欢使用自动实现的属性,除非默认实现不能达到我想要的效果。因此,在这种情况下,由于自动实现的属性可以满足您的需要,只需使用:

public int Foo { get; private set; }

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

private readonly int foo;

public int Foo
{
    get { return foo; }
}

答案 1 :(得分:0)

我没有意识到最好的做法。我知道自动属性主要是为了使代码生成和LINQ相关的东西更容易。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

私人制定者没有任何问题。在大多数情况下,它与auto属性一起使用,使属性只读取在对象范围之外。

答案 4 :(得分:0)

概念性地说,它不会改变任何东西。这主要是品味问题。

我个人使用私有的setter因为我很懒,并且使用了propg代码段。 (支持标签选项卡)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

在我看来,在最终编译代码中没有最佳实践和很少(如果有)差异,它实际上只取决于您的需求或喜欢/不喜欢。如果您遵循小组的命名标准和满足要求(例如,不需要传播更改通知),那么它应该无关紧要。

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

然而,我仍然喜欢私人制定者。但我们通常不使用自动实现的属性,因为我们的setter通常具有更丰富的功能 - 例如属性更新通知,日志记录等