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
。这只是一个警告。是否要比较引用或值?是否可以在所有类型上使用此方法?例如值或引用类型?我可以在所有类型上使用此方法吗?例如,值或引用类型?