在我可以安全地应用ToUpper(), StartWith()等方法之前,测试我所有的字符串为空是非常烦人的…

如果字符串的默认值是空字符串,我就不必测试,而且我觉得它与其他值类型(例如int或double)更一致。 此外,Nullable<String>也有意义。

那么为什么c#的设计者选择使用null作为字符串的默认值呢?

注意:这与这个问题有关,但更关注的是为什么,而不是如何处理它。


当前回答

你可以写一个扩展方法(为了它的价值):

public static string EmptyNull(this string str)
{
    return str ?? "";
}

现在这个工作很安全:

string str = null;
string upper = str.EmptyNull().ToUpper();

其他回答

从c# 6.0开始,您还可以使用以下代码

string myString = null;
string result = myString?.ToUpper();

字符串结果将为空。

如果string的默认值是空字符串,我就不必进行测试

错了!更改默认值并不会改变它是引用类型的事实,并且有人仍然可以显式地将引用设置为空。

此外,Nullable<String>也有意义。

真正的点。不允许任何引用类型为空会更有意义,而需要Nullable<TheRefType>作为该特性。

那么为什么c#的设计者选择使用null作为字符串的默认值呢?

与其他引用类型的一致性。现在,为什么在引用类型中允许空呢?可能会让它感觉像C语言,尽管在一种也提供Nullable的语言中,这是一个有问题的设计决策。

String是一个不可变对象,这意味着当给定一个值时,旧的值不会从内存中删除,而是保留在旧的位置,而新值则放在新的位置。如果String a的默认值是String。空,它将浪费字符串。当它被赋予第一个值时,内存中的空块。

虽然它看起来微不足道,但在初始化一个默认值为String.Empty的大型字符串数组时,它可能会变成一个问题。当然,如果这将成为一个问题,您总是可以使用可变的StringBuilder类。

也许你可以用??运算符赋值字符串变量时,它可能会有帮助。

string str = SomeMethodThatReturnsaString() ?? "";
// if SomeMethodThatReturnsaString() returns a null value, "" is assigned to str.

string关键字可能使您感到困惑,因为它看起来与任何其他值类型声明完全相同,但它实际上是System的别名。在这个问题中解释的字符串。 此外,Visual Studio中的深蓝色和小写首字母可能会让人误以为它是结构体。