比较属性通知中两个值的正确方法是什么?

时间:2014-08-07 09:01:27

标签: c# wpf

我有这个简单的属性来实现属性更改通知:

  public SolidColorBrush Color
    {
        get
        {
            return this.color;
        }

        set
        {
            if (this.color == value)
            {
                return;
            }

            this.color = value;
            this.NotifyOfPropertyChange(() => this.Color);
        }
    }

我正在使用Resharper + stylecop。我收到上述代码的警告(如果(this.color == value):

Possible unintended reference comparison, to get value comparison, use Equals.

我使用了以下等于:

  public SolidColorBrush Color
    {
        get
        {
            return this.color;
        }

        set
        {
            if (Equals(this.color, value))
            {
                return;
            }

            this.color = value;
            this.NotifyOfPropertyChange(() => this.Color);
        }
    }

然后我收到警告:

The call to Equals must begin with the 'this','base','object' or linemodel or propertychangeBase prefix to indicate the intended method call (stylecope rule SA1126]

所以我将其改为:

 public SolidColorBrush Color
    {
        get
        {
            return this.color;
        }

        set
        {
            if (SolidColorBrush.Equals(this.color, value))
            {
                return;
            }

            this.color = value;
            this.NotifyOfPropertyChange(() => this.Color);
        }
    }

现在我收到了这个警告:

Qualifier is redundant.
Access to a static member of a type via a derived type

我将代码更改为:

  public SolidColorBrush Color
    {
        get
        {
            return this.color;
        }

        set
        {
            if (object.Equals(this.color, value))
            {
                return;
            }

            this.color = value;
            this.NotifyOfPropertyChange(() => this.Color);
        }
    }

不,我收到警告(在object.Equals上):

 Qualifier is redundant

那么比较这两个值的正确方法是什么?进行此比较的任何标准方法总能正常工作吗?

3 个答案:

答案 0 :(得分:3)

1)SolidColorBrush是一种引用类型,它不会超载==运算符,因此使用==运算符进行比较会进行参考比较。 Resharper警告你,因为你可能不知道。

相反,你可以做到

if (this.color.Color == value.Color)
{
    return;
}

注意:您需要处理null个引用。

2)我想这是风格警察的警告(我不熟悉这个),我很确定它与3相同(为了避免以后混淆,请说明哪种方法需要打电话清楚)。

3)它表示您使用Object.Equals(派生类型)调用SolidColorBrush.Equals方法。这不是问题,但稍后如果SolidColorBrush添加具有相同参数的Equals方法,您最终会调用另一种您不打算这样做的方法。这就是resharper警告你的原因。

答案 1 :(得分:1)

尝试这样if (color.Equals(value))

答案 2 :(得分:0)

SolidColorBrush的完整比较可以通过利用Color类的Equals重载比较底层颜色结构值来完成

样品

    public SolidColorBrush Color
    {
        get
        {
            return this.color;
        }

        set
        {
            if (color != null && value != null)
            {
                if (color.Color.Equals(value.Color))
                    return;
            }
            else if (color == null && value == null)
                return;

            this.color = value;
        }
    }