【发布时间】:2014-10-30 19:22:51
【问题描述】:
当我使用 SlSvcUtil.exe 创建服务客户端文件时,我看到如下代码:
private string CategoryField;
[System.Runtime.Serialization.DataMemberAttribute()]
public string Category
{
get
{
return this.CategoryField;
}
set
{
if ((object.ReferenceEquals(this.CategoryField, value) != true))
{
this.CategoryField = value;
this.RaisePropertyChanged("Category");
}
}
}
当我使用 ReSharper 检查它时,我收到以下警告:
'Object.ReferenceEquals' 始终为 false,因为它是用值类型调用的
我了解 strings are immutable,但我似乎收到了针对每个属性的此警告。
ReSharper 建议如下:
注意:这包括我将简单的 getter 放在一行中的自定义样式、反转 if、删除多余的 object 限定符和 != true 比较
private string CategoryField;
[DataMember]
public string Category
{
get { return this.CategoryField; }
set
{
if (Equals(this.CategoryField, value)) { return; }
this.CategoryField = value;
this.RaisePropertyChanged("Category");
}
}
所以这真的引出了一个问题,为什么 SlSvcUtil.exe 使用 ReferenceEquals 而不是 Equals 如果 ReferenceEquals 总是会返回 false?
【问题讨论】:
-
表达式
Equals(this.CategoryField, value)如何编译?它在哪里得到Equals()方法?至于更大的问题,对我来说这听起来像是一个 ReSharper 错误。 System.String 显然不是值类型,因此虽然使用this.CategoryField.Equals(value)而不是object.ReferenceEquals()可能更好,但 Resharper 的具体投诉似乎无效。 -
它编译得很好。这是
Object.Equals()。 -
啊,谢谢。我忘记了该方法的静态版本。呃。无论如何,我仍然认为您正在查看 Resharper 错误。
-
这很可能是 9.0 EAP,但我确实注意到
enum、string和struct对象,如int和bool抛出该警告并推荐 @ 987654340@,但我创建的自定义类没有,Object.ReferenceEquals()很好。 -
这就是我的意思。该警告适用于 Enums、int 和 bool 等值类型,当然还有用户定义的结构。不应为引用类型显示警告,包括自定义类但也包括 System.String,它也是一种引用类型(不变性是红鲱鱼)。
标签: c# wcf silverlight silverlight-5.0 slsvcutil