【问题标题】:Public Properties instead of PRIVATE fields公共属性而不是私有字段
【发布时间】:2017-12-09 22:22:18
【问题描述】:

首先只是为了澄清和避免不必要的重复标记,这个问题不是this one 的重复,既不是this other one 的重复,也不是我已经搜索过的其他问题。为什么?他们都在谈论具有经典 C# 的“属性”的 public 字段或私有字段。

我的问题是我为什么要写这样的东西(Public Properties

class myClass{

public int AValue{get; set;}
}

当我可以改写时(私有字段 不涉及任何属性)(只是经典的旧 C++ 风格的写法)

class myClass{
private int aValue;
public int getValue{ return aValue;}
public void setValue(int value){ aValue=value;}

我摸不着头脑,阅读了许多资源、答案和问题,但没有人回答这个问题。他们都在谈论相对于公共领域的优势(我没有问过)或者新的自动属性相对于旧的优势(我也没有问过)。

我想我的问题是为什么 C# 不使用在 Java 或 C++ 中运行良好的相同编写方式。我看不出有什么优势。我非常感谢有人教我这个优势,因为 afaik 没有写在其他任何地方。 (甚至在我的 C# 书籍中都没有)

【问题讨论】:

  • 我建议 Properties 比创建自己的适当方法来完成完全相同的事情更优雅和直观。编写开发平台的标准代码有助于使其更易于维护。然而,这一切只是我的看法。这个问题没有普遍正确的答案,因为任何答案都将主要基于意见。这使得这个问题离题了。
  • 考虑阅读此内容:stackoverflow.com/questions/22900456/…。简而言之,受 VB 影响的 C# 属性是一种语法糖,可以节省击键并避免像 Java 或 C++ 那样经常键入“getX”和“setX”。

标签: c#


【解决方案1】:

据我了解,您所指的公共属性只是包装您上面描述的模式的语法糖。

我猜它归结为可读性和平台标准。虽然您所说的方式没有错,但我们还需要考虑可维护性。对于另一位 .Net 开发人员来说,这种模式不符合他们的习惯并且可能会导致混淆。

还有一个肤浅的原因,只是要编写更多的代码。尤其是当你有像 DTO 这样的东西时。

【讨论】:

  • 我认为 C# 属性很大程度上受 VB 属性定义方式的影响,其中包括访问器 (Property Get) 和修改器 (Property Let/Set) 以及支持字段(例如:stackoverflow.com/questions/31448603/…)。事实上,有一个 value 变量作为 C# 属性中的支持字段,就像 VB 对应的一样。
【解决方案2】:

将c#中的属性进一步封装,最终翻译成私有字段的中间语言和对应的GetSet方法,就不用费心了

【讨论】:

    【解决方案3】:

    自动访问器正是为此而生的语法糖。生成的代码有一个支持字段和 get/set 方法。字段没有访问器,而属性有。

    Public/private 是关于封装/安全性,即谁应该能够访问您的信息。

    【讨论】:

      【解决方案4】:

      以您呈现它的方式(编写getset 方法)很好,但是您有两种方法-一种用于设置字段的值,另一种用于获取该值。使用属性对我来说更自然,因为您将 setget 方法“封装”在一个名称下并以这种方式访问​​它更好(在我看来)。

      【讨论】:

        【解决方案5】:

        使用public int AValue { get; set; } 而不是私有字段以及getAValuesetAValue 对函数的主要原因是这正​​是C# 中的处理方式。从“代码在运行时的作用”的角度来看,这两者与“自动属性”(让编译器负责生成私有支持字段的属性类型)几乎相同。转换成与您编写的代码非常相似的代码(参见this stackoverflow questions accepted answer 示例)。

        在您的问题上下文中的主要“优势”(为什么使用属性而不是字段和 get/set 方法对)是可预测性和可理解性。任何使用您的代码的人都会期望看到属性,而不是私有字段/get/set 实现,因此您的代码将更容易被他们立即理解。看到它以不同的方式实现会让他们质疑为什么,认为这是有原因的,因此在理解您的代码时会减慢他们的速度。

        【讨论】:

          【解决方案6】:

          C# 的 getter 和 setter 是语法糖,它们删除了嘈杂的方法名称(SetValueGetValueValue)并提高了代码的可读性。

          使用代码时可读性更好

          // Without properties
          var myClass = new MyClass();
          myClass.SetAValue(aValue);
          myClass.SetBValue(bValue);
          
          //And with properties
          var myClass = new MyClass 
          {
              AValue = aValue,
              BValue = bValue
          }
          

          因为它只是语法糖 - 每个开发人员/团队都可以随意不使用 它。
          一些团队有“规则”,即属性应该仅用于获取/设置值,而在 getter/setter 中没有任何“重”逻辑。方法应该用于设置或获取执行一些“繁重”操作的值。

          【讨论】:

            猜你喜欢
            • 2018-07-17
            • 1970-01-01
            • 1970-01-01
            • 2010-11-19
            • 2023-04-04
            • 2014-09-09
            • 1970-01-01
            • 2019-04-19
            相关资源
            最近更新 更多