空字符串的目的是什么?

对我来说,作为开发人员和用户,我发现空字符串(“”)无用且引起很多混乱,就像说string == char []

也许计算机需要空字符串,所以我想了解原因。

也可以看看:

  • 默认字符串初始化:NULL还是Empty?
  • 最佳实践:函数应该返回null还是空对象?

有人可能会争辩说空字符串是Null对象模式的一个实例。 正如安东尼指出的那样,这用于避免特殊情况和许多情况。

空字符串在现实世界中非常常见 – 它们可用于区分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指出的那样,有一个空值与一个未知值之间存在差异。

它对字符串起着相同的作用,因为数字“零”用于整数。 如果你没有零,那么当你没有任何绵羊时,你就无法记下你拥有的绵羊数量。 同样,如果你没有空字符串,当你没有任何字符时,你不能记下你所拥有的字符的序列。

各种类似的代数定律适用:因为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是特殊值,可以是任何对象的值,而空字符串是String 。 类似的类比也可以在null和空List或数组之间绘制。

如果从函数返回一个空字符串,则表示该函数执行了它的目的,结果是一个空字符串。 如果函数未能构造一个字符串,那么它可能返回一个null(取决于函数的契约 – 它可能会抛出exception)。 在这种情况下,null和空字符串具有不同的含义。

另一方面是函数参数 – 如果字符串参数是可选的,那么你必须进行空检查(这是它通常与emptyString()检查捆绑在一起的地方)。

Interesting Posts