我有一个公共布尔属性,由私有字段支持。情况如此,如果某些条件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;
}
}
答案 0 :(得分:1)
我认为,在大多数情况下,你可能想把你的逻辑放在吸气剂中。
如果condition X
可以随时更改是真还是假,那么无论何时阅读,您的属性值都应该更新以反映这一点,那么您应该将逻辑放在getter中。
另一个选项只会在设置属性时更新属性,因此如果您设置属性,然后在某个时刻更改condition X
,然后读取您的属性,那么该属性的值是返回并不真正反映condition X
的状态。但是,可能是您希望此行为出现的情况。
答案 1 :(得分:0)
如果您将功能视为黑盒子,那么第二种选择更有意义。请考虑以下用例:
P.S。我也希望您的条件X始终设置为最终得到uninitialized bool。我相信你的程序不会编译(它已经有一段时间了),但我会仔细检查。我认为它默认为null,在这种情况下你的if语句不会执行。