C# 为什么字符串类型的默认值为null而不是空字符串?
在我可以安全地应用像C# 为什么字符串类型的默认值为null而不是空字符串?,c#,string,default-value,C#,String,Default Value,在我可以安全地应用像ToUpper(),StartWith()等方法之前,测试所有字符串的null是非常烦人的 如果string的默认值是空字符串,我就不必进行测试,我会觉得它与其他值类型(例如int或double)更加一致。 另外,Nullable也有意义 那么为什么C#的设计者选择使用null作为字符串的默认值呢 注意:这与为什么有关,但更侧重于为什么,而不是如何处理它 为什么字符串类型的默认值为null而不是空值 绳子 因为string是引用类型,所有引用类型的默认值都是null 在我可以
ToUpper()
,StartWith()
等方法之前,测试所有字符串的null
是非常烦人的
如果string
的默认值是空字符串,我就不必进行测试,我会觉得它与其他值类型(例如int
或double
)更加一致。
另外,Nullable
也有意义
那么为什么C#的设计者选择使用null
作为字符串的默认值呢
注意:这与为什么有关,但更侧重于为什么,而不是如何处理它
为什么字符串类型的默认值为null而不是空值
绳子
因为string
是引用类型,所有引用类型的默认值都是null
在我可以之前测试我所有的字符串是否为null是很烦人的
安全地应用ToUpper()、StartWith()等方法
这与引用类型的行为一致。在调用实例成员之前,应该检查空引用
如果string的默认值是空字符串,则我不会
来测试,我会觉得它更符合其他
例如,int或double等值类型
将默认值指定给除null
之外的特定引用类型将使其不一致
另外,Nullable
也有意义
使用值类型。值得注意的是,
Nullable
并没有在原始版本中引入,因此如果他们更改了该规则,可能会有很多错误的代码。(礼貌)因为字符串变量是引用,而不是实例
默认情况下将其初始化为空是可能的,但这会在整个电路板上引入许多不一致的情况
为什么C#的设计者选择使用null作为
弦
因为字符串是引用类型,所以引用类型是默认值null
。引用类型的变量存储对实际数据的引用
让我们为这个案例使用关键字
string str = default(string);
str
是一个字符串
,因此它是一个引用类型,因此默认值为null
int str = (default)(int);
str
是一个int
,所以它是一个值类型,所以默认值是zero
Habib是正确的,因为字符串
是一个引用类型
但更重要的是,您不必每次使用它时都检查null
。但是,如果有人向您的函数传递了一个null
引用,您可能应该抛出一个ArgumentNullException
事情是这样的——如果您试图在字符串上调用.ToUpper()
,框架无论如何都会为您抛出一个NullReferenceException
。请记住,即使您测试null
的参数,这种情况仍然可能发生,因为作为参数传递给函数的对象上的任何属性或方法的计算结果都可能为null
int str = (default)(int);
也就是说,检查空字符串或空值是一件很常见的事情,因此它们提供并仅用于此目的。您可以编写一个(无论如何):
现在它可以安全地工作了:
string str = null;
string upper = str.EmptyNull().ToUpper();
空字符串和空字符串是根本不同的。null表示缺少值,空字符串表示空值 编程语言假设变量的“值”(在本例中为空字符串),这与使用不会导致空引用问题的任何其他值初始化字符串一样好 此外,如果您将该字符串变量的句柄传递给应用程序的其他部分,那么该代码将无法验证您是有意传递了空值还是忘记填充该变量的值 另一个可能出现问题的情况是,字符串是某个函数的返回值。由于string是一种引用类型,从技术上讲,它的值可以同时为null和empty,因此从技术上讲,函数也可以返回null或empty(没有什么可以阻止它这样做)。现在,由于“缺少值”有两个概念,即空字符串和null,因此使用此函数的所有代码都必须进行两次检查。一个表示空,另一个表示空 简言之,一个状态只有一个表示总是好的。有关空值和空值的更广泛讨论,请参阅下面的链接
可能是
string
关键字让您感到困惑,因为它看起来与任何其他值类型声明完全相同,但实际上它是System.string
的别名,如中所述。此外,Visual Studio中的深蓝色和小写的第一个字母可能会使人误以为它是一个
结构
如果string
的默认值是空字符串,我就不必进行测试
错了!更改默认值不会改变它是引用类型的事实,并且有人仍然可以显式地将引用设置为null
int str = (default)(int);
另外,Nullable
也有意义
没错。对于任何引用类型,不允许null
,而要求该特性使用null
,这样做更有意义
那么为什么C#的设计者选择使用null
作为字符串的默认值呢
与其他引用类型的一致性。现在,为什么在引用类型中允许null
?可能是这样的,它感觉像是C,尽管这是一个值得怀疑的设计决策,它的语言也提供了Nullable
基本原因/问题是CLS规范(whi)的设计者
string str = SomeMethodThatReturnsaString() ?? "";
// if SomeMethodThatReturnsaString() returns a null value, "" is assigned to str.
private string _city;
public string City
{
get
{
return (this._city ?? "").ToUpper();
}
set
{
this._city = value;
}
}
if(null != this._city)
{ this._city = this._city.ToUpper(); }