装箱、转型、方法调用他们究竟有什么区别?
2009-05-12 22:06:36来源:未知 阅读 ()
以下为引用的内容: 装箱、转型、方法调用这些我们天天进行的日常工作之前到底有什么差别? |
以下为引用的内容: struct UserInfoStruct 2{ 3 public int UserId; 4 public string UserName; 5} 6class UserInfoClass 7{ 8 private int UserId; 9 private string UserName; 10} 11class Program 12{ 13 14 static void Main(string[] args) 15 { 16 object objString = "abc"; 17 18 string aString = (string)objString; 19 string bString = objString.ToString(); 20 string cString = Convert.ToString(objString); 21 22 object objInt = 5; 23 int aInt = (int)objInt; 24 int bInt = Convert.ToInt32(objInt); 25 26 object objStruct = new UserInfoStruct(); 27 UserInfoStruct aUserInfoStruct = (UserInfoStruct)objStruct; 28 29 object objClass = new UserInfoClass(); 30 UserInfoClass aUserInfoClass = (UserInfoClass)objClass; 31 } 32} |
前几天在群里聊天,有人问:
string aString = (string)objString;
string bString = objString.ToString();有什么区别,我当时就回答“一个是转型、一个是方法调用”,刚说完就觉得自己是在说废话,其实我也不知道内部到底发生了什么,如是就reflector,ILDASM,google一起上,现在把弄出来的结果整理了一下,share出来,并把相似的几个都集在一起讨论,由于我不懂WinDbg,所以无法深入,就浅尝辄止吧。
下面是main方法的IL代码:
以下为引用的内容: 1.method private hidebysig static void Main(string[] args) cil managed 2{ 3 .entrypoint 4 // Code size 97 (0x61) 5 .maxstack 1 6 .locals init ([0] object objString, 7 [1] string aString, 8 [2] string bString, 9 [3] string cString, 10 [4] object objInt, 11 [5] int32 aInt, 12 [6] int32 bInt, 13 [7] object objStruct, 14 [8] valuetype SomeKits.UserInfoStruct aUserInfoStruct, 15 [9] object objClass, 16 [10] class SomeKits.UserInfoClass aUserInfoClass, 17 [11] valuetype SomeKits.UserInfoStruct CS$0$0000) 18 IL_0000: nop 19 IL_0001: ldstr "abc" 20 IL_0006: stloc.0 21 IL_0007: ldloc.0 22 IL_0008: castclass [mscorlib]System.String 23 IL_000d: stloc.1 24 IL_000e: ldloc.0 25 IL_000f: callvirt instance string [mscorlib]System.Object::ToString() 26 IL_0014: stloc.2 27 IL_0015: ldloc.0 28 IL_0016: call string [mscorlib]System.Convert::ToString(object) 29 IL_001b: stloc.3 30 IL_001c: ldc.i4.5 31 IL_001d: box [mscorlib]System.Int32 32 IL_0022: stloc.s objInt 33 IL_0024: ldloc.s objInt 34 IL_0026: unbox.any [mscorlib]System.Int32 35 IL_002b: stloc.s aInt 36 IL_002d: ldloc.s objInt 37 IL_002f: call int32 [mscorlib]System.Convert::ToInt32(object) 38 IL_0034: stloc.s bInt 39 IL_0036: ldloca.s CS$0$0000 40 IL_0038: initobj SomeKits.UserInfoStruct 41 IL_003e: ldloc.s CS$0$0000 42 IL_0040: box SomeKits.UserInfoStruct 43 IL_0045: stloc.s objStruct 44 IL_0047: ldloc.s objStruct 45 IL_0049: unbox.any SomeKits.UserInfoStruct 46 IL_004e: stloc.s aUserInfoStruct 47 IL_0050: newobj instance void SomeKits.UserInfoClass::.ctor() 48 IL_0055: stloc.s objClass 49 IL_0057: ldloc.s objClass 50 IL_0059: castclass SomeKits.UserInfoClass 51 IL_005e: stloc.s aUserInfoClass 52 IL_0060: ret 53} |
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:WPF自定义漂亮的按钮样式
- asp控件和html控件的概念区别 2020-03-09
- DataSet与DataTable的区别示例介绍 2020-03-04
- 深入浅析WinForm 进程、线程及区别介绍 2020-02-20
- .NET里面 abstract class和Interface有什么区别以及用法的展 2018-06-22
- WebApi和MVC的区别 2018-06-22
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash