簡體   English   中英

空字符串的目的是什么?

[英]What's the purpose of the empty string?

對我來說,作為開發人員和用戶,我發現空字符串(“”)無用且引起很多混亂,就像說string == char []

也許計算機需要空字符串,所以我想了解原因。

也可以看看:

空字符串在現實世界中非常常見 - 它們可用於區分null。

  • Null表示該值未定義或未知。

  • 空字符串表示它已知為空(空)。

它可能看起來像分裂頭發,但有一點不同。 空字符串是對象的實例 - 空值不是。 您可以使用可以在字符串對象上調用的任何有效方法來操作空字符串。 你無法操縱null。 空字符串通常是對其他字符串進行某些操作的結果,例如:

var source = "Hello";
var result = source.Remove("Hello");  // result is now: ""

以下是一個簡單的示例,其中包含以下內容:具有通過文本框收集人員中間名的表單的應用程序。 文本框的值應該為null還是空字符串? 總是讓文本框返回一個空字符串作為其值(當為空時)而不是嘗試區分null和“”更容易。

有趣的是,有些數據庫不區分NULL和空字符串 - 最好的例子是Oracle。 在Oracle中:

INSERT into MYTABLE(name) VALUES('')

實際上在表中插入一個NULL。 實際上,當編寫從.NET中的數據庫操作數據的代碼時,這可能會產生令人困惑的情況 - 有時候你會得到DBNull.Value所在的String

為什么我們需要零? 這真的是同一個問題。 什么是“睡衣”沒有所有的? “PJM”。 什么是“a”沒有所有的? “”。 就那么簡單。 某些字符串操作的產物是一個沒有任何字符的字符串,這是空字符串。 它的行為與任何其他字符串一樣 - 您可以輕松確定其長度; 你可以將它連接到其他字符串,你可以計算其中的a,等等。

有時,如果未填充,則需要一個非null的字符串值。 否則,對於您需要執行的任何給定的字符串相關任務,您必須包含一個空檢查,它僅用於膨脹您的代碼。

只是為了記錄它,在C#中,鼓勵在“”中指定string.Empty而不是硬編碼。

編輯:正如LBushkin指出的那樣,有一個空值與一個未知值之間存在差異。

有人可能會爭辯說空字符串是Null對象模式的一個實例。 安東尼指出,這是為了避免特殊情況和大量的if秒。

它對字符串起着相同的作用,因為數字“零”用於整數。 如果你沒有零,你就不能記下你沒有任何綿羊時的綿羊數量。 同樣,如果你沒有空字符串,當你沒有任何字符時,你不能寫下你擁有的字符的序列。

各種類似的代數定律適用:因為X + 0與X相同,Y cat“”與Y相同,等等。

讓我們談談子串。 如果我有字符串“abc”,那么

substring("abc",1,3)  is  "abc"
substring("abc",1,2)  is  "ab"
substring("abc",1,1)  is  "a"
substring("abc",1,0)  is ...?

另一個有趣的案例

substring("abc",1,3) is "abc"
substring("abc",2,2) is "bc"
substring("abc",3,1) is "c"
substring("abc",4,0) is ...?

很多編程語言都錯了,因為實現者並不認為空字符串很有趣。

為什么我們需要xero? 或空數組,空集(也稱為空集)。 當他們不在時,我們為什么要關心事情呢?

當他們不存在時,某些事情會更加有趣

如果我們不能表達任何東西的價值(這與null的“未知值”非常不同,那么就無法表達某些東西

例如

string allUpperCaseLetters = "";
for(byte i = 'A';i<'Z';i++)
{
  allUpperCaseLetters += (char)i;
}

如果你說unknow plus(char)i,結果仍然是未知的,但是“”+“A”是“A”。 1 +未知有多大? 當一個加法可以纏繞你甚至不能說1 + A大於A(如果A未知)

如果我們沒有“”那么一些操作會非常奇怪

string letters = allUpperCaseLetters;
for(;i>0;)
{
  int i = letters.Length
  Console.WriteLine(letters[0]);
  letters = letters.Substring(1);
}

你為什么要在循環中的第一行拋出NullReferenceException而不是在沒有更多字母的情況下結束循環?

如果從函數返回一個空字符串,則表示該函數執行了它的目的,結果是一個空字符串。 如果函數未能構造一個字符串,那么它可能返回一個null(取決於函數的契約 - 它可能拋出異常)。 在這種情況下,null和空字符串具有不同的含義。

另一方面是函數參數 - 如果字符串參數是可選的,那么你必須進行空檢查(這是它通常與emptyString()檢查捆綁在一起的地方)。

我之前沒有聽過抱怨這個。 null是特殊值,可以是任何對象的值,而空字符串是String 類似的類比也可以在null和空List或數組之間繪制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM