作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我找不到以下问题的答案:
object o = 10; // Box
int i = (int)o; // Unbox
说的很清楚,下面的不清楚
bool isInt = o is int; // Is the unbox here or not?
最佳答案
不,这不是拆箱 - 它只是检查类型是否正确。不要忘记确实涉及到一个对象,它有一个类型。无论该值是否为装箱值类型值,检查该类型基本上都是相同的操作。 (对于值类型或任何密封类型可能有一些优化是可行的,因为没有要考虑的继承,但从根本上说它仍在检查对象 header 的“类型”部分。)
一种检查方法是编译代码并使用 ILASM 查看 IL:
// object o = 10
IL_0000: ldc.i4.s 10
IL_0002: box [mscorlib]System.Int32
IL_0007: stloc.0
// int i = (int) o;
IL_0008: ldloc.0
IL_0009: unbox.any [mscorlib]System.Int32
IL_000e: stloc.1
// bool isInt = o is int
IL_000f: ldloc.0
IL_0010: isinst [mscorlib]System.Int32
因此它使用 isinst
- 无需拆箱。
关于c# - IS 运算符是否拆箱值类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12222062/
我是一名优秀的程序员,十分优秀!