使用公共属性进行内部和公共使用还是将其分开?

时间:2012-09-06 21:58:42

标签: c# asp.net .net

我想使用带有自动属性的干净且编码较少的类。所有物业都是公共的。在同一个类中的方法内部,我也使用了这些属性。因此,我认为这种方法是可混合的,因为我使用公共属性进行内部使用和公共使用。对于像这样的情况,最好的方法是什么?在方法中使用私有成员并为公共使用创建属性或在类中使用public(或某些特殊情况私有)属性?

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;
    }
}

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

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

自动属性getter的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

带有支持字段的属性getter的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

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

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

简而言之,第一种情况还可以。

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

答案 4 :(得分:0)

  

Getters和Setters被高度重用。     我已经看到数百万人声称公共领域是邪恶的,所以他们将它们变成私人的,并为所有人提供吸气剂和制定者。我相信这几乎与使字段公开相同,如果您使用线程(但通常不是这种情况)或者您的访问者具有业务/表示逻辑(至少是“奇怪的”),可能会有所不同。我并不赞成公共领域,而是反对为他们每个人制作一个getter / setter(或Property),然后声称这样做是封装或信息隐藏......哈!   作者:Pablo Fernandez ref: this and 19 other controversial programming opinions

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