在set方法中为属性赋值

本文关键字:属性 赋值 set 方法 | 更新日期: 2023-09-27 18:13:13

下面的代码导致StackOverflow错误(如预期的那样)。但是,我希望能够在set方法中设置这个变量的值。有办法吗?

public bool IsAvailable 
{
    get
    {
        return IsAvailable;
    }
    set
    {
        if (value == true)
        {
            this.Shape.BrushColor = ColorAvailable;
            IsAvailable = true;
        }
        else
        {
            this.Shape.BrushColor = ColorNotAvailable;
            IsAvailable = false;
        }
    }
}

在set方法中为属性赋值

您需要使用一个后备字段:

private bool _isAvailable;
public bool IsAvailable 
{
    get
    {
        return _isAvailable;
    }
    set
    {
        if (value == true)
        {
            this.Shape.BrushColor = ColorAvailable;
            _isAvailable = true;
        }
        else
        {
            this.Shape.BrushColor = ColorNotAvailable;
            _isAvailable = false;
        }
    }
}

顺便说一句:代码可以大大缩短:

private bool _isAvailable;
public bool IsAvailable 
{
    get
    {
        return _isAvailable;
    }
    set
    {
        this.Shape.BrushColor = value ? ColorAvailable : ColorNotAvailable;
        _isAvailable = value;
    }
}

你的属性应该封装一个私有字段,并且应该在Setter中设置,而不是在属性中设置。

private bool _IsAvailable; //private field
public bool IsAvailable 
{
    get
    {
        return _IsAvailable;
    }
    set
    {
        if (value)
        {
            this.Shape.BrushColor = ColorAvailable;
        }
        else
        {
            this.Shape.BrushColor = ColorNotAvailable;
        }
        _IsAvailable = value;
    }
}

你可以使用一个后备字段:

private bool _IsAvailable;
public bool IsAvailable 
{
    get
    {
        return _IsAvailable;
    }
    set
    {
        this.Shape.BrushColor = value ? ColorAvailable : ColorNotAvailable;
        _IsAvailable = value;
    }
}

自动与显式属性

您可以创建一个私有成员private bool _isAvailable并将您的标志存储在那里。

public bool IsAvailable 
{
get
{
    return _isAvailable;
}
set
{
    if (value)
    {
        this.Shape.BrushColor = ColorAvailable;
    }
    else
    {
        this.Shape.BrushColor = ColorNotAvailable;
    }
    _isAvailable = value;
}

}

您应该使用后备字段。但是,如果你不想使用后备字段,并确保this.Shape.BrushColor不会在其他任何地方设置,你可以做一些(丑陋的)像:

public bool IsAvailable 
{
    get
    {
        return this.Shape.BrushColor == ColorAvailable;
    }
    set
    {
        this.Shape.BrushColor = value  ? ColorAvailable : ColorNotAvailable;               
    }
}

本质上,IsAvailable属性不是一个底层(后备)字段,如;

private bool _isAvailable;

我还会考虑减少冗长,例如,'(value == true)'与'if (value)'相同,并设置if (value)之外的底层字段的值…Else且只在一行上。这样,上面的代码就可以简化为;

set
{
    this.Shape.BrushColor = value?ColorAvailable:ColorNotAvailable;
    _isAvailable = false;
}