空字符串的目的是什么?

时间:2010-03-29 20:19:36

标签: c# java .net language-agnostic programming-languages

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

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

  

另见:

     

8 个答案:

答案 0 :(得分:31)

空字符串在现实世界中非常常见 - 它们可用于区分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达到预期的{{1}}。

答案 1 :(得分:11)

为什么我们需要零?这真的是同一个问题。什么是“睡衣”没有所有的? “PJM”。什么是“a”没有所有的? “”。就那么简单。某些字符串操作的产物是一个没有任何字符的字符串,这是空字符串。它的行为与任何其他字符串一样 - 您可以轻松确定其长度;你可以将它连接到其他字符串,你可以计算其中的a等。

答案 2 :(得分:9)

如果未填充,有时您需要一个非null的字符串值。否则,对于您需要执行的任何给定的字符串相关任务,您必须包含一个空检查,它仅用于膨胀您的代码。

只是为了记录它,在C#中,鼓励在“”中指定string.Empty而不是硬编码。

编辑:正如LBushkin指出的那样,空值与未知值之间存在差异。

答案 3 :(得分:6)

有人可能会争辩说空字符串是Null Object Pattern的一个实例。正如安东尼指出的那样,这用于避免特殊情况和大量if s。

答案 4 :(得分:2)

它为字符串提供相同的目的,因为数字“0”用于整数。如果你没有零,你就不能记下你没有任何绵羊时的绵羊数量。同样,如果你没有空字符串,当你没有任何字符时,你不能记下你所拥有的字符的序列。

各种类似的代数定律适用:因为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 ...?

很多编程语言都错了,因为实现者并不认为空字符串很有意思。

答案 5 :(得分:1)

为什么我们需要xero?或空数组,空集(也称为空集)。当他们不在时,我们为什么要关心事情?

当他们不存在时,某些事情会更加引人入胜

如果我们无法表达任何值的值(与null的“未知值”非常不同),则无法表达某些事物

e.g

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,而不是在没有更多字母的情况下结束循环?

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

我之前没有听过抱怨这个。虽然null是特殊值,可以是任何对象的值,而空字符串是String。在null和空List或数组之间也可以进行类似的类比。