在我可以安全地应用 ToUpper()
、StartWith()
等方法之前,测试所有字符串是否为 null
很烦人。
如果默认值的 string
是空字符串,则我不必进行测试,并且这会更加符合其他值类型(例如 int
或 double
)的一致性。此外,Nullable<String>
也是有意义的。
那么,为什么 C# 的设计者选择使用 null
作为字符串的默认值呢?
注意:这与这个问题相关,但更专注于为什么而不是该怎么做。
在我可以安全地应用 ToUpper()
、StartWith()
等方法之前,测试所有字符串是否为 null
很烦人。
如果默认值的 string
是空字符串,则我不必进行测试,并且这会更加符合其他值类型(例如 int
或 double
)的一致性。此外,Nullable<String>
也是有意义的。
那么,为什么 C# 的设计者选择使用 null
作为字符串的默认值呢?
注意:这与这个问题相关,但更专注于为什么而不是该怎么做。
String a
的默认值是String.Empty
,那么当它被赋予第一个值时,它会浪费内存中的String.Empty
块。String.Empty
作为默认值初始化大量字符串数组时,它可能会成为问题。当然,如果这将成为一个问题,您总是可以使用可变的StringBuilder
类。String.Empty
的指针。我理解得对吗? - Dan Burton字符串
的默认值为空字符串的唯一方法是允许全零位作为空字符串的表示方式。有许多实现方式,但我认为没有一种方式涉及初始化对 String.Empty
的引用。 - supercatString.Empty
或""
这样的东西。 - djvstring
存储位置的初始化行为还需要更改所有具有string
类型字段的结构体或类的初始化行为。这将代表.NET设计中相当大的变化,目前期望对任何类型进行零初始化,甚至不必考虑它是什么,只需保存其总大小即可。 - supercat由于字符串是引用类型,引用类型的默认值为null。
既然您提到了 ToUpper()
,而且正是通过这种用法我找到了这个线程,那么我会分享这个快捷方式 (string ?? "").ToUpper():
private string _city;
public string City
{
get
{
return (this._city ?? "").ToUpper();
}
set
{
this._city = value;
}
}
Seems better than:
if(null != this._city)
{ this._city = this._city.ToUpper(); }
string
这个关键字把你搞糊涂了,因为它看起来和其他 值类型 的声明一模一样,但实际上它只是 System.String
的别名,详细解释可以参考 this question。struct
。object
”关键字难道不也是如此吗?虽然必须承认,它比“string
”用得少。 - user395760int
是System.Int32
的别名,你想说什么呢? :) - ThorarinSystem.Int32
是一个Struct
,因此具有默认值,而System.String
是一个Class
,具有指针和默认值为null
。它们在视觉上以相同的字体/颜色呈现。如果没有知识,人们可能会认为它们的作用方式相同(=具有默认值)。我的答案是基于认知心理学思想编写的 :-) - Alessandro Da Rugna可空类型直到2.0版本才出现。
如果在语言开始时就有可空类型,那么字符串将是不可空的,而string?将是可空的。但由于向后兼容性,他们无法这样做。
很多人谈论引用类型或非引用类型,但字符串是一个特殊的类,解决方案会被找到使其成为可能。