【问题标题】:Should you access a variable within the same class via a Property?您是否应该通过属性访问同一类中的变量?
【发布时间】:2010-09-21 05:48:50
【问题描述】:

如果您有一个获取并设置为实例变量的属性,那么通常您总是使用该类外部的属性来访问它。

我的问题是你是否也应该在课堂上也经常这样做?如果有一个属性,我总是使用该属性,即使在课堂上也是如此,但我想听到一些关于哪个是最正确的以及为什么最正确的论点。

还是只是项目中使用的编码标准问题?

【问题讨论】:

    标签: c# variables properties


    【解决方案1】:

    这取决于您是否要应用在属性设置器中实现的任何逻辑,因此您必须根据具体情况做出决定。

    当您直接进入私有字段时,您知道该字段被设置为与您所说的完全一致。

    当您浏览该属性时,值会根据设置器逻辑设置,因此您可以通过分配给该字段的值获得所需的任何业务规则或验证。

    很难想出一个规则来说明何时做任何一个都是“正确的”,我要说我遵循的唯一一个规则是在构造函数初始化中我几乎永远不会使用该属性。

    【讨论】:

    • 好点。如果您想绕过属性中的逻辑,请使用该字段。
    【解决方案2】:

    我认为这纯粹是偏好。

    不过,我发现自己在 C# 3.0 中更多地使用属性,并支持自动属性:

    class Foo {
        public string Value { get; set; }
    
        public void Write() {
            Console.Write(Value);
        }
    }
    

    【讨论】:

    • 自动属性是一个有趣的问题——我喜欢它们,因为它可以稳定界面,但无法猜测它们如何影响使用类内部的属性。他们是否或多或少地让我错过了可能会搞砸的二传手逻辑,还是一样?
    • 根据定义,自动属性没有设置器逻辑,因此它们在功能上等同于成员变量。不同之处在于,稍后您可以根据需要更改实现并引入 setter 逻辑。
    • 是的,我知道,我想知道的是自动属性(并且总是使用它们)是否意味着在实现 setter 逻辑时,它更有可能被忽略并导致问题。不是技术问题,只是“什么可能导致我犯愚蠢的错误?”的问题
    【解决方案3】:

    通常取决于项目编码标准,我在私有类属性的名称前使用“_”或“m”。 (如下所示)

    private int mVariable;
    private int _Variable;
    

    对于变量前面的那些,我立即意识到我正在处理类的内部变量。然后当涉及到以后自己或其他人调试时,可以立即识别代码正在处理内部私有变量并进行调整。所以它归结为我的可读性。

    【讨论】:

    • _ 我相信它们不符合 CLS
    • @Selfinflicted CLS 合规性仅适用于公开可见的字段/方法/等。即使 CLS 合规性确实适用,当您在发布模式下构建时,内部字段名称也会被删除,因此没有理由会很重要。
    【解决方案4】:

    通过属性访问本地(类范围)变量的一个更强有力的论据是您在类中添加了一个抽象级别。如果您更改有关该字段存储方式的任何逻辑,则其余代码将不受影响。

    例如,您可以将其从局部变量更改为子对象的属性、数据库调用、Web 服务调用、类的静态属性等等。进行更改时,它会为您提供单点更改,即属性,并且您不必更新类的其余部分,因为它们都使用该属性。

    您还可以使用该属性对属性的值应用业务规则,而不必在您直接访问该字段的每个位置强制执行相同的规则。再次,封装

    随着自动属性的引入,显式使用局部变量的理由就更少了,除非您需要在 get/set 上应用业务规则

    【讨论】:

    • 关于这一点,我真的很想有语言语法来防止直接访问支持字段,即使由于某种原因无法使用自动属性。
    【解决方案5】:

    是的,我认为您应该尽可能在类内部使用属性。属性更灵活,允许您添加逻辑以在中心位置验证其值。

    您还可以将字段的初始化延迟到任何时候使用该属性,而不是在构造函数中强制执行(或使用该字段的任何地方)。示例:

    class Test {
       private int _checksum = -1;
       private int Checksum {
          get {
             if (_checksum == -1)
                _checksum = calculateChecksum();
             return checksum;
          }
       }
    }
    

    【讨论】:

      【解决方案6】:

      总是使用属性,这里有一些原因

      1. 易于使用。在 Visual Studio 中,您可以使用“Prop Tab Tab”。你会得到属性 sn-p
      2. 属性是像数据成员一样访问的语言元素
      3. .Net 框架类使用它,.NET 框架支持属性中的数据绑定代码类,
      4. 属性具有方法的所有语言特征。属性可以是虚拟的

      【讨论】:

      • 我认为你误解了这个问题。
      猜你喜欢
      • 2011-03-27
      • 2011-01-05
      • 2012-02-04
      • 1970-01-01
      • 2018-05-27
      • 1970-01-01
      • 1970-01-01
      • 2012-06-13
      • 1970-01-01
      相关资源
      最近更新 更多