在我可以安全地应用ToUpper(), StartWith()等方法之前,测试我所有的字符串为空是非常烦人的…
如果字符串的默认值是空字符串,我就不必测试,而且我觉得它与其他值类型(例如int或double)更一致。 此外,Nullable<String>也有意义。
那么为什么c#的设计者选择使用null作为字符串的默认值呢?
注意:这与这个问题有关,但更关注的是为什么,而不是如何处理它。
在我可以安全地应用ToUpper(), StartWith()等方法之前,测试我所有的字符串为空是非常烦人的…
如果字符串的默认值是空字符串,我就不必测试,而且我觉得它与其他值类型(例如int或double)更一致。 此外,Nullable<String>也有意义。
那么为什么c#的设计者选择使用null作为字符串的默认值呢?
注意:这与这个问题有关,但更关注的是为什么,而不是如何处理它。
当前回答
String是一个不可变对象,这意味着当给定一个值时,旧的值不会从内存中删除,而是保留在旧的位置,而新值则放在新的位置。如果String a的默认值是String。空,它将浪费字符串。当它被赋予第一个值时,内存中的空块。
虽然它看起来微不足道,但在初始化一个默认值为String.Empty的大型字符串数组时,它可能会变成一个问题。当然,如果这将成为一个问题,您总是可以使用可变的StringBuilder类。
其他回答
你可以写一个扩展方法(为了它的价值):
public static string EmptyNull(this string str)
{
return str ?? "";
}
现在这个工作很安全:
string str = null;
string upper = str.EmptyNull().ToUpper();
也许你可以用??运算符赋值字符串变量时,它可能会有帮助。
string str = SomeMethodThatReturnsaString() ?? "";
// if SomeMethodThatReturnsaString() returns a null value, "" is assigned to str.
为什么c#的设计者选择使用null作为的默认值 字符串?
因为字符串是引用类型,引用类型的默认值是null。引用类型的变量存储对实际数据的引用。
在这种情况下,让我们使用default关键字;
string str = default(string);
STR是一个字符串,所以它是一个引用类型,所以默认值是null。
int str = (default)(int);
STR是int型,所以它是一个值类型,所以默认值是0。
因为字符串是一个引用类型,引用类型的默认值是null。
为什么字符串类型的默认值为空而不是空 字符串?
因为string是一个引用类型,所有引用类型的默认值都是null。
在我可以之前,测试我所有的字符串是否为null是非常烦人的 安全应用方法,如ToUpper(), StartWith()等…
这与引用类型的行为一致。在调用它们的实例成员之前,应该对空引用进行检查。
如果string的默认值是空字符串,我就不会有 来测试,我觉得它和另一个更一致 例如int或double这样的值类型。
将默认值分配给一个特定的引用类型而不是null会使它不一致。
此外,Nullable<String>也有意义。
Nullable<T>适用于值类型。值得注意的是,Nullable并没有在最初的。net平台上引入,所以如果他们改变了这一规则,就会有很多坏代码。(礼貌@jcolebrand)