“是”关键字:这些方法有区别吗?

时间:2011-11-17 02:17:12

标签: c#

不确定is关键字,但我认为这两个关键字是相同的。谁能证实这一点?

public bool Equals(Object obj)
{ 
   if (obj == null) return false;
   MyType t = (MyType)obj;
   if (t == null) return false;
   return true;
}

另一个是......

public bool Equals(Object obj)
{ 
   return obj is MyType;
}

5 个答案:

答案 0 :(得分:4)

不,他们绝对不平等。如果(MyType)不是InvalidCastException的实例,则转化为obj会立即抛出MyType。如果演员表失败,表达式将不会评估为nullas运算符展示了您对该演员的期望。 My answer to another question更详细地讨论了这一点。

答案 1 :(得分:2)

他们不一样。如果obj不是MyType,则第一个版本会抛出异常,第二个版本会返回false

Equals()的这种实现很奇怪。您确定要将MyType的所有实例视为相等吗?

答案 2 :(得分:2)

在第一种方法中,冒着失败并抛出异常的风险。我认为您可能会混淆as关键字,如果转换失败则返回null。一旦修复,方法将大致相同:

public bool Equals(Object obj)
{ 
   return (obj as MyType) != null;
}

但无论如何后者更简洁明了。

答案 3 :(得分:1)

不一样,如果传递了不相关类型的对象,则第一个版本会发生InvalidCastException炸弹。

Equals()应该测试值的相等性,而不是类型相等。

答案 4 :(得分:1)

  

如果同时满足以下两个条件,则表达式的计算结果为true   满足:

     

表达式不为空。

     

表达式可以转换为类型。

     

也就是说,形式(类型)(表达式)的强制转换表达式将完成   抛出一个例外。有关更多信息,请参阅7.6.6 Cast   表达式。如果表达式将发出编译时警告   表达式是已知类型始终为true或始终为false。

From MSDN

方法不一样。如果obj不属于MyType,则会在is不会引发异常,但会返回false