作为一名程序员,我本以为这会抛出异常.是否有理由将null视为""?
string s = "hello";
string t = null;
Console.WriteLine(s + t);
Run Code Online (Sandbox Code Playgroud)
输出:
你好
只是为了强调我的问题,你知道为什么决定将null变为String.Empty吗?我期待一些字符串被添加,但是有一个问题进一步回到它没有正确检索它并返回null.问题没有被注意到!
这是一个伪代码,为什么我认为它是坏的(为什么我发现没有错误感到震惊):
您可以假设我重载了ToString以提供该人员的姓名或有关他们的详细信息.
Person p = PersonDatabase.GetForName("Jimmy Gibbs");
Console.WriteLine("Name is: " + p.ToString());
Run Code Online (Sandbox Code Playgroud)
抛出异常,因为p为null
String p = PersonDatabase.GetForName("Jimmy Gibbs").Name;
Console.WriteLine("Name is: " + p);
Run Code Online (Sandbox Code Playgroud)
即使p为null(它将其视为""),也不会抛出异常.
(如果你想挑剔并说我将无法获得Name,因为GetforName将为null,请将其视为此:)
String p = PersonDatabase.GetNameFromID(1234); // Returns a string or null if not found
Console.WriteLine("Name is: " + p);
Run Code Online (Sandbox Code Playgroud)
(如果你在列表或数组中使用这个值,你最终会得到一个空白条目,这对我来说是破坏的,它创建了javascript并尝试按ID"ID"获取元素)
Ani*_*Ani 21
来自C#语言规范:
7.8.4加法运算符
字符串连接:
string operator +(string x,string y); string operator +(string x,object y); string operator +(object x,string y);
二进制+运算符的这些重载执行字符串连接. 如果字符串连接的操作数为null,则替换空字符串.否则,通过调用从类型对象继承的虚拟ToString方法,将任何非字符串参数转换为其字符串表示形式.如果ToString返回null,则替换空字符串.
+运算符在结果IL中作为string.Concat发出.
s + t = string.Concat(s, t)
Run Code Online (Sandbox Code Playgroud)
在查看实现时,它会检查参数是否为null并返回string.Empty:
用反射器拆卸:
[SecuritySafeCritical]
public static string Concat(string str0, string str1)
{
if (IsNullOrEmpty(str0))
{
if (IsNullOrEmpty(str1))
{
return Empty;
}
return str1;
}
if (IsNullOrEmpty(str1))
{
return str0;
}
int length = str0.Length;
string dest = FastAllocateString(length + str1.Length);
FillStringChecked(dest, 0, str0);
FillStringChecked(dest, length, str1);
return dest;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9486 次 |
| 最近记录: |