在我可以安全地应用ToUpper(), StartWith()等方法之前,测试我所有的字符串为空是非常烦人的…

如果字符串的默认值是空字符串,我就不必测试,而且我觉得它与其他值类型(例如int或double)更一致。 此外,Nullable<String>也有意义。

那么为什么c#的设计者选择使用null作为字符串的默认值呢?

注意:这与这个问题有关,但更关注的是为什么,而不是如何处理它。


当前回答

为什么c#的设计者选择使用null作为的默认值 字符串?

因为字符串是引用类型,引用类型的默认值是null。引用类型的变量存储对实际数据的引用。

在这种情况下,让我们使用default关键字;

string str = default(string); 

STR是一个字符串,所以它是一个引用类型,所以默认值是null。

int str = (default)(int);

STR是int型,所以它是一个值类型,所以默认值是0。

其他回答

既然你提到了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(); }

你可以写一个扩展方法(为了它的价值):

public static string EmptyNull(this string str)
{
    return str ?? "";
}

现在这个工作很安全:

string str = null;
string upper = str.EmptyNull().ToUpper();

可空类型直到2.0才出现。

如果可空类型已经在语言的开始,那么字符串将是非空的和string?是可空的。但是他们不能做到向后兼容。

很多人谈论ref-type或不是ref type,但string是一个不寻常的类,并且已经找到了解决方案,使其成为可能。

如果string的默认值是空字符串,我就不必进行测试

错了!更改默认值并不会改变它是引用类型的事实,并且有人仍然可以显式地将引用设置为空。

此外,Nullable<String>也有意义。

真正的点。不允许任何引用类型为空会更有意义,而需要Nullable<TheRefType>作为该特性。

那么为什么c#的设计者选择使用null作为字符串的默认值呢?

与其他引用类型的一致性。现在,为什么在引用类型中允许空呢?可能会让它感觉像C语言,尽管在一种也提供Nullable的语言中,这是一个有问题的设计决策。

Habib是对的——因为字符串是引用类型。

但更重要的是,您不必每次使用它时都检查是否为null。如果有人给你的函数传递一个空引用,你可能应该抛出一个ArgumentNullException。

事情是这样的——无论如何,如果你试图对字符串调用. toupper(),框架都会为你抛出一个NullReferenceException。记住,即使你测试你的参数为空,这种情况仍然会发生,因为传递给你的函数作为参数的对象上的任何属性或方法都可能求值为空。

也就是说,检查空字符串或null是一件常见的事情,因此他们提供String.IsNullOrEmpty()和string . isnullowhitespace()仅用于此目的。