在.NET中,字符串初始化为null的基本原理是什么?

ing*_*939 5 .net string initialization

我理解String是一个对象,而不是Int,除非你创建对象,否则对象变量通常不指向任何东西.所以我知道它是如何工作的.

但是,就简单实用的编程而言,为什么.NET不将字符串初始化为空(""),因为这肯定是字符串变量的最常见用法 - 作为字符串,而不是作为对象?

我从来没有(还)需要一个字符串为null,即"不是字符串".这似乎是一种罕见的要求.我不能说int变量是null,那么为什么用string呢?毫无疑问,将它作为一个选项是必要的,但是为什么.NET开始时为null,当int等给出正确的初始值时?

我问,因为我不仅想了解某些事情是如何运作的,而是为什么,因为它减少了我对它看起来多么奇怪的咆哮的渴望.:)

Mat*_*hew 7

字符串未初始化为null.您将初始化与声明混淆.每当你声明一个变量时:

 Foo myFoo;
Run Code Online (Sandbox Code Playgroud)

它开始为null,直到你实际调用它的构造函数.像这样:

Foo myFoo = new Foo();
Run Code Online (Sandbox Code Playgroud)

现在传统上你不为字符串类调用构造函数,你用字符串文字实例化它们,如下所示:

string myString = "foo";
Run Code Online (Sandbox Code Playgroud)

虽然有一些字符串类的构造函数,但是它们都使用一些字符/字节数来创建字符串.从未发生过这样的事情:

// initialize an empty string ("")
string myString = new string();
Run Code Online (Sandbox Code Playgroud)

这是因为字符串类是不可变的,即一旦它被实例化你永远不能改变它,你只能创建一个新的字符串并设置你的变量指向它(这就是为什么字符串类的所有方法都返回一个新字符串而不是更改您调用方法的字符串).因此,初始化为某个默认值是没有意义的,因为一旦你这样做了,你就会被它困住.

  • 如果string是类的成员,即使您没有明确地给它一个文字值,它也会被初始化为null (3认同)
  • +1,虽然如果在方法体中声明一个对象,它是未初始化的,而不是null. (3认同)
  • +1.这个答案使这成为一个很好的问题. (2认同)

Mar*_*ers 4

String是一个引用类型。所有引用类型的默认值为null。这是由 C# 语言定义的,无法更改此行为。

即使该类的设计者String希望default(String)是空字符串(我对此表示怀疑),也根本不可能更改它。