C# 私有集还是私有成员?

C# 私有集还是私有成员?,c#,C#,我想知道什么是C#最佳实践,私有/受保护成员使用公共getter,或者公有getter使用私有/受保护setter public int PublicGetPrivateSetter { get; private set; } 我觉得在代码中使用私有成员比使用私有setter(使用命名约定)更明确。 另一方面,使用私有setter可以让您选择使用虚拟(受保护)、编写更少的代码、更少的出错空间,并且可以

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

       public int PublicGetPrivateSetter
       {
            get;
            private set;
        }

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

我找不到什么被认为是最佳实践,甚至找不到哪一种被认为比另一种更好。从我看到的情况来看,通常80%的情况下(从我看到的代码来看),人们不使用私有setter。。。我不确定这是因为人们不知道私有setter,还是因为人们认为使用私有成员更好

编辑:


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

我更喜欢使用自动实现的属性,除非默认实现不符合我的要求。因此,在本例中,由于自动实现的属性满足您的需要,只需使用它:

public int Foo { get; private set; }
但是,另一种情况是,如果要使字段
为只读
(这意味着只能在构造函数中设置字段)。然后您需要定义备份字段并将其标记为只读,因为自动实现的属性不支持此操作:

private readonly int foo;

public int Foo
{
    get { return foo; }
}

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


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

这是一样的。在第一个示例中,编译器生成了备份存储。在第二个示例中,您生成了备份存储。由于实现是类的内部实现,所以将一个重构为另一个并不是什么大问题。像Resharper这样的工具使这一点变得微不足道儿子,你可能没有见过太多的私有setter,因为它是C#3.0的一个特性。

私有setter没有什么问题。在大多数情况下,它与自动属性一起使用,使属性在对象范围之外成为只读。

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

我个人使用私有setter是因为我很懒,经常使用
propg
片段


此外,大多数情况下,我都会设置脏标志并将事件绑定到这些属性,因此我最好现在就做一部分工作。如果以后需要添加setter,那么如果编写代码时不使用beggining之后的成员,那么会容易得多,因为更改的代码会更少。

对于这个问题,没有好的答案这是一个问题。最好的做法是遵循我们公司的命名法,如果只有您一个人,那么您喜欢的方式在我看来没有最佳实践,而且很少(如果有的话)结果编译代码的不同之处在于,这实际上取决于您的需要或自己的喜好。如果您遵循组的命名标准并满足要求(例如,不需要传播更改通知),则这不重要

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


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

自动实现的属性通常是C#3.0特性。但如果您使用自己的后台文件,则与
readonly
关键字不同ld.使用私有支持字段的另一个好处是proerty更改通知程序,实现INotifyPropertyChanged。在这种情况下,您可能也需要限制setter的。在这种情况下,我通常有一个带有公共属性的私有字段和一个私有setter。在setter中,我调用NotifyPropertyChanged事件。但是如果它是
只读的
有理由不让它成为公共成员?(pulic readonly int foo;)
private readonly int foo;

public int Foo
{
    get { return foo; }
}