C# 获取部分属性中的逻辑。良好做法?

C# 获取部分属性中的逻辑。良好做法?,c#,wpf,data-binding,properties,C#,Wpf,Data Binding,Properties,将xaml数据绑定到某些数据时,我经常使用属性的“get”部分来执行一些逻辑。比如给出一张清单的总数,或者检查某件事情是否为正 例如: public List<SomeClass> ListOfSomeClass{get;set;} public double SumOfSomeClass { get { return ListOfSomeClass.Sum(s => s.Totals); } } public bool SumPositive {

将xaml数据绑定到某些数据时,我经常使用属性的“get”部分来执行一些逻辑。比如给出一张清单的总数,或者检查某件事情是否为正

例如:

public List<SomeClass> ListOfSomeClass{get;set;}

public double SumOfSomeClass
{
  get
  {
    return ListOfSomeClass.Sum(s => s.Totals);
  }
}

public bool SumPositive
{
  get
  {
    if(SumOfSomeClass >= 0)
      return true;
    else
      return false;
  }
}
某些类的公共列表{get;set;} 某个类的公共双sum { 得到 { 返回SomeClass.Sum的列表(s=>s.Totals); } } 公营学校 { 得到 { 如果(某些类别的总和>=0) 返回true; 其他的 返回false; } }
这样我就可以绑定到SumPositive和SumOfSomeClass。这是否被视为良好做法?即使它变得比这更复杂?还是调用一个方法并返回结果更好?调用另一个类甚至数据库怎么样?

我说是的,但尝试将ListOfSomeClass.Sum(s=>s.Totals)的结果存储在私有变量中。特别是如果您多次使用它。

在getter/setter中使用复杂的逻辑不是一个好的实践。我建议将复杂的逻辑移到单独的方法(如GetSumOfXYZ())中,并在属性访问器中使用


您可以使用-来避免复杂的属性。它允许您定义提取某些数据的方法。

属性获取程序应该是快速且幂等的(即不应该在那里执行破坏性操作)。尽管迭代内存中的对象集合非常好,但我不建议在get或set部分执行任何繁重的操作。说到迭代,我仍然会缓存结果以节省几毫秒。

我看不到任何直接问题(除非列表非常庞大),但我个人会尽可能使用
myInstance.SomeList.Sum()
方法(.net>=2.0).

对于集合中字段或其他属性的基本计算,可以在Get属性中进行。正如其他人所说,真正的逻辑永远不应该在getter中完成。

取决于。。。如果这是在域实体上,那么我不赞成在getter中使用复杂的逻辑,尤其是在setter中。使用方法(对我)向实体的消费者发出操作正在执行的信号,而getter发出简单检索的信号


现在,如果这个逻辑在ViewModel中,那么我认为getter方面更容易理解/期望

我认为在getter和setter中应该有某种程度的逻辑,否则您只能以一种复杂的方式将您的成员声明为公共成员。

是的,除非这是一个可能会影响性能的操作。在这种情况下,您应该改为使用方法(因为最终用户更直观地看到,方法可能很慢,而属性很快)

请将该getter更改为:

public bool SumPositive
{
  get
  {
     return SumOfSomeClass >= 0;
  }
}

您已经在使用布尔表达式,无需显式返回true或false

我喜欢您的命名约定,并且我完全同意在属性getter中使用您的示例这样的内容,如果您要提供一个用于绑定的API

我不同意其他人提出的将代码移动到方法中只是因为它计算量大的观点——这不是我曾经做过的区别,我也没有听到其他人认为在方法中意味着比属性慢


我相信属性应该对调用它们的对象没有副作用。要保证它们对更广泛的环境没有影响要困难得多——即使是一个相对简单的属性也可能将数据拉入内存,或者至少更改处理器缓存或vm状态。

我会小心地将任何逻辑放入属性的Getter中。费用越高,危险就越大。其他开发人员希望getter立即返回值,就像从成员变量获取值一样。我见过很多这样的例子,开发人员在循环的每次迭代中都使用一个属性,认为他们只是得到了一个值,而这个属性实际上做了很多工作。这可能是代码执行速度的一个主要放缓。

“节省几毫秒”-纳秒?幂等元的含义更广泛-它意味着您通过反复调用操作而获得相同的结果,而不是受记忆状态的影响。这就是我在代码中实际使用的。在本例中,它应该“看起来”更复杂;)