簡體   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