繁体   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