是否可以在EventArgs周围创建一个switch-case语句?
即:
void MyMethod(object sender, EventArgs e)
{
switch(e)
{
//MyEventArgs inherit from EventArgs
case e is MyEventArgs:
//Do some code...
break;
default:
break;
}
}
现在我找不到将它放在switch-case中的方法,所以我使用if-else语句,当我在其中填充许多if-else时,它会比switch-case慢一些(因为switch-case正在创建某种情况下的案例哈希表。)
答案 0 :(得分:3)
在开关盒中,必须静态评估每种情况。这意味着在每种情况下都需要一个常量。这篇文章也许有用C# switch statement limitations - why?
答案 1 :(得分:3)
您无法在您的方案中使用switch
。
switch
语句需要一个整数类型或字符串作为参数(下面有更多详细信息)。您不能将EventArgs
作为参数传递给switch语句,另外case
语句需要编译时常量值。
switch语句的管理类型由交换机建立 表达。
- 如果switch表达式的类型是sbyte,byte,short,ushort,int,uint,long,ulong,bool,char,string或enum-type,或者如果它 是可空类型对应于这些类型之一,然后是 是switch语句的管理类型。
- 否则,从交换机表达式的类型到下列之一,必须存在一个用户定义的隐式转换(第6.4节) 可能的管理类型:sbyte,byte,short,ushort,int,uint,
long,ulong,char,string,或者是与一个相对应的可空类型 那些类型。- 否则,如果不存在此类隐式转换,或者存在多个此类隐式转换,则编译时错误 发生。强>
代码中的另一个问题是案例陈述:
每个案例标签都指定一个常量值。
您的case语句指定了在编译时无法确定的值。
这使您可以选择使用if-else
块。除非您处理数百种类型EventArgs
,否则您不太可能看到任何显着的性能提升。
答案 2 :(得分:1)
您可以使用Dictionary<Type, Action<EventArgs>>
:
private static Dictionary<Type, Action<EventArgs>> _EventDispatcher;
static Program()
{
_EventDispatcher = new Dictionary<Type, Action<EventArgs>>();
_EventDispatcher.Add(typeof(EventArgs), OnEventArgs);
_EventDispatcher.Add(typeof(MyEventArgs), OnMyEventArgs);
}
private static void MyMethod(object sender, EventArgs e)
{
Action<EventArgs> eventMethod;
if (!_EventDispatcher.TryGetValue(e.GetType(), out eventMethod))
eventMethod = OnUnknownEventArgs;
eventMethod(e);
}
private static void OnEventArgs(EventArgs e)
{
Console.WriteLine("Simple event args: " + e);
}
private static void OnMyEventArgs(EventArgs e)
{
var myEventArgs = (MyEventArgs)e;
Console.WriteLine("My event args: " + myEventArgs);
}
private static void OnUnknownEventArgs(EventArgs e)
{
Console.WriteLine(String.Format("Unknown event args ({0}): {1}", e.GetType(), e);
}
private static void Main(string[] args)
{
MyMethod(null, new EventArgs());
MyMethod(null, new MyEventArgs());
MyMethod(null, new AnotherEventArgs());
Console.ReadKey();
}
答案 3 :(得分:1)
您是否考虑过使用方法重载? 一般来说,我会尽量避免使用视图异常来切换案例块,因为它们通常是一种气味,继承,重载等可以以更好的方式解决问题。
BR
答案 4 :(得分:0)
只是为了完整性,将工作,但你应该不这样做,原因应该非常明显:
void MyMethod(object sender, EventArgs e)
{
switch(e.GetType().FullName)
{
case "MyNamespace.MyEventArgs":
//seriously, don't do this.
break;
case "System.EventArgs":
//this is the worst idea ever.
break;
default:
break;
}
}