我不明白为什么Resharper建议我在这段代码中“检查引用相等”:
if ( typeToTranslate.Equals( typeof(string) ) )
{
//do something
}
为什么这应该更好:
typeToTranslate == typeof(string)
------------ ------------ EDIT
这是方法存根:
protected IType TranslateType(Type typeToTranslate)
{
if (typeToTranslate == null) throw new ArgumentNullException("typeToTranslate");
//do some stuff
if (typeToTranslate.Equals(typeof(string)))
{
//do some stuff
}
//return some stuff
}
答案 0 :(得分:23)
Object.Equals
是一种比参考平等更普遍的平等:如果x == y
然后是x.Equals(y)
,但反过来不一定是真的。但是,如MSDN Library中所述:
表示类型的 Type 对象是唯一的;也就是说,当且仅当它们表示相同的类型时,两个 Type 对象引用引用同一个对象。这允许使用引用相等性来比较 Type 对象。
因为ReSharper将“通用实践和代码改进”下的“检查引用相等性”检查选项分类,我的猜测是ReSharper告诉您它足以使用引用相等性进行比较类型;你不需要Equals
方法所暗示的更一般的平等(即使对于类型,这两者是等价的)。
答案 1 :(得分:15)
表示类型的Type对象是唯一的;也就是两个Type 对象引用当且仅当它们是引用时才引用同一对象 代表相同的类型。这允许比较Type对象 使用引用相等。
这意味着"string".GetType()
和typeof(string)
会返回相同的引用。 AppDomain中只有System.String的System.Type对象的单个实例。
为什么ReSharper说使用==
代替.Equals()
“更好”?我的猜测是因为==
效率更高,如果NullReferenceException
为空(在您的情况下),则typeToTranslate
无法抛出{{1}}。