为什么不从DB读取C#属性getter?

Pro*_*one 8 c# properties

这个问题的一些答案和评论:最简单的C#代码来调查一个属性?,暗示从属性的getter中的数据库中检索数据通常是一个坏主意.
为什么这么糟糕?

(如果您有自己的信息来源,请提及.)


我通常会在第一次"获取"之后将信息存储在变量中以供重用,如果这会影响您的答案.

Fly*_*179 12

因为从数据库中检索数据可能会导致任意数量的异常,并且属性获取者通常不应该抛出异常.

属性getter的预期行为只是返回一个值; 如果它实际上做的远不止于此,它应该是一种方法.

微软的Property Design指南解释了原因:https: //docs.microsoft.com/en-us/dotnet/standard/design-guidelines/property

  • 他们不应该抛出异常的一个原因是因为属性可以是UI中数据绑定的一部分.不过,我确信还有很多其他原因. (3认同)
  • @Protector:您正在深入研究最佳实践的各个方面,这些方法未在MSDN中以与语言语法和对象命名空间相同的方式记录.你可能会在这里找到一些东西:http://stackoverflow.com/questions/1529604/c-antipatterns (2认同)

wom*_*omp 6

这很糟糕,因为(除其他外)它违反了最小惊讶原则.

程序员通常希望属性做简单的获取/设置.在属性中封装数据访问可能会引发异常,导致副作用以及更改数据库中数据的状态,这不是通常所期望的.

我并不是说没有复杂属性的情况 - 有时,它可能是一个很好的解决方案.但是,这不是预期的做事方式.


Dav*_*sky 6

简短版本:使财产获取者直接访问数据库将违反" 关注点分离"原则.

更多细节: 一般而言,属性旨在表示与对象关联的数据,例如对象的FirstName属性Person.属性值可以在内部或外部设置,但是在对象上修改和检索此数据的行为应该与检索或将该数据提交到永久存储的行为分开.