属性的自定义逻辑应该放在setter或getter中
本文关键字:setter getter 自定义 属性 | 更新日期: 2023-09-27 18:17:45
我有一个由私有字段支持的公共布尔属性。情况是这样的,如果某个条件X为真,那么这个性质应该总是为真。但是,如果条件X为假,则属性可以为真或假,就像对象初始化时指定的那样。
我不确定是否应该在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)的危险在于私有字段和公共属性可能不同步。我认为第一个解决方案,即检入setter,是可行的吗?
编辑:因为这个不断出现,condition X
是一个用户权限的事情。它不能在会话中更改。
private bool _myProperty = conditionX;
public bool MyProperty
{
get { return _myProperty; }
set
{
if (_myProperty == false)
_myProperty = value;
}
}
我认为,在大多数情况下,你可能会想把你的逻辑放在getter中。
如果condition X
可以在任何时候改变是否为真或假,你的属性值应该更新以反映这一点,无论何时读取,然后你应该把你的逻辑在getter。
另一个选项将只在设置属性时更新属性,因此,如果您设置了属性,然后condition X
在某个时候更改,然后读取您的属性,那么返回的属性值并不能真正反映condition X
的状态。但是,在某些情况下,可能需要这种行为。
如果您将函数视为黑盒,那么第二种选择更有意义。考虑以下用例:
- 调用函数时不设置条件X变量。在第一种情况下,返回值将是不确定的,因为你还没有显式设置任何值(除非你在代码的其他地方有默认值);因此,您的程序变得不可预测。然而,如果条件检查是在getter中,你就可以始终验证返回值。
注:我也希望你的条件X总是设置,因为你可能以一个未初始化的bool结束。我相信你的程序不会编译(它已经有一段时间了),但我会仔细检查。我认为它默认为空,在这种情况下,你的if语句不会执行