28

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

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

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

4

6 回答 6

26

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

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

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

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

于 2008-11-07T05:47:15.763 回答
10

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

当您直接进入私有字段时,您知道该字段被设置为您所说的内容。

当您浏览该属性时,该值会根据设置器逻辑进行设置,因此您可以获得任何您想要的业务规则或验证,而不是分配给该字段的值。

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

于 2008-11-07T05:42:10.313 回答
1

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

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

class Test {
   private int _checksum = -1;
   private int Checksum {
      get {
         if (_checksum == -1)
            _checksum = calculateChecksum();
         return checksum;
      }
   }
}
于 2008-11-07T05:49:30.080 回答
0

我认为这纯粹是偏好。

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

class Foo {
    public string Value { get; set; }

    public void Write() {
        Console.Write(Value);
    }
}
于 2008-11-07T05:43:53.023 回答
0

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

private int mVariable;
private int _Variable;

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

于 2008-11-07T05:46:01.443 回答
0

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

  1. 便于使用。在 Visual Studio 中,您可以使用“Prop Tab Tab”。您将获得属性片段
  2. 属性是可以像数据成员一样访问的语言元素
  3. .NET 框架类使用它,.NET 框架中的数据绑定代码类支持属性,
  4. 属性具有方法的所有语言特性。属性可以是虚拟的
于 2008-11-07T05:51:23.210 回答