代码之家  ›  专栏  ›  技术社区  ›  Jason

我如何确保财产对其他依赖它的人的价值?

  •  4
  • Jason  · 技术社区  · 15 年前

    我有这样的财产:

    private Decimal _payout; 
    public Decimal PayoutValue
        {
            get { return _payout; }
            set
            {
                _payout = value;
    
                //second part of following conditional is an enum
                if (Math.Abs(value) > 1 && this.PayoutType == CutType.Percent)
                {
                    _payout /= 100;
                }
            }
        }
    

    如您所见,它取决于 PayoutType ,这只是一个简单的枚举属性:

    public CutType PayoutType { get; set; }
    

    我的问题是 付款类型 以前好像没准备好 PayoutValue 已设置,因此下面的条件永远不是真的。我怎么强迫 付款类型 在之前设定 支付价值 是否被评估?

    谢谢。

    更新 谢谢你们的回答。我想我应该提到,大多数时候这个对象是通过datacontext或Http.Post网站从我的客户端(MVC项目),所以我没有任何构造函数。有没有其他的方法,或者我应该开始我的节目创作?

    3 回复  |  直到 15 年前
        1
  •  1
  •   Viv    15 年前

    这个怎么样?

    get
    {
       if (Math.Abs(value) > 1 && this.PayoutType == CutType.Percent)
       {
          return _payout /100;
       }
       return _payout;
    }
    set{_payout = value;}
    

    这样就不会更改设置的值。

        2
  •  2
  •   Reed Copsey    15 年前

    如何在评估PayoutValue之前强制设置PayoutType?

    把它放到构造函数中。这是执行这条规则的唯一方法。

    尽管如此,我还是建议不要这样做,至少在上面的实现中是这样。您当前的属性实现会让用户非常困惑。人们往往希望设置一个属性,然后立即获取它将提供相同的值。

    不过,就你而言:

    decimal value = 45.3;
    myObject.PayoutValue = value; // Set this
    
    if (myObject.PayoutValue != value)
    {
        // This would normally be a very unexpected case!  In your example, it will always be true!
    }
    

    最好潜在地使用两种属性或一种方法(即: SetPayoutValue(decimal value) )让用户知道它不是一个简单的属性。

        3
  •  0
  •   Nate CSS Guy    15 年前

    所有“必需”属性都应该在类的构造函数中。