+运算符的一点探究

问题起源于:有一个实体类,里面有个string的属性,比如这样

class Demo
{
public string str { get; set; }
}

Demo d
= new Demo();
d.str
+= "xxxxx";

实例化后直接对str属性进行加法操作,原先我一直这么写。但是某天突然想到:实例化Demo对象后str的值是null,进行加法操作怎么没出错呢?

于是先找到MSDN中对加法的解释:

+ 运算符既可作为一元运算符也可作为二元运算符。
一元
+ 运算符是为所有数值类型预定义的。对数值类型进行一元 + 运算的结果就是操作数的值。
为数值类型和字符串类型预定义了二元
+ 运算符。对于数值类型,+ 计算两个操作数之和。当其中的一个操作数是字符串类型或两个操作数都是字符串类型时,+ 将操作数的字符串表示形式串联在一起。
委托类型也提供二元
+ 运算符,该运算符执行委托串联。

一元的就不管它了,我们来看二元的。字符串预置了+运算符,其实就是调用String.Concat方法来进行相加,经过反编译可得知,里面运算时将null当做String.Empty空字符串来处理的,因此直接对属性str进行加法操作不会出错。

而当字符串与其它数据类型相加时,先将调用其它数据类型的ToString()方法来转成字符串,再进行相加。

数值型相加就比较简单了,但是有一个注意的地方时是数值型与null相加,结果是null。其实2+null,编译器会去寻找最匹配的+运算符重载,于是找到了int+int?,这里编译器将null当做int?,于是可以相加,证据见下图:

 

 

最后举几个综合例子:

1 + 1 + "x" = "2x";
"x" + 1 + 1 = "x11";
1 + null + 1 + "x" = "x";
"x" + null + 1 + 1 = "x11";

提示一下:加法运算符是从左到右计算的。

 

 

 

 

 

 

posted on 2010-11-02 14:25  小小娟  阅读(410)  评论(1编辑  收藏  举报

导航