c# - 我真的不应该在属性访问器中做 "long running"事情吗?

标签 c# vb.net properties class-design

如果是这样,为什么? 什么是“长跑”?

在属性访问器中施展魔法似乎是我作为类设计者的特权。我一直认为这就是 C# 的设计者将这些东西放在那里的原因——这样我就可以做我想做的事。

当然,尽量减少类用户的意外是一种很好的做法,因此在方法中嵌入真正长时间运行的东西(例如,10 分钟的蒙特卡洛分析)是有意义的。

但是假设一个 prop 访问器需要一个数据库读取。我已经打开了数据库连接。数据库访问代码在属性访问器中是否符合正常预期?

最佳答案

正如您提到的,这对类(class)的用户来说是一个惊喜。人们习惯于使用属性来做这样的事情(人为的例子如下:)

foreach (var item in bunchOfItems)
    foreach (var slot in someCollection)
        slot.Value = item.Value;

这看起来很自然,但是如果 item.Value 实际上在您每次访问它时都在访问数据库,那将是一场小灾难,并且应该以等同于此的方式编写:

foreach (var item in bunchOfItems)
{
   var temp = item.Value;
   foreach (var slot in someCollection)
      slot.Value = temp;
}

请帮助引导使用您的代码的人远离这样的隐患,并将慢的东西放在方法中,让人们知道他们很慢。

当然,也有一些异常(exception)。只要延迟加载不会花费一些非常长的时间,延迟加载就很好,有时使事物属性对于反射和数据绑定(bind)相关的原因非常有用,所以也许你会想要弯曲这个规则。但是,如果没有特定的原因,违反惯例和违背人们的期望是没有多大意义的。

关于c# - 我真的不应该在属性访问器中做 "long running"事情吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/883504/

相关文章:

c# - 下面的语句解释了什么

python - 什么是惰性属性(property)?

c# - 通过 VB.NET 和 C# 中的 Ref 参数

c# - 将数据添加到缓存时出现重复的键

c# - 没有子节点时,如何使xml节点在同一行打开和关闭?

c# - 带有 MongoDb 的 ASP.NET Core 3.1 中的身份服务器 4

c++ - 如何以编程方式刷新通知区域图标页面

sql-server - VBNET中应使用什么错误处理

ios - 等同于 Realm 中的 attributesByName 核心数据方法/获取 RLMObject 的属性/属性

c# - 如何使用 2x 参数正确调用 .NET logger.LogError 方法?