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(); }