我理解String是一个对象,而不是Int,除非你创建对象,否则对象变量通常不指向任何东西。所以我知道它是如何运作的。
但是,就简单实用的编程而言,为什么.NET不将字符串初始化为空(“”),因为这肯定是字符串变量的最常见用法 - 作为字符串,而不是作为对象?
我从来没有(还)需要一个字符串为null,即“不是字符串”。这似乎是一种罕见的要求。我不能说int变量是null,那么为什么用string呢?毫无疑问,将它作为一个选项是必要的,但是为什么.NET在开始时为null,当int等给出正确的初始值时呢?
我在问,因为我不仅想了解某些事情是如何起作用的,而是为什么理解,因为它减少了我对它看起来多么奇怪的咆哮的渴望。 :)
答案 0 :(得分:7)
字符串未初始化为null
。您将初始化与声明混淆。每当你声明一个变量时:
Foo myFoo;
它开始为null,直到你实际调用它的构造函数。像这样:
Foo myFoo = new Foo();
现在传统上你没有为字符串类调用构造函数,你用这样的字符串文字实例化它们:
string myString = "foo";
虽然有一些字符串类的构造函数,但是它们都有一些字符/字节数组用于创建字符串。从未发生过这样的事情:
// initialize an empty string ("")
string myString = new string();
这是因为字符串类是不可变的,即一旦它被实例化你就永远无法改变它,你只能创建一个新的字符串并将你的变量设置为指向它(这是为什么string类的所有方法都返回一个新的字符串,而不是改变你调用方法的那个字符串。因此,初始化为某个默认值是没有意义的,因为一旦你这样做了,你就会被它困住。
答案 1 :(得分:4)
String
是参考类型。 所有引用类型的默认值为null
。这是由C#语言定义的,无法改变这种行为。
即使String
类的设计者希望 default(String)
的值为空字符串(我怀疑),也根本无法更改它。< / p>
答案 2 :(得分:0)
因为string
是引用类型,引用类型默认为null
。这只是一致的行为。如果它违反其他原因我会感到惊讶。
我可以想到一个例子,其中空字符串作为默认值实际上是有意义的。假设您正在为名称attribute
解析以下XML节点。
<node name=""/>
<node />
鉴于以下结构,如何区分2个节点?
struct Node
{
public string Name { get; }
}
对于<node name=""/>
,您的解析器会看到name
属性,然后将Node.Name
设置为string.Empty
。对于<node />
,您的解析器没有看到name
属性,也没有分配任何内容。
因此,第一个节点留下Node.Name==string.Empty
,第二个节点留下Node.Name==null
。这是有道理的。
答案 3 :(得分:-1)
问题与另一个问题Why is string a reference type?
有关当他们选择string
作为参考类型时,显然他们必须以default(string) == null
的方式制作default(any reference type) == null
。
一个更聪明的问题是“为什么字符串引用类型而不是例如struct String { private char[] MyInternalSting; }
?因为他们决定如此(即使我给出的链接提供了比真实原因更多的思维逻辑... 。就像“因为其他人,你不能做Object.ReferenceEquals
”,好像你可以使用数字和其他价值类型做Object.ReferenceEquals
。)
其他一些明智的问题可能是"A" + null == "A"
代替NullPointerException
或ArgumentNullException
的原因? (我无法找到智能响应......也许是为了与VB.NET兼容)