最佳实践:访问器属性或无参数方法?

max*_*axp 2 .net c# oop properties accessor

哪种更好的做法,为什么?

bool IsTodayMonday { get { return DateTime.Now.DayOfWeek == DayOfWeek.Monday; } }
Run Code Online (Sandbox Code Playgroud)

要么

bool IsTodayMonday()
{
    return DateTime.Now.DayOfWeek == DayOfWeek.Monday;
}
Run Code Online (Sandbox Code Playgroud)

Raz*_*zie 10

在我看来,在这些情况下使用属性,除非:

  • 该调用很昂贵,例如正在进行数据库调用
  • 调用属性时会产生副作用,例如也会设置其他变量
  • 多次调用属性会产生不同的结果
  • 您的属性仅用于设置值

在你的例子中,我会选择一个属性.


360*_*alk 7

对我来说 - 在这种特殊情况下 - 根本不重要.

如果您查看生成的IL代码,您会发现它完全相同.该属性将导致创建一个生成相同IL代码的方法.

关于.Net实现,您应该使用该属性.当没有使用参数时,.Net框架使用IsXXX-Functionality的属性,否则它使用方法,除非其他一些事情表明使用方法更合适.(有关此示例,请参阅上面的帖子)

这是两个版本生成的IL-Code,如果你感兴趣的话(我使用了一个简单的控制台应用程序和静态方法/属性)

{
  // Code size       22 (0x16)
  .maxstack  2
  .locals init ([0] bool CS$1$0000,
           [1] valuetype [mscorlib]System.DateTime CS$0$0001)
  IL_0000:  nop
  IL_0001:  call       valuetype [mscorlib]System.DateTime [mscorlib]System.DateTime::get_Now()
  IL_0006:  stloc.1
  IL_0007:  ldloca.s   CS$0$0001
  IL_0009:  call       instance valuetype [mscorlib]System.DayOfWeek [mscorlib]System.DateTime::get_DayOfWeek()
  IL_000e:  ldc.i4.1
  IL_000f:  ceq
  IL_0011:  stloc.0
  IL_0012:  br.s       IL_0014
  IL_0014:  ldloc.0
  IL_0015:  ret
} // end of method Program::get_IsTodayProp
Run Code Online (Sandbox Code Playgroud)

干杯!

  • 我想你错过了重点?我认为问题在于属性和方法为类的用户提供了什么线索,而不是语言允许的线索。 (2认同)

Jas*_*ams 6

属性应该是值的一个相当简单的包装器.对于属性的用户,它应该像变量一样.

如果它做了任何工作,有副作用(例如读/写它改变你的类中的其他状态),或者如果它可能失败(例如抛出异常),那么最好将它写为Get方法,这样调用者可以看到它不仅仅是一个简单的值.

除此之外,更多的是个人偏好(你是否认为属性应该只代表具体的成员变量,或者它们是否可以用于读取"计算值",例如你的例子中的那个).