新疆软件开发

本站首页 软件开发 成功案例 公司新闻 公司简介 客服中心 软件技术 网站建设
  您现在的位置: 新疆二域软件开发公司 >> .Net技术 >> 文章正文

C#中“+”的两种功能

C#学习中,我们应该都知道"+"号的使用方法,今天我们就来谈一谈它的使用,一般情况下认为"+"操作符有两种功能,一种是做算术加,一种是做字符串的连接。

  今天看到一份文档说,深入解析C#中两个PLUS操作符执行的不同操作,想了想,也的确应该是这样,IL代码实例也表面这个观点是正确的:

我们先写一小段测试代码:
namespace MSILTest
{
 class Program
 {
 static void Main(string[] args)
 {
 string a = "aaa"; 
 string b = a + "bbb"; 
 System.Console.WriteLine(b); 
 int c = 1; 
 int d = c + 1; 
 System.Console.WriteLine(d); 
 }
 }
}

  反编译得到IL代码:

.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 40 (0x28)
.maxstack 2
.locals init ([0] string a,
[1] string b,
[2] int32 c,
[3] int32 d)
IL_0000: nop
IL_0001: ldstr "aaa"
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: ldstr "bbb"
IL_000d: call string [mscorlib]System.String::Concat(string,
string)
IL_0012: stloc.1
IL_0013: ldloc.1
IL_0014: call void [mscorlib]System.Console::WriteLine(string)
IL_0019: nop
IL_001a: ldc.i4.1
IL_001b: stloc.2
IL_001c: ldloc.2
IL_001d: ldc.i4.1
IL_001e: add
IL_001f: stloc.3
IL_0020: ldloc.3
IL_0021: call void [mscorlib]System.Console::WriteLine(int32)
IL_0026: nop
IL_0027: ret
} // end of method Program::Main

  从上面的代码中可以看到,在+连接字符串的时候,C#的Complier是把它转换成为了带两个参数的Concat()函数。这个函数可以反编译System.dll可以看到这个静态的带两个参数的方法。

  而+在handle两个number的时候,是直接转换成为add操作指令的。
这“两个”操作指令,完全没有一点相似的地方。所以,我们需要把这不同功能的两个+当成是两个运算符来看待。

  同时,我们还可以稍为引申一下,关于C#中的强制类型转换:
大家看这一句:
IL_0021: call 
void [mscorlib]System.Console::WriteLine(int32)
如果我们把
System.Console.WriteLine(d); 
改成
System.Console.WriteLine(’\u0041’); 
相应的IL代码就会转变成为:
IL_0020: ldc.i4.s 65
IL_0022: call void [mscorlib]System.Console::WriteLine(char)

 由此我们可以得到结论:
  强制类型转换,只不过是调用了一些方法的不同的重载的方法,而这个值本身是没有变的。

  这个值在Stack的顶部,转换前后都不变,只是编译器来根据强制类型转换相应的代码来选择不同方法的不同的重载版本。

  跟踪堆栈顶部数值,得到的结果也支持我们的这个结论。

作者:未知 | 文章来源:未知 | 更新时间:2007-11-12 16:44:16

  • 上一篇文章:

  • 下一篇文章:

  • 相关文章:
    j2se 嵌入式脚本抓取引擎
    NET Framework 2.0 Service Pack 2下载地址
    C#实现短信发送程序的例子
    .net学习:c#事件的深入分析
    基础学习:java中使用存储过程
    C#如何设置或者获取目录的权限?
    解析c#语言和java语言最相似的地方
    C#中如何才能调用QTP自动化对象
    解析.NET中的6各大的安全错误
    C#如何转换AVI文件为BMP位图文件
    软件技术
    · 开发语言
    · Java技术
    · .Net技术
    · 数据库开发
    最新文章  
    ·.net技术 asp.net MVC3 Vi
    ·.net将视频文件格式转换成
    ·NET Framework 2.0 Servic
    ·如何动态修改winform的app
    ·asp,net软件结构设计和相关
    ·学习怎样使用ASP.NET中的虚
    ·,net基础类的学习:system
    ·.net学习:c#事件的深入分
    ·Facade Pattern学习总结
    ·C#如何设置或者获取目录的
    ·如何使用XSL来定义ASP.NET
    ·理解WCF Data Contract契约
    ·如何能在.net2.0开发的控件
    ·模式怎样使用,讲解模式的
    ·如何解决Menu菜单被frame遮
    关于我们 | 软件开发 | 下载试用 | 客服中心 | 联系我们 | 友情链接 | 网站地图 | 新疆电子地图 | RSS订阅
    版权所有 © 2016 新疆二域软件开发网 www.k8w.net All Rights Reserved 新ICP备14003571号
    新疆软件开发总机:0991-4842803、4811639.
    客服QQ:596589785 ;地址:新疆乌鲁木齐北京中路华联大厦A-5C 邮编:830000