switch
除了编译器处理语句的方式之外,还有一件事要考虑,那就是is
运算符的功能。两者之间有很大区别:
if (obj is Foo)
和
if (obj.GetType() == typeof(Foo))
尽管有名称,但is
运算符会告诉您对象是否与给定类型兼容,而不是告诉您它是否属于给定类型。这会导致看起来像这样的不完全明显的错误(尽管这个非常明显):
if (obj is System.Object)
{
//this will always execute
}
else if (obj is Foo)
{
//this will never execute
}
这里的许多建议为您指明了使用对象类型的方向。如果您真正想要的是与每种类型关联的逻辑,那很好。但如果是这种情况,使用is
操作员时请小心行走。
另外:虽然您不能修改这些基本类型,但这并不意味着您不能使用 Owen 的建议。您可以实现扩展方法:
public enum MyType { Foo, Bar, Baz };
public static class MyTypeExtension
{
public static MyType GetMyType(this Foo o)
{
return MyType.Foo;
}
public static MyType GetMyType(this Bar o)
{
return MyType.Bar;
}
public static MyType GetMyType(this Baz o)
{
return MyType.Baz;
}
}
然后你可以使用一个switch
语句:
switch (myObject.GetType())
{
case MyType.Foo:
// etc.