【问题标题】:Should a property be converted to one with a backing field when there's logic? [closed]当有逻辑时,是否应该将属性转换为具有支持字段的属性? [关闭]
【发布时间】:2016-12-20 15:49:45
【问题描述】:

如果我有一个具有内置逻辑属性的类,例如:

class myModelClass
{
    public List<SummaryModel> Coupons {get;set;}

    public decimal AlaCarteTotal
    {
        get
        {
            if (Coupons != null)
            {
                if (!Coupons.Any(x => x.GromotionApplied))
                {
                    return Coupons.Sum(x => x.DefaultPrice);
                }

                return Coupons.Sum(x => x.GromotionApplied ? x.GromoPrice : x.DefaultPrice);
            }

            return default(decimal);
        }
    }
}

...将 Coupons 转换为具有如下支持字段会更好吗:

class myModelClass
{
    public List<SummaryModel> Coupons 
    { 
        get 
        { 
            return _Coupons; 
        } 
        set 
        { 
            _Coupons = value; 
        } 
    }

    public decimal AlaCarteTotal
    {
        get
        {
            if (_Coupons != null)
            {
                if (!_Coupons.Any(x => x.GromotionApplied))
                {
                    return _Coupons.Sum(x => x.DefaultPrice);
                }

                return _Coupons.Sum(x => x.GromotionApplied ? x.GromoPrice : x.DefaultPrice);
            }

            return default(decimal);
        }
    }
}

更一般地说,当模型类包含某种 getter 逻辑时,是否应将属性转换为带有支持字段的属性?

【问题讨论】:

  • 我很困惑...您的 Coupons 属性没有任何逻辑。那么为什么要给它一个支持领域呢? AlaCarteTotal 是带有逻辑的属性,但它不需要支持字段....有人可能会说将AlaCarteTotal 转换为方法而不是属性更好...
  • 认为这个List&lt;SummaryModel&gt; Coupons {get;set;} 无论如何都会有支持的字段(如果你不这样做,编译器会这样做)
  • 也许题外话了,但看到 AlaCarteTotal 需要 Coupons 来计算它的总数(或检查是否存在),我会将 Coupons 作为参数传入并将其从属性更改为方法,并完全不需要单独的优惠券属性。
  • 我相信这个问题只是关于寻求“最佳实践”。所描述的支持字段没有附加值,因此我不会仅仅为了拥有它们而添加它们。

标签: c# .net visual-studio visual-studio-2013


【解决方案1】:

没有一般性建议。

有时您会在代码中使用一些局部变量,但当您意识到需要更复杂的工作流程来设置和获取该值时。

如果您已经使用(甚至是通用的)setter 和 getter 将字段作为属性,那么您的生活会更轻松,因为您只需编辑 get 和 set 而无需触及其余代码。

简而言之:保持它没有支持字段,直到你有它的目的。 .NET 无论如何都会在后台创建它,但如果您的逻辑不需要它们,您的代码会更短、更简短。

这个可以解释得更清楚:Properties backing field - What is it good for?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多