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

C# 在属性通知中比较两个值的正确方法是什么?,c#,wpf,C#,Wpf,我有一个实现属性更改通知的简单属性: public SolidColorBrush Color { get { return this.color; } set { if (this.color == value) { return; } this.c

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

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

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

            this.color = value;
            this.NotifyOfPropertyChange(() => this.Color);
        }
    }
我正在使用Resharper+stylecop。我收到上述代码的警告(关于if(this.color==值):

我使用了如下等式:

  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上):

那么,比较这两个值的正确方法是什么呢?进行比较的任何标准方法总是正确的吗?

1)
SolidColorBrush
是一种引用类型,它不会重载
=
运算符,因此使用
=
运算符进行比较将进行引用比较。Resharper警告您,因为您可能不知道这一点

相反,你可以这样做

if (this.color.Color == value.Color)
{
    return;
}
注意:您需要注意
null
引用

2) 我想这是style cop的警告(我不熟悉这个),我很确定它和3是一样的(为了避免以后的混淆,请明确说明需要调用哪个方法)

3) 它表示您正在使用
SolidColorBrush.Equals
(派生类型)调用
Object.Equals
方法。这不是问题,但稍后如果
SolidColorBrush
使用相同的参数添加一个
Equals
方法,您将调用一个不同的方法,而您并不打算这样做。这就是resharper警告您的原因。

1)
SolidColorBrush
是一种引用类型,它不会重载
=
运算符,因此使用
=
运算符进行比较将进行引用比较。Resharper警告您,因为您可能不知道这一点

相反,你可以这样做

if (this.color.Color == value.Color)
{
    return;
}
注意:您需要注意
null
引用

2) 我想这是style cop的警告(我不熟悉这个),我很确定它和3是一样的(为了避免以后的混淆,请明确说明需要调用哪个方法)


3) 它表示您正在使用
SolidColorBrush.Equals
(派生类型)调用
Object.Equals
方法。这不是问题,但稍后如果
SolidColorBrush
使用相同的参数添加一个
Equals
方法,您将调用一个不同的方法,而您并不打算这样做。这就是resharper警告您的原因。

如果(color.Equals(value)),请尝试这样的
如果(color.Equals(value))

尝试这样的
如果(color.Equals(value))
可以通过利用color类中的Equals重载来比较基础颜色结构值,从而完成SolidColorBrush的完整比较

样品

    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;
        }
    }

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;
        }
    }

在同一范围内是否有名为
SolidColorBrush
的属性?@pushpraj否,我有一个名为Color的属性,该类型。我可以说,SolidColorBrush不重写Equals,因此它使用object.Equals实现,这可能会给出错误的结果,尝试比较基础颜色,而不是
限定符是多余的
可能在
this.color
中引用
this
。这只是一个警告。是否要比较引用或值?在同一作用域中是否有名为
SolidColorBrush
的属性?@pushpraj否,我有一个名为Color的属性,它具有这种类型。我可以说,SolidColorBrush不重写Equals,因此它使用object.Equals实现,这可能会给出错误的结果,尝试比较基础颜色,而不是
限定符是多余的
可能在
this.color
中引用
this
。这只是一个警告。是否要比较引用或值?是否可以在所有类型上使用此方法?例如值或引用类型?我可以在所有类型上使用此方法吗?例如,值或引用类型?