相关疑难解决方法(0)

是vs typeof

这些代码中的哪一段更快?

if (obj is ClassA) {}

if (obj.GetType() == typeof(ClassA)) {}
Run Code Online (Sandbox Code Playgroud)

编辑:我知道他们不会做同样的事情.

c# rtti

145
推荐指数
4
解决办法
11万
查看次数

C#'是'运营商的表现

我有一个需要快速性能的程序.在其内部循环之一中,我需要测试对象的类型以查看它是否继承自某个接口.

一种方法是使用CLR的内置类型检查功能.最优雅的方法可能是'is'关键字:

if (obj is ISpecialType)
Run Code Online (Sandbox Code Playgroud)

另一种方法是给基类我自己​​的虚拟GetType()函数,它返回一个预定义的枚举值(在我的情况下,实际上,我只需要一个bool).这种方法会很快,但不那么优雅.

我听说有一个专门针对'is'关键字的IL指令,但这并不意味着它在转换为本机程序集时执行速度很快.任何人都可以分享一些关于'是'与其他方法的表现的见解吗?

更新: 感谢所有明智的答案!似乎在答案中分散了几个有用的观点:安德鲁关于'是'自动执行演员表的观点是必不可少的,但Binary Worrier和Ian收集的表演数据也非常有用.如果编辑其中一个答案以包含所有这些信息,那就太棒了.

c# clr performance gettype

90
推荐指数
7
解决办法
5万
查看次数

在C#中使用"as"之间有什么区别?

如果存在差异,则执行以下演员的两种方式之间有什么区别?

在这种情况下e是一个GridViewRowEventArgs对象.

GridView gv = (GridView)e.Row.FindControl("gv"); //first way

GridView gv2 = e.Row.FindControl("gv") as GridView; //second way
Run Code Online (Sandbox Code Playgroud)

c#

44
推荐指数
2
解决办法
3380
查看次数

C#"是"运算符 - 是反射吗?

一位同事今天问我一个有趣的问题 - C#关键字/运算符"是否被认为是反思?

object tmp = "a string";
if(tmp is String)
{
}
Run Code Online (Sandbox Code Playgroud)

这个操作符是如何在幕后实现的?它需要反思还是内省?或者由于语言的强类型性质,对象的类型是否可以作为内存中对象的顶级属性立即访问?

MSDN声明:

请注意,is运算符仅考虑引用转换,装箱转换和拆箱转换.is运算符不考虑其他转换,例如用户定义的转换.

考虑盒装和非盒装转换的能力似乎意味着某种内省.

.net c# reflection introspection typing

29
推荐指数
2
解决办法
7146
查看次数

标签 统计

c# ×4

.net ×1

clr ×1

gettype ×1

introspection ×1

performance ×1

reflection ×1

rtti ×1

typing ×1