+运算符的一点探究
时间:2010-11-02 来源:小小娟
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";
提示一下:加法运算符是从左到右计算的。
相关阅读 更多 +