在getter中声明变量

时间:2016-07-29 09:51:24

标签: c# getter

我有一个复杂的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是否对最佳实践和编码指南有效?

4 个答案:

答案 0 :(得分:6)

首先,属性指南通常要求:

  1. 他们应该便宜

    尽量避免代价高昂的计算或从数据库中获取数据 这样的事情。

  2. 它们应该是一致的

    两次读取属性应该两次返回相同的值。

  3. 他们不应该引入副作用

    读取属性会以某种方式更改基础对象。

  4. 如果可以避免这种情况,请使用任何正常的“技巧”来重构属性getter

    • 更易阅读
    • 更易于维护
    • 更可重用(或使用更多可重复使用的代码)

    就你的实际例子而言,我肯定会声明这些变量。

答案 1 :(得分:1)

您的setter中的副作用受限于局部变量。它们不能被API调用者观察到。这使他们无害。

换句话说,这并没有打破人们对财产的通常期望。

你可以这样做。该代码没有任何问题。

答案 2 :(得分:0)

Getter 不应有副作用并更改对象的状态。否则欢迎使用提高可读性的代码

答案 3 :(得分:0)

如果我是你,我会选择第二种解决方案。由于变量的范围没有从getter方法中指出,因此它们不能被视为“真实”声明,但它们更易于阅读和调试。 (编译器将优化您的代码以获得最佳的运行时和内存使用,因此不要担心“额外”变量。)另外,当您知道变量的确切类型时,为什么还要使用“var”?