[英]Why does my C# TestClass class complain (wrongly) that its parent doesn't have a parameterless constructor?
[英]Why does the String class not have a parameterless constructor?
int
和object
有一個無參數構造函數。 為什么不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.