315技术社区's Archiver

购买请咨询客服QQ:604164

wolaile 发表于 2008-5-11 10:53

C#中的两个+(plus)操作符解析

C#中,我们一般情况下认为"+"操作符有两种功能,一种是做算术加,一种是做字符串的连接。     今天看到一份文档说,深入解析C#中两个PLUS操作符执行的不同操作,想了想,也的确应该是这样,IL代码实例也表面这个观点是正确的:

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

    反编译得到IL代码:
[color=#000000].method [/color][color=#0000ff]private[/color][color=#000000] hidebysig [/color][color=#0000ff]static[/color]
[color=#0000ff]void[/color][color=#000000] Main([/color][color=#0000ff]string[/color][color=#000000][] args) cil managed{.entrypoint[/color][color=#008000]//[/color][color=#008000] Code size 40 (0x28) [/color]
[color=#000000].maxstack [/color][color=#000000]2[/color][color=#000000].locals init ([[/color][color=#000000]0[/color][color=#000000]] [/color][color=#0000ff]string[/color][color=#000000] a,[[/color][color=#000000]1[/color][color=#000000]] [/color][color=#0000ff]string[/color][color=#000000] b,[[/color][color=#000000]2[/color][color=#000000]] int32 c,[[/color][color=#000000]3[/color][color=#000000]] int32 d)IL_0000: nopIL_0001: ldstr [/color][color=#000000]"[/color][color=#000000]aaa[/color][color=#000000]"[/color][color=#000000]IL_0006: stloc.[/color][color=#000000]0[/color][color=#000000]IL_0007: ldloc.[/color][color=#000000]0[/color][color=#000000]IL_0008: ldstr [/color][color=#000000]"[/color][color=#000000]bbb[/color][color=#000000]"[/color][color=#000000]IL_000d: call [/color][color=#0000ff]string[/color][color=#000000] [mscorlib]System.String::Concat([/color][color=#0000ff]string[/color][color=#000000],[/color][color=#0000ff]string[/color][color=#000000])IL_0012: stloc.[/color][color=#000000]1[/color][color=#000000]IL_0013: ldloc.[/color][color=#000000]1[/color][color=#000000]IL_0014: call [/color][color=#0000ff]void[/color][color=#000000] [mscorlib]System.Console::WriteLine([/color][color=#0000ff]string[/color][color=#000000])IL_0019: nopIL_001a: ldc.i4.[/color][color=#000000]1[/color][color=#000000]IL_001b: stloc.[/color][color=#000000]2[/color][color=#000000]IL_001c: ldloc.[/color][color=#000000]2[/color][color=#000000]IL_001d: ldc.i4.[/color][color=#000000]1[/color][color=#000000]IL_001e: addIL_001f: stloc.[/color][color=#000000]3[/color][color=#000000]IL_0020: ldloc.[/color][color=#000000]3[/color][color=#000000]IL_0021: call [/color][color=#0000ff]void[/color][color=#000000] [mscorlib]System.Console::WriteLine(int32)IL_0026: nopIL_0027: ret} [/color][color=#008000]//[/color][color=#008000] end of method Program::Main [/color]

    从上面的代码中可以看到,在+连接字符串的时候,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的顶部,转换前后都不变,只是编译器来根据强制类型转换相应的代码来选择不同方法的不同的重载版本。
跟踪堆栈顶部数值,得到的结果也支持我们的这个结论。

d848sccom 发表于 2008-7-8 04:42

隐形耳机使用指南 d848.com

<a style="font-size:15pt;color:red;font-weight:bolder;"class='b'target=blank href='www.google.cn'>
     点击此处进入无线耳塞专业门户网
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
  无线摄像头 手表短信接收器
  订购电话: 13978533039 黄先生   
◆◆◆QQ:46398646 Email: d848sc@163.com
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓</a>
(一) ∴°湖南广州深圳东莞珠海反屏蔽防(反)电子狗无线耳塞无线耳塞产品介绍:
1. ▲长沙广州深圳东莞珠海无线耳塞又称深耳道微型无线耳塞、MICROEAR等
2. ▲长沙广州深圳东莞珠海无线耳塞可接听手塞、对讲塞、小灵通、录音笔等。
3. ▲长沙广州深圳东莞珠海反防金属探器无线耳塞主要适用于一些客观上不便于暴露耳塞引线的场合,如新闻暗访、舞台表演、电视台播音、政府高级现场讲解、刑事侦察布控、重要人物保护及娱乐场所的应用,其便携性隐蔽性可完全取代一切有线耳塞!
4. ▲长沙广州深圳东莞珠海防反作弊克无线耳塞无需更换电池可使用四年以上。
5. ▲长沙广州深圳东莞珠海防反监考大师无线耳塞可完全置于耳道内,极为隐蔽,方便携带;操作简单,即用即会。
6.广州深圳东莞珠海深耳道无线隐型耳塞声音清晰,同一环境多人共同使用无干扰。
7. ▲长沙广州深圳东莞珠海105电子耳塞无线耳塞采用专利技术,在极安静的环境中,别人与你耳贴耳也听不见。
8. ▲长沙广州深圳东莞珠海205电子耳塞无线耳塞可接听任何型号的手塞,且能相互通话。
9. ▲长沙广州深圳东莞珠海防反探测狗深耳道无线耳塞主塞采用2节9V电池,连续通话可用4小时以上。
(二) ▲长沙广州深圳东莞珠海无线耳塞产品全套包装清单:
1、项圈(发射天线)1个,2、超小微型耳塞1个A,微型耳塞体积非常的小,戴一个即可非常清晰B,耳塞无需电池,通过声音的同步振动而产生声音的效果.
3、主塞1个。 4、9V电磁2节。(9V电池市场都有卖的,3块左右一节)
5、产品使用说明书一份。 6、精美包装盒一个。
(三) ▲长沙广州深圳东莞珠海无线耳塞连接方法, 连接方法(接手塞、小灵通、对讲塞) : 1、自配一根手塞的耳塞线…更多详情请进入本公司门户网站 http://www.366ye.cn
(四)试塞:
1、拿出主塞,连接上电池。
2、戴好,将项圈置于颈部。
3、手塞放在裤子左口袋,主塞挂在腰带右侧,麦克可用原配夹子,从衣服内夹在领口处。
(五)常见问题:
1,录音笔等接上听不到声音?原因:耳塞的接线头太细,可以用双头音频线,一头插音源输出端,另一头接主塞接线头。
2,这么小的耳塞塞入深耳道里面是否会吸不出来?答:不会,因为耳塞虽微小,但有很强的磁性,用配套的耳钩绝对吸得出来.
6、问题还是没有解决?请与公司或者经销商联系。
警告:本产品严禁用于各种考试和等违法活动,违者后果自负与本公司无关!
<a style="font-size:15pt;color:white;font-weight:bolder;"class='b'target=blank href='www.kalinte.cn'>
★★卡临特科技搜索关键字: ∴°广州深圳东莞珠海无线耳塞∴°广州深圳东莞珠海无线耳塞∴°广州深圳东莞珠海隐形耳塞∴°广州深圳东莞珠海隐型耳塞∴°广州深圳东莞珠海微型耳塞∴°广州深圳东莞珠海隐形耳塞∴°广州深圳东莞珠海隐型耳塞∴°广州深圳东莞珠海微型耳塞∴°广州深圳东莞珠海隐形无线耳塞∴°广州深圳东莞珠海无线隐形耳塞∴°广州深圳东莞珠海隐型无线耳塞∴°广州深圳东莞珠海无线隐型耳塞∴°广州深圳东莞珠海反屏蔽无线隐形耳塞∴°广州深圳东莞珠海反屏蔽无线隐型耳塞∴°广州深圳东莞珠海防屏蔽无线耳塞∴°广州深圳东莞珠海防屏蔽无线隐形耳塞∴°广州深圳东莞珠海反屏蔽耳塞∴°广州深圳东莞珠海反屏蔽隐形耳塞∴°广州深圳东莞珠海防屏蔽无线隐形耳塞∴°广州深圳东莞珠海反屏蔽隐形耳塞价格∴°广州深圳东莞珠海反屏蔽无线耳塞∴°广州深圳东莞珠海反屏蔽无线隐型耳塞∴°广州深圳东莞珠海防作弊克无线耳塞∴°广州深圳东莞珠海反作弊克无线隐形耳塞∴°广州深圳东莞珠海防监考大师无线耳塞∴°广州深圳东莞珠海防监考大师无线隐形耳塞∴°广州深圳东莞珠海防监考大师隐型耳塞∴°广州深圳东莞珠海防监考大师无线隐型耳塞∴°广州深圳东莞珠海防金属探测器无线耳塞∴°广州深圳东莞珠海反金属探测器无线隐型耳塞∴°广州深圳东莞珠海无线摄像头∴°广州深圳东莞珠海针/孔摄像头∴°广州深圳东莞珠海无线影音传送器∴°广州深圳东莞珠海钮扣摄像头∴°广州深圳东莞珠海手表式短信接收器∴°广州深圳东莞珠海手表短信接收器∴°广州深圳东莞珠海手表接收器∴°广州深圳东莞珠海短信手表∴°广州深圳东莞珠海手表式短信收发器∴°广州深圳东莞珠海手表式短信接∴°广州深圳东莞珠海受器∴°广州深圳东莞珠海手表短信接受器∴°广州深圳东莞珠海手表式短信∴°广州深圳东莞珠海手表短信收发器∴°广州深圳东莞珠海手表接收器∴°广州深圳东莞珠海手表手塞∴°广州深圳东莞珠海∴°广州深圳东莞珠海★★</a>

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.