用私有属性替换类中的每个字段是一种不好的做法吗? [复制]

Posted

技术标签:

【中文标题】用私有属性替换类中的每个字段是一种不好的做法吗? [复制]【英文标题】:Is it a bad practice to replace every field in a class with a private property? [duplicate] 【发布时间】:2014-06-25 21:42:30 【问题描述】:

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

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”关键字来提高可读性吗?

谢谢!

【问题讨论】:

据我所知,如果您有合理的理由这样做,当然可以接受。 为了正确起见,将所有“变量”实例重命名为“字段”。 这对我来说似乎可以接受,但我担心我在这里违反了一些规则。我希望有人能告诉我这是否会给我带来问题,或者这种做法是否被忽视。 您认为什么是“灵活性”?我认为实现你可能永远不会使用的东西是不好的做法,但我是谁。 Eric Lippert 有一个很好的回答:***.com/a/3310469/3523746。但是,我同意 Sergey Berezovskiy 的观点,如果你只需要数据,最好使用字段。但有时在 Lippert 展示的情况下,拥有属性很有用 【参考方案1】:

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

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

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

【讨论】:

关于您的第三点:afaik,对自动实现的属性的调用很有可能会被内联。 我看不出其中任何一个是如何相关的。它是否是内部实现的一部分与它是否是一个好主意无关。其次,YAGNI 只能走这么远——琐碎的实现(例如参数的默认值、字段与属性等)可以采用任何一种方式。正如@dcastro 所说的第三个。 @dcastro 同意(实际上我只在遇到问题时才考虑性能),但这也是值得注意的地方 @SergeyBerezovskiy 问题是关于 private 属性的。公共 API 不会改变。 @SergeyBerezovskiy - 是的,当它们公开时很重要,但我们正在专门讨论 private 实现。确实,您可以在不破坏任何东西的情况下对其进行更改,但这与它是一个好主意还是坏主意没有任何关系。同样,对于 YAGNI,选择将其实现为属性以防万一您需要向 getter/setter 中添加更多内容(而不是字段)是如此微不足道,以至于 YAGNI 无关紧要。 基本上,您的建议很好,但与您要提出的观点完全无关。

以上是关于用私有属性替换类中的每个字段是一种不好的做法吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

指向 std::thread 的共享指针是一种不好的做法吗?

JavaScript:动态扩展原型是一种不好的做法吗?

在 ASP.NET Core 中一次生成 100-500 个任务(每个 HTTP 请求)是一种不好的做法吗? [关闭]

抽象类中的私有非抽象成员和继承 C#

const 引用字段作为 C++ 类中的只读属性

匿名函数在 JavaScript 中是一种不好的做法吗?