+运算符的一点探究
问题起源于:有一个实体类,里面有个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";
提示一下:加法运算符是从左到右计算的。
我的网站:http://i.goto327.top:85/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构