【发布时间】:2011-07-13 19:34:05
【问题描述】:
我正在更新一些旧代码,并且发现了几个实例,其中每次需要调用同一个对象的属性或方法之一时都会重复转换。示例:
if (recDate != null && recDate > ((System.Windows.Forms.DateTimePicker)ctrl).MinDate)
{
((System.Windows.Forms.DateTimePicker)ctrl).CustomFormat = "MM/dd/yyyy";
((System.Windows.Forms.DateTimePicker)ctrl).Value = recDate;
}
else
{
(System.Windows.Forms.DateTimePicker)ctrl).CustomFormat = " ";
}
((System.Windows.Forms.DateTimePicker)ctrl).Format = DateTimePickerFormat.Custom;
我倾向于修复这个怪物,但鉴于我的时间有限,我不想打扰任何不影响功能或性能的事情。
所以我想知道的是,编译器会优化掉这些多余的强制转换吗?我尝试通过在一个简化的示例中使用 ildasm 自己来解决这个问题,但由于不熟悉 IL,我最终只会更加困惑。
更新
到目前为止,共识似乎是 a) 不,演员表没有优化,但是 b) 虽然结果可能会对性能造成一些小的影响,但不太可能很重要,c) 我应该考虑无论如何都要修复它们。如果我有时间的话,我已经决定有一天解决这些问题。同时,我不会担心他们。
谢谢大家!
【问题讨论】:
-
确实是一个有趣的问题:但是,执行性能分析——我非常怀疑这种强制转换的使用会显着影响应用程序的性能——即使没有优化——仅仅基于可疑的调用计数(和因此,移除演员表只是“修复[ing]这个怪物”,尽管我确实喜欢对现实世界的约束表示赞同 ;-)
-
在哪里检查 ctrl 是否是 DateTimePicker (或者只是假设是)?通常在这种情况下,您想要转换一次(DateTimePicker dtp = ctrl as DateTimePicker),然后检查结果是否不为空,然后从该点开始使用转换的对象。
-
@Brandon - 这是一个巨大的 if/else if 链,例如如果(ctrl 是 DateTimePicker)。不漂亮,但至少不危险。你提出的就是我想做的,但是因为时间限制而不愿意做(有几百个)。
标签: c# .net casting jit compiler-optimization