C# 用私有属性替换类中的每个字段是一种不好的做法吗?

C# 用私有属性替换类中的每个字段是一种不好的做法吗?,c#,properties,coding-style,naming-conventions,conventions,C#,Properties,Coding Style,Naming Conventions,Conventions,我倾向于使用私有属性而不是私有字段,因为它们可以在必要时进行扩展,所以我的大多数模型类如下所示: public class MyClass { public MyClass(string name) { this.Name = name; } private string Name { get; set; } private ISomeInterface SomeInterface { get; set; } private b

我倾向于使用私有属性而不是私有字段,因为它们可以在必要时进行扩展,所以我的大多数模型类如下所示:

public class MyClass
{
    public MyClass(string name)
    {
         this.Name = name;
    }

    private string Name { get; set; }
    private ISomeInterface SomeInterface { get; set; }
    private bool IsSomething { get; set; }

    public void Method(int parameter) { ... }
}
换句话说,我通常用私有属性替换私有字段。即使在类上下文中,也使用属性,而不是字段。其中大多数是自动属性。我经常发现我的类根本没有私有字段(好吧,只有自动属性的自动支持字段)

如果您想更改行为(字段不允许这种灵活性),我发现这很有用

我想知道这是一个坏习惯

  • 如果这是一种不好的做法:为什么
  • 如果不是:你认为我应该在类中使用“this”关键字来提高易读性吗

谢谢

这可能是一个偏好问题,但我不喜欢使用私有属性而不是私有字段:

  • 有一条非常有用的原则,规定不要做将来可能有用的事情。通常,类不应该像巨大的怪物一样,当你们需要时,你们可以很快地将字段包装成属性
  • 它是内部类实现的一部分,您可以随时更改它,而不会破坏类的客户端(公共属性和字段的情况非常不同-通常使用属性更好,即使您现在不需要一些额外的逻辑)
  • 正如@dcastro所指出的,可能不会对性能造成任何影响,但如果没有编译器优化,私有字段的性能会比属性(即方法)更好
  • 命名。我喜欢用下划线命名私有字段,例如
    \u name
    ,这样可以快速区分类的私有成员和公共成员

有时,当我需要在设置某个变量时执行一些附加操作,或者基于其他值计算值,或者延迟加载值时,我会使用私有属性。但当我使用时,我清楚地看到那里发生了一些事情。这是非常有用的。如果所有字段都是属性,我就不会有这个提示。

据我所知,如果你有合理的理由这么做,当然,这是可以接受的。为了正确起见,将所有“变量”的实例重命名为“字段”。我似乎可以接受,但恐怕我在这里违反了一些规则。我希望有人能告诉我这是否会导致我的问题,或者如果这种做法被忽视了。你认为什么是“灵活性”?我认为实施你可能永远不会使用的东西是不好的做法,但我是谁。Eric Lippert有一个很好的答案。但是,我同意Sergey Berezovskiy的观点,如果你只需要数据的和平,最好使用字段。但是有时候在Lippert展示的例子中,有属性是很有用的。根据你的第三点:好吧,对自动实现的属性的调用很有可能是内联的。我看不出两者之间有什么关系。它是否是内部实现的一部分与它是否是一个好主意无关。对于第二种情况,YAGNI只做了这么多——普通的实现(比如参数的默认值、字段与属性的默认值等)可以走任何一条路。正如@ DCASTROO为第三所说的。“DCASTROO同意(实际上我只考虑当我有问题时的表现),但它也是值得注意的事情。here@SergeyBerezovskiy问题是关于私有财产。公共API不会改变。@SergeyBerezovskiy-是的,当它们是公共的时候,它很重要,但我们特别讨论的是私有实现。的确,你可以在不破坏任何东西的情况下改变它,但这与它是好主意还是坏主意无关。类似地,对于YAGNI来说,选择将其实现为属性以备将来需要向getter/setter添加更多内容(而不是字段)是非常琐碎的,因此YAGNI与此无关。基本上,你的建议是好的,但与你想表达的观点完全无关。