属性的自定义逻辑应该放在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;
    }
}

属性的自定义逻辑应该放在setter或getter中

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

如果condition X可以在任何时候改变是否为真或假,你的属性值应该更新以反映这一点,无论何时读取,然后你应该把你的逻辑在getter。

另一个选项将只在设置属性时更新属性,因此,如果您设置了属性,然后condition X在某个时候更改,然后读取您的属性,那么返回的属性值并不能真正反映condition X的状态。但是,在某些情况下,可能需要这种行为。

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

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

注:我也希望你的条件X总是设置,因为你可能以一个未初始化的bool结束。我相信你的程序不会编译(它已经有一段时间了),但我会仔细检查。我认为它默认为空,在这种情况下,你的if语句不会执行