在我可以安全地应用ToUpper(), StartWith()等方法之前,测试我所有的字符串为空是非常烦人的…
如果字符串的默认值是空字符串,我就不必测试,而且我觉得它与其他值类型(例如int或double)更一致。 此外,Nullable<String>也有意义。
那么为什么c#的设计者选择使用null作为字符串的默认值呢?
注意:这与这个问题有关,但更关注的是为什么,而不是如何处理它。
在我可以安全地应用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();
其他回答
string关键字可能使您感到困惑,因为它看起来与任何其他值类型声明完全相同,但它实际上是System的别名。在这个问题中解释的字符串。 此外,Visual Studio中的深蓝色和小写首字母可能会让人误以为它是结构体。
因为字符串变量是引用,而不是实例。
在默认情况下将其初始化为Empty是可能的,但这将在整个板上引入许多不一致。
既然你提到了ToUpper(),这种用法是我如何找到这个线程的,我将分享这个快捷方式(字符串??" ") .ToUpper ():
private string _city;
public string City
{
get
{
return (this._city ?? "").ToUpper();
}
set
{
this._city = value;
}
}
似乎比:
if(null != this._city)
{ this._city = this._city.ToUpper(); }
如果string的默认值是空字符串,我就不必进行测试
错了!更改默认值并不会改变它是引用类型的事实,并且有人仍然可以显式地将引用设置为空。
此外,Nullable<String>也有意义。
真正的点。不允许任何引用类型为空会更有意义,而需要Nullable<TheRefType>作为该特性。
那么为什么c#的设计者选择使用null作为字符串的默认值呢?
与其他引用类型的一致性。现在,为什么在引用类型中允许空呢?可能会让它感觉像C语言,尽管在一种也提供Nullable的语言中,这是一个有问题的设计决策。
从c# 6.0开始,您还可以使用以下代码
string myString = null;
string result = myString?.ToUpper();
字符串结果将为空。