是否有理由以这种方式进行类型比较?

时间:2010-07-21 21:38:13

标签: c# equals typeof

我习惯看到像

这样的旧代码
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;
}

5 个答案:

答案 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#的人完成的,不一定是懒惰的。字符串比较在大多数情况下都有效,除了:

  1. 如果t为null,则会抛出空引用异常。
  2. 不考虑名称空间。
  3. 我会推荐第二种情况,除非你需要#2边缘情况。