我有一个复杂的getter如下
public bool IsOk
{
get
{
return (IsFirstCondition && (IsSecondCondition.Items.First.Item == MyItems.PublicItems.BestItem
|| IsThirdCondition.Collection.EditedItem.IsTheMostUsedItem);
}
}
为了简单和更好的可读性,我想把我的getter变成像:
public bool IsOk
{
get
{
var isBestItemm = IsSecondCondition.Items.First.Item == MyItems.PublicItems.BestItem;
var isMostUsedItem = IsThirdCondition.Collection.EditedItem.IsTheMostUsedItem;
return (IsFirstCondition && (isBestItemm || isMostUsedItem);
}
}
据我所知,getter只是为了返回数据而不是为了设置/声明/初始化东西......我的简化getter是否对最佳实践和编码指南有效?
答案 0 :(得分:6)
首先,属性指南通常要求:
他们应该便宜
尽量避免代价高昂的计算或从数据库中获取数据 这样的事情。
它们应该是一致的
两次读取属性应该两次返回相同的值。
他们不应该引入副作用
读取属性会以某种方式更改基础对象。
如果可以避免这种情况,请使用任何正常的“技巧”来重构属性getter
就你的实际例子而言,我肯定会声明这些变量。
答案 1 :(得分:1)
您的setter中的副作用受限于局部变量。它们不能被API调用者观察到。这使他们无害。
换句话说,这并没有打破人们对财产的通常期望。
你可以这样做。该代码没有任何问题。
答案 2 :(得分:0)
Getter 不应有副作用并更改对象的状态。否则欢迎使用提高可读性的代码。
答案 3 :(得分:0)
如果我是你,我会选择第二种解决方案。由于变量的范围没有从getter方法中指出,因此它们不能被视为“真实”声明,但它们更易于阅读和调试。 (编译器将优化您的代码以获得最佳的运行时和内存使用,因此不要担心“额外”变量。)另外,当您知道变量的确切类型时,为什么还要使用“var”?