• +运算符的一点探究


    问题起源于:有一个实体类,里面有个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";

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

  • 相关阅读:
    批量修改文件名
    查看数据库版本及当前登录用户是什么?
    安装mysql5.5时候的报错解决办法:
    mysql.sock的作用
    Linux系统编程15_C函数总结
    Linux系统编程14_信号和进程状态
    Linux系统编程13_CoreDump
    Linux系统编程12_标准库和POSIX标准头文件
    gcc使用
    http长链接短链接
  • 原文地址:https://www.cnblogs.com/jintianhu/p/1867119.html
Copyright © 2020-2023  润新知