C#添加字符串+ null不会抛出错误?

Nib*_*Pig 13 c#

作为一名程序员,我本以为这会抛出异常.是否有理由将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,则替换空字符串.

  • @SLC我想知道它是否与字符串是引用类型但在很多方面表现得像值类型这一事实有关(因为它们是不可变的).所以让它以这种方式运行(当使用+运算符时)符合这个概念. (2认同)

Dar*_*rov 7

+运算符在结果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)

  • 你知道为什么吗?因此,我们遇到了一个令人讨厌的错误,但并未引起注意。 (2认同)