我有这个简单的属性来实现属性更改通知:
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
那么比较这两个值的正确方法是什么?进行此比较的任何标准方法总能正常工作吗?
答案 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;
}
}