Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否应该通过属性访问同一类中的变量?_C#_Variables_Properties - Fatal编程技术网

C# 是否应该通过属性访问同一类中的变量?

C# 是否应该通过属性访问同一类中的变量?,c#,variables,properties,C#,Variables,Properties,如果您有一个获取并设置为实例变量的属性,那么通常您总是从该类外部使用该属性来访问它 我的问题是,你是否也应该在课堂上这样做?即使在类中,如果有属性,我也会使用它,但我希望听到一些关于哪个属性最正确以及为什么最正确的争论 或者这仅仅是项目中使用的编码标准的问题?这取决于您是否要应用在属性设置器中实现的任何逻辑,因此您必须根据具体情况做出决定 当您直接转到private字段时,您知道该字段正被设置为您所说的内容 当您遍历该属性时,将根据setter逻辑设置该值,因此您可以通过分配给该字段的值获得任何

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

我的问题是,你是否也应该在课堂上这样做?即使在类中,如果有属性,我也会使用它,但我希望听到一些关于哪个属性最正确以及为什么最正确的争论


或者这仅仅是项目中使用的编码标准的问题?

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

当您直接转到private字段时,您知道该字段正被设置为您所说的内容

当您遍历该属性时,将根据setter逻辑设置该值,因此您可以通过分配给该字段的值获得任何业务规则或验证


很难想出一个规则来说明什么时候做这两件事是“正确的”,我唯一要说的是,在构造函数初始化中,我几乎从不使用这个属性。

我认为这纯粹是偏好

尽管如此,我发现自己在C#3.0中使用了更多的属性,并提供了自动属性支持:

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

    public void Write() {
        Console.Write(Value);
    }
}

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


对于变量前面的那些变量,我马上意识到我正在处理一个类的内部变量。然后,当稍后涉及到调试时,我自己或其他人可以立即识别代码正在处理内部私有变量并进行调整。因此,对我来说,这取决于可读性。

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

例如,您可以将其从局部变量更改为子对象的属性、数据库调用、webservice调用、类的静态属性等等。在进行更改时,它会给您一个更改点,即属性,您不必更新类的其余部分,因为它们都使用该属性

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


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

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

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

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

始终使用属性,以下是一些原因

  • 易于使用。在VisualStudio中,可以使用“道具选项卡”。您将获得属性片段
  • 属性是像访问数据成员一样访问的语言元素
  • .Net framework类使用它,.Net framework中的数据绑定代码类支持属性
  • 属性具有方法的所有语言特性。属性可以是虚拟的

  • 说得好。如果要绕过属性中的逻辑,请使用该字段。自动属性是一个有趣的折痕-我喜欢它们,因为它可以稳定接口,但无法猜测它们如何影响类内部属性的使用。它们是否会使我或多或少地错过可能会把事情搞砸的setter逻辑,或者是完全一样的?根据定义,auto属性没有setter逻辑,因此它们在功能上等同于成员变量。不同之处在于,以后您可以更改实现并在需要时引入setter逻辑。是的,我知道,我想知道的是,auto属性(并始终使用它们)是否意味着在实现setter逻辑时,它更容易被忽略并导致问题。这不是一个技术问题,只是一个“什么可能导致我犯一个愚蠢的错误?”的问题,使他们不符合CLSbelieve@SelfinflictedCLS合规性仅适用于公开可见的字段/方法/ect。。即使CLS合规性确实适用,但在发布模式下构建时,内部字段名也会被删除,因此没有任何理由会有问题。在这一点上,我真的很想使用语言语法来防止直接访问支持字段,即使由于某种原因无法使用自动属性。我想你误解了这个问题。
    class Test {
       private int _checksum = -1;
       private int Checksum {
          get {
             if (_checksum == -1)
                _checksum = calculateChecksum();
             return checksum;
          }
       }
    }