在 getter 中声明变量

Declaring variables in a 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 仅用于 return 数据而不是 set/declare/initialize 事物...我的简化 getter 是否适用于最佳实践和编码指南?

setter 中的副作用仅限于局部变量。 API 呼叫者看不到它们。这使它们变得无害。

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

你可以做到。该代码无需担心。

首先,属性指南通常规定:

  1. 应该很便宜

    尽量避免昂贵的计算或从数据库中获取数据,以及 诸如此类。

  2. 它们应该是一致的

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

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

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

如果可以避免这种情况,请使用任何正常的 "tricks" 将 属性 getter 重构为

  • 更具可读性
  • 更易于维护
  • 更可重用(或使用更多可重用代码)

根据你的实际例子,我肯定会声明那些变量。

A Getter 不应该有副作用和改变对象的状态。否则,增加可读性的代码是受欢迎的

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