属性的自定义逻辑应该放入setter还是getter?

时间:2014-08-13 14:53:21

标签: c# oop design-patterns properties encapsulation

我有一个公共布尔属性,由私有字段支持。情况如此,如果某些条件X为真,则该属性应始终为true。但是,如果条件X为false,则属性可以为true或false,如初始化对象时指定的那样。

我不确定是否应该检查getter或setter中的条件X.

换句话说,

private bool _myProperty;
public bool MyProperty
{
    get { return _myProperty; }
    set
    {
        if (condition X)
            _myProperty = true;
        else
            _myProperty = value;
    }
}

private bool _myProperty;
public bool MyProperty
{
    get 
    {
        if (condition X)
            return true;
        else 
            return _myProperty; 
    }
    set { _myProperty = value; }
}

我确信这取决于具体情况。目前,该属性只能在OnStartup()方法中的类内部访问。

我发现第二个解决方案(检查getter)的危险在于私有字段和公共属性可能会不同步。所以我想第一个解决方案,检查设置器,是要走的路?

编辑:由于这种情况不断发生,condition X是用户权限的事情。它不能在会话中改变。

编辑:答案和评论让我想到了这个:

private bool _myProperty = conditionX;
public bool MyProperty
{
    get { return _myProperty; }
    set 
    {
        if (_myProperty == false)
            _myProperty = value;
    }
}

2 个答案:

答案 0 :(得分:1)

我认为,在大多数情况下,你可能想把你的逻辑放在吸气剂中。

如果condition X可以随时更改是真还是假,那么无论何时阅读,您的属性值都应该更新以反映这一点,那么您应该将逻辑放在getter中。

另一个选项只会在设置属性时更新属性,因此如果您设置属性,然后在某个时刻更改condition X,然后读取您的属性,那么该属性的值是返回并不真正反映condition X的状态。但是,可能是您希望此行为出现的情况。

答案 1 :(得分:0)

如果您将功能视为黑盒子,那么第二种选择更有意义。请考虑以下用例:

  • 您可以在不设置Condition X变量的情况下调用该函数。在第一种情况下,返回的值将是不确定的,因为您还没有明确设置任何值(除非您的代码中的其他位置有默认值);因此你的程序变得不可预测。但是,如果条件检查在getter中,则您始终可以验证返回值。

P.S。我也希望您的条件X始终设置为最终得到uninitialized bool。我相信你的程序不会编译(它已经有一段时间了),但我会仔细检查。我认为它默认为null,在这种情况下你的if语句不会执行。