繁体   English   中英

为什么String类没有无参数构造函数?

[英]Why does the String class not have a parameterless constructor?

intobject有一个无参数构造函数。 为什么不string

因为没有必要这样做。

string是不可变的。 创建一个空string是没用的。

MSDN

字符串是不可变的 - 在创建对象后,字符串对象的内容无法更改,尽管语法使其看起来好像可以执行此操作。

正如Jonathan Lonowski指出的那样,我们有string.Empty

字符串是不可变的,因此new String()没有任何意义。 你会怎么做?

如前所述,字符串是不可变的,因此如果你操纵一个字符串,你每次都会创建一个新字符串。

例:

string s = "str"; // str was created in the memory.
s += "2"; // str2 was created in the memory.

当你想操纵字符串时使用StringBuilder (这就是为什么你想要一个空的ctor,对吧?)

更新:

为您提供更多信息。

你没有带string的空构造函数,但是你有String.Empty 原因是因为string不可变对象 ,您修改的string每个实例实际上都在内存中创建一个新string

例如: string name = ""; 虽然它是一个空string但它仍然可以容纳大约20个字节 其中string.Empty只能容纳八个字节 因此,虽然它们意味着相同的东西,但一个比另一个更有效。

但是我相信你想要一个空的构造函数来进行可能更常被StringBuilder处理的操作。 这里可以找到一些非常好的用法(确定性能命中/使用)。

有关string一些其他信息可以在这里找到。 它们是不可变的,因此事后不能改变内容

例:

string first = "Greg "; // Creates string "first" in memory.
string last = "Arrigotti "; // Creates string "last" in memory.
string name = first + last; // Creates string "name" in memory.

在编辑其中一个时,它只是在内存中创建一个全新的string 如果您正在寻找一种可能在例如不存在中间名的字段中处理用户数据的方法,则空字符串可能包含有效用法。

希望这些指向正确的方向。

为什么呢?

string类型提供无参数构造函数是完全合乎逻辑和理性的,但它没有。

原因是因为那种类型的设计师认为拥有string.Empty会更好。

可能有逻辑上的原因使得能够构造多个不同实例的空字符串。 我没有看到我的头顶,但这并不意味着别人看不到一个。

将使用限制为string.Empty原因有一些技术原因string.Empty可能是个好主意。 首先,所有空字符串都被认为是相等的,但不一定是ReferenceEquals ,所以有多个空字符串似乎没有意义。 第二个你说“我有这两个看似相似的东西,但我对每个人都有不同的含义”,那么也许你试图用错误的工具解决问题。

还有一些关于拥有预定义string.Empty 每当你引用它时,你引用的是与其他每个地方相同的对象实例,因此你在内存中没有很多空(和相同的)字符串对象。

但它可以做到吗? 当然。

所以虽然这里的每个人都试图证明应该没有这样的构造函数,但我说可能会有这样的构造函数。

然而,有人决定设计没有一个类型。

此外,还有一个已定义的常量: String.Empty

int是一个值类型,因此它必须具有无参数构造函数。 这里没有考虑到。

object没有理由有什么,但参数的构造函数。 没有数据可以提供。 你期望它采取什么参数? 用无参数构造函数构造的对象也有目的; 例如,它们被用作lock对象。 然而它是一个类,所以它不需要有一个公共的无参数构造函数,但是因为它不需要参数,所以它是一个问题,你是否想要构造它的实例; 微软选择使其具体化,而不是抽象化。

string是一个类,因此不需要具有无参数构造函数。 建立它的团队根本不需要有一个。 可以合理地使用这样的构造函数来创建一个空字符串,但是他们选择公开string.Empty (以及一个空字符串文字)作为显式创建空字符串的方法。 这些选项比无参数构造函数具有更高的清晰度。

string.Empty和空文字字符串的另一个显着优点是它们能够重用相同的字符串实例。 由于字符串是不可变的,因此观察两个不同的空字符串引用之间差异的唯一方法是使用ReferenceEquals (或实例上的lock )。 因为实际上从来没有必要尽可能地对空字符串进行不同的引用,所以删除无参数构造函数会消除构造空字符串的等效但性能较差的方法的可能性。 在极不可能的情况下,构造一个空字符串的新字符串实例很重要,可以将空的char数组传递给相关的构造函数重载,因此删除无参数构造函数不会从最终用户中删除任何功能。 如果你想做一些非常不寻常的事情,这只会迫使你不顾一切地去做一些非常不寻常的事情,这是良好语言设计的标志。

如果您知道该字符串是不可移植的,则可以将您的问题重新表述为以下内容:

为什么我不能发起一个空对象?

回答:

因为没有空对象:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM