空字符串的目的是什么?
对我来说,作为开发人员和用户,我发现空字符串(“”)无用且引起很多混乱,就像说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()检查捆绑在一起的地方)。