我习惯看到像
这样的旧代码if (true)
{
...
}
直觉上很清楚,有人在做出改变时要么懒惰要么过于谨慎。我今天遇到了这个片段,我很好奇这种方式进行类型比较之间是否存在功能差异:
private static bool logField(Type t, string fieldname)
{
if (t.ToString() == typeof (Property).ToString())
{
...
}
return true;
}
这样做:
private static bool logField(Type t, string fieldname)
{
if (t == typeof (Property))
{
...
}
return true;
}
答案 0 :(得分:6)
我会说这通常是懒惰 - 但可能不是。例如,您可以在同一个有效文件中使用两种Property类型,但不同的副本。如果typeof(Property)
从一个文件中加载t
但从另一个文件加载{{1}},则替换者会说它们不同但原始代码会比较说它们是相同的。
这绝对是一个边缘案例,而且你通常首先想要避免的一个......但它只是可能。
答案 1 :(得分:3)
我想不出任何好的理由。
事实上,如果t
为空,前者将抛出。
答案 2 :(得分:1)
第一个比较字符串的引用,而第二个实际检查以查看t是否属于Property类型。
第一个将永远是“正确的”,因为两个字符串引用同一个对象,但第二个字符串是检查t是否属于Property类型的正确方法。
进行类型检查的等效且更易读的方法是
if (t is Property)
答案 3 :(得分:0)
不,获取相同类型的2个实例的类型对象将始终返回对内存中相同类型对象的引用。这意味着执行引用相等性检查(==)就足够了。
基本上,致电: if(t.ToString()== typeof(Property).ToString())
将在同一个对象上调用两次ToString(),其中t是'Property'类型。
答案 4 :(得分:0)
我会说第一种方法可能是由不熟悉C#的人完成的,不一定是懒惰的。字符串比较在大多数情况下都有效,除了:
t
为null,则会抛出空引用异常。 我会推荐第二种情况,除非你需要#2边缘情况。