我有一个简单的问题,但我很惊讶.
此代码有效:
int itemID = 1;
string dirPath = @"C:\" + itemID + @"\abc";
Run Code Online (Sandbox Code Playgroud)
itemID.ToString()在这种情况下我为什么不这么做?
Cla*_*ies 13
来自MSDN
当一个或两个操作数的类型为字符串时,binary +运算符执行字符串连接.如果字符串连接的操作数为null,则替换空字符串.否则,通过调用从类型对象继承的虚拟ToString方法,将任何非字符串参数转换为其字符串表示形式.如果ToString返回null,则替换空字符串.
根据其他答案中的一些评论,扩展我的答案...
这个过程不仅仅是"语法糖"或方便.它是一个名为Operator Overloading的核心C#语言特性的结果.在+运算符和String +重载的情况下,提供重载作为抽象String类的内部的手段,这是良好设计原则的核心基础.+ String Overload通过确保它永远不返回空值来提供类型安全性,而是为任何无法使用该.ToString()方法转换的操作数返回空字符串.但是,即使是自定义复杂类型(不仅仅是基元)也可以添加到字符串中,假设它们有.ToString()重载,而不知道任何不同的String类型的实现.
运算符重载是一种主要的语言功能,更多人应该学会利用它的强大功能.
+在字符串连接中转换为string.Concat调用,在内部调用ToString每个对象的无参数.
该方法通过调用该对象的无参数ToString方法来连接args中的每个对象; 它不会添加任何分隔符.
编辑:
+运算符有许多重载.其中三个如下:
operator +(字符串a,字符串b)
operator +(字符串a,对象b)
operator +(对象a,字符串b)
您的代码正在使用运算符的第二个重载.
在确定为匹配后,该运算符将其转换为调用string.Concat,该调用可以将任意数量的对象(类型object)作为其参数.
在定义中string.Concat,它将调用ToString所有参数(在首先检查它们之后)以获取它们的字符串值,这就是将要连接的内容.
由于所有这些,您始终可以使用字符串连接任何对象,并且它将使用该对象的ToString方法进行编译和执行.
| 归档时间: |
|
| 查看次数: |
540 次 |
| 最近记录: |