【问题标题】:What are the benefits of using properties internally?在内部使用属性有什么好处?
【发布时间】:2011-02-22 12:07:34
【问题描述】:

在从类外部访问成员时,封装显然是有用且必不可少的,但是在内部引用类变量时,调用它们的私有成员还是使用它们的 getter 更好?如果您的 getter 只是简单地返回变量,是否有任何性能差异

【问题讨论】:

  • 试着问你自己这个问题:如果你相信你自己的陈述(我认为你没有理由不应该这样做)“当从课堂外访问成员时,封装显然是有帮助和必要的”然后尝试并提出一个可靠的论据,说明如果您删除了最后四个单词,为什么情况会有所不同。如果你不知道你可以使用相同的参数:)
  • @ChrisF:该线程与这个问题几乎完全无关
  • 删除了一个无关问题的链接。

标签: c# performance properties encapsulation getter


【解决方案1】:

不应该有显着的性能差异,您坚持使用属性的原因是因为这就是封装的全部意义所在。它使这些私有成员的所有访问保持一致和受控。因此,如果您想更改属性 getter/setter,您不必考虑“我是否需要在我决定直接访问私有成员的地方复制相同的功能?”

【讨论】:

    【解决方案2】:

    好处是在对 Get 或 Set 进行验证的情况下。这将在一个地方并且总是被调用。

    据我所知(来自 Stack Overflow 上提出的其他问题),当 Getter 简单地返回生成的代码的值时,与直接访问变量的值相同。

    【讨论】:

      【解决方案3】:

      直接访问字段或使用 getter 通常不会产生很大的不同,除非您的 getter 执行一些延迟初始化或其他处理。所以这取决于 getter 的作用,但我的经验法则是始终使用 getter,除非在特定情况下。

      要为字段分配值,请不要忘记 setter 通常包含验证代码或引发事件。在这种情况下,您应该始终使用 setter。

      【讨论】:

      • +1:这是一个很好的经验法则。普遍倾向于使用私有成员..“我没有在 getter 和/或 setter 中做任何事情..调用方法会很浪费......我只会做一个分配......很酷。” (有罪..我承认)然后你,或者更糟的其他人,向二传手添加了一些验证,然后......砰......你的目标是谁射杀了兔子会议。就像托马斯说的那样……总有一个特殊情况豁免的空间……习惯使用二传手。
      • 无论如何,简单的getter或setter通常被JIT编译器内联,所以直接访问字段甚至不是优化...
      【解决方案4】:

      在大约 98% 的情况下,性能差异可以忽略不计。

      即使您的 getter 或 setter 只是获取或设置您的私有成员,您也应该始终使用属性。这将允许您随着应用程序的发展带来变化。这样做,您将能够在您的属性中引入一些限制或其他一些封装,而不会破坏您的代码。否则,一旦您因为 X 原因决定编写属性,您将发现自己必须重构所有代码以获取或设置属性,而不是您的私有成员。

      【讨论】:

        【解决方案5】:

        我喜欢使用内部属性进行延迟初始化,在属性中确保对象已初始化。这确保我没有使用尚未初始化的类级别变量。

        TestClass1 _class1
        internal TestClass1
        {
        
        get
        {
        
            if (_class == null)
             _class = new TestClass1()
        
            return _class1
        
        }
        
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-02-05
          • 2023-03-14
          • 2011-01-21
          • 1970-01-01
          • 2021-05-16
          • 1970-01-01
          • 1970-01-01
          • 2013-04-15
          相关资源
          最近更新 更多