Bob*_*tor 10 .net c# reflection casting
我有一个事件处理程序,如果它匹配特定类型,需要确定一个类型并执行代码.最初我们将它转换为一个对象,如果它不是null我们执行代码,加快它我使用反射,它实际上减慢了它,我不明白为什么.
这是一个代码示例
Trace.Write("Starting using Reflection");
if (e.Item.GetType() == typeof(GridDataItem))
{
bool isWatch = Convert.ToBoolean(e.Item.OwnerTableView.DataKeyValues[e.Item.ItemIndex]["IsWatch"]);
if (isWatch)
{
e.Item.Style["Font-Weight"] = "bold";
}
}
Trace.Write("Ending using Reflection");
Trace.Write("Starting using Cast");
GridDataItem gridItem = e.Item as GridDataItem;
if (gridItem !=null)
{
bool isWatch = Convert.ToBoolean(gridItem.OwnerTableView.DataKeyValues[e.Item.ItemIndex]["IsWatch"]);
if (isWatch)
{
gridItem.Style["Font-Weight"] = "bold";
}
}
Trace.Write("Ending using Cast");
Run Code Online (Sandbox Code Playgroud)
这是我得到的跟踪输出
Starting using Reflection 0.79137944962406 0.576538
Ending using Reflection 0.791600842105263 0.000221
Starting using Cast 0.791623353383459 0.000023
Ending using Cast 0.791649308270677 0.000026
Starting using Reflection 0.876253801503759 0.084604
Ending using Reflection 0.87631790075188 0.000064
Starting using Cast 0.87633445112782 0.000017
Ending using Cast 0.87634950075188 0.000015
Run Code Online (Sandbox Code Playgroud)
它不是很多,但如果我们不得不这么做,它可能会加起来.
And*_*are 15
反射很慢,因为您正在查询程序集的元数据,而转换只是更改您引用的对象的类型.
程序集的元数据是一个有用的信息存储,但该信息最好在编译时使用,而不是在执行时使用.编译器使用该元数据进行静态类型检查(以及其他内容).您正在使用相同的元数据在执行时查找类型信息(如果您没有其他选择,这很好),这比铸造要慢得多.
| 归档时间: |
|
| 查看次数: |
1605 次 |
| 最近记录: |