3

我想使用具有自动属性的干净且编码较少的类。所有属性都是公开的。在同一类的方法中,我也使用了该属性。所以,我认为这种方法是可混搭的,因为我将公共属性用于内部使用和公共使用。在这种情况下最好的方法是什么?在方法中使用私有成员并为公共使用创建属性或在类中使用公共(或在某些特殊情况下为私有)属性?

public class Account
{
     public int Count {get; set;}

     private int Calculate()
     {
         return Count * Count;
     }
}

或使用类似的东西

public class Account
{
     private int _count;
     public int Count {
        get
        {
            return _count;
        } 
        set
        {
            _count = value,
        }
     }

    private int Calculate()
    {
        return _count * _count;
    }
}
4

5 回答 5

2

第一种方式非常好,因为它实际上是你用第二种方式写的。但是,当您需要向 getter 或 setter 添加其他代码时要小心。

于 2012-09-06T22:01:32.323 回答
2

在内部和外部使用公共属性是完全可以接受的,特别是如果它是一个自动属性,因为您的属性中没有逻辑。而且我认为这是首选方法,因为它是更简洁的代码。

顺便说一句:编译代码时会创建一个支持字段,因此两个示例的 IL 代码是相同的。因此,自动属性只是设计时开发人员的可用性功能。

自动属性获取器的 IL 代码...

.method public hidebysig specialname instance int32 
    get_Count() cil managed
{
  .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) 
  // Code size       11 (0xb)
  .maxstack  1
  .locals init (int32 V_0)
  IL_0000:  ldarg.0
  IL_0001:  ldfld      int32 ConsoleApplication1.Program::'<Count>k__BackingField'
  IL_0006:  stloc.0
  IL_0007:  br.s       IL_0009
  IL_0009:  ldloc.0
  IL_000a:  ret
} // end of method Program::get_Count

具有支持字段的属性获取器的 IL 代码...

.method public hidebysig specialname instance int32 
    get_Count() cil managed
{
  // Code size       12 (0xc)
  .maxstack  1
  .locals init ([0] int32 CS$1$0000)
  IL_0000:  nop
  IL_0001:  ldarg.0
  IL_0002:  ldfld      int32 ConsoleApplication1.Program::_count
  IL_0007:  stloc.0
  IL_0008:  br.s       IL_000a
  IL_000a:  ldloc.0
  IL_000b:  ret
} // end of method Program::get_Count
于 2012-09-06T22:02:57.017 回答
2

我认为第一种方法更可取。您公开的是一个概念,而不是一个简单的变量,这意味着您可以在以后轻松更改该概念的定义,而无需更改使用代码。

实际上,我希望有一种方法可以使字段仅对需要​​它们的属性可访问,以明确避免第二种情况。

于 2012-09-06T22:05:04.787 回答
0

在这里看不到问题,我的意思是在public内部使用属性。众所周知,属性在字段方面引入了一些非常小的开销,但在99.99%某些情况下它是无关紧要的,所以我认为它在这里并不重要。

总之,第一种情况是可以的。

还要从 TDD 设计的角度考虑这一点。如果您要测试public成员(根据 TDD 的最佳实践),您也可以测试对“内部”功能的影响。

于 2012-09-06T22:02:43.337 回答
0

Getter 和 Setter 被过度使用。我见过数以百万计的人声称公共领域是邪恶的,所以他们将它们设为私有并为所有人提供 getter 和 setter。我相信这与公开字段几乎相同,如果您使用线程(但通常不是这种情况)或者如果您的访问器具有业务/表示逻辑(至少“奇怪”),可能会有所不同。我不赞成公共领域,但反对为他们每个人制作一个getter/setter(或属性),然后声称这样做是封装或信息隐藏......哈!巴勃罗·费尔南德斯(Pablo Fernandez)参考:这个和其他 19 个有争议的编程观点

为了解决这个问题,我两种都用过,第一个选项是最简单的。当属性 getter/setter 中出现一些副作用时,这个问题就更难回答了。一个典型的例子是引发事件以指示属性已更改。这是在课堂内和外部请求中都可能发生的事情吗?在这种情况下,使用属性而不是支持变量将给出一致的行为。所以最好的答案是取决于:-)

于 2012-09-07T02:22:27.223 回答