为什么String类没有无参数构造函数
本文关键字:参数 构造函数 String 为什么 | 更新日期: 2023-09-27 18:01:02
int
和object
有一个无参数构造函数。为什么不string
?
因为这样做毫无意义。
string
是不可变的。创建一个空的string
是没有用的。
MSDN:
字符串是不可变的——创建对象后,不能更改字符串对象的内容,尽管语法使其看起来像可以这样做。
正如Jonathan Lonowski所指出的,我们有string.Empty
。
更新:
为您提供更多信息。
您没有一个带有string
的空构造函数,但是您有String.Empty
。原因是string
是一个不可变的对象您修改的string
的每个实例实际上都在内存中创建一个新的string
。
例如:string name = "";
尽管它是一个空的string
,但它仍将容纳大约二十个字节。其中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
。例如,如果您正在寻找一种可能处理不存在中间名的字段中的用户数据的方法,则空字符串可能包含有效用法。
希望这些能为你指明正确的方向。
字符串是不可变的,因此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.Empty
可能是个好主意,这背后有一些技术原因。首先,所有空字符串都被认为是相等的,尽管不一定是ReferenceEquals
,所以拥有多个空字符串似乎毫无意义。当你说"我有这两个看似相似的东西,但我对每一个都赋予了不同的含义"时,也许你试图用错误的工具解决问题。
还有一些预定义string.Empty
的好处。无论何时引用它,都是在引用与其他地方相同的对象实例,因此内存中没有很多空的(相同的)字符串对象。
但它能做到吗?当然
因此,虽然这里的每个人都试图证明应该没有这样的构造函数,但我想说的是,可以有这样的构造函数。
然而,有人决定设计没有一个的类型。
此外,已经为此定义了一个常数:String.Empty
int
是一个值类型,因此它必须具有无参数构造函数。这里不能考虑。
object
没有理由拥有任何,但是一个无参数构造函数。没有数据可以提供。你希望它需要什么参数?用无参数构造函数构造的对象也有目的;例如,它们被用作上lock
的对象。然而,它是一个类,所以它不需要有一个公共的无参数构造函数,但是由于它不需要参数,所以问题是你是否希望构建它的实例;微软选择将其具体化,而不是抽象化。
string
是一个类,因此不需要具有无参数构造函数。它的团队建设根本没有必要拥有一个。可以合理地使用这样的构造函数来创建空字符串,但他们选择公开string.Empty
(以及空字符串文字)作为显式创建空字符串的一种方式。与无参数构造函数相比,这些选项提高了清晰度。
string.Empty
和空文本字符串的另一个非常显著的优点是,它们能够重新使用相同的字符串实例。由于字符串是不可变的,观察对空字符串的两个不同引用之间差异的唯一方法是使用ReferenceEquals
(或实例上的lock
)。因为实际上从来没有必要特意对空字符串进行不同的引用,所以删除无参数构造函数可以消除构造空字符串的等效但性能较差的方法的可能性。在极不可能的情况下,构造一个空字符串的新字符串实例很重要,可以将一个空的char数组传递给相关的构造函数重载,因此删除无参数构造函数不会删除最终用户的任何功能;如果你想做一些非常不寻常的事情,它只是迫使你去做一些非常不同寻常的事情,这是良好语言设计的标志。
如果你知道字符串是免疫的,你的问题可以改写为:
为什么我不能启动一个空对象??
答案:
因为没有空对象:)