为什么"abcd".StartsWith("")返回真的吗?
-
02-07-2019 - |
题
标题是整个问题。有人能给我一个理由为什么会这样?
解决方案
是的-因为它并开始与empty string.事实上,空串逻辑之间发生的每一对字。
把它这样说:什么定义"开始"你能给这将排除这个吗?这里有一个简单的定义"开始"不:
"x始y如果第一 y.Length
人物的x相匹配的。"
一个替代(等)定义:
"x始y如果 x.Substring(0, y.Length).Equals(y)
"
其他提示
我将尝试详细说明Jon Skeet所说的内容。
假设x,y和z是字符串而+运算符实际上是连接,那么:
如果我们可以将z分割为写z = x + y,这意味着z以x开头。 因为每个字符串z可以拆分为z =“"” + z因此,每个字符串都以“"”开头。
因此,因为(“" +”abcd")==" abcd"它遵循“abcd”。以“"”开头。
此方法将value参数与此字符串开头的子字符串进行比较,该字符串与value的长度相同,并返回一个值,指示它们是否相等。 要相等,value必须是空字符串(Empty),对此同一实例的引用,或匹配此实例的开头。
如果参数表示的字符序列是该字符串表示的字符序列的前缀,则为true;否则为false。否则是假的。 另请注意,如果参数为空字符串,则返回true,或者等于由equals(Object)方法确定的此String对象。
我将从一个更容易理解的相关事实开始。
空集是每个集的子集。
为什么呢? 子集的定义指出 A
如果 A
的每个元素都是 B
的元素,则它是 B
的子集。相反,如果 A
的元素不是 B的元素
, A
不是 B
的子集>
现在修复一组 B
。我将确定空集是 B
的子集。我将通过显示空集不是 B
的子集的情况来做到这一点。如果空集不是 B
的子集,那么我可以找到不在 B
中的空集的元素。但是空集没有任何元素,因此我找不到 B
中没有的元素。因此,不是空集不是 B
的子集的情况。因此,空集必须是 B
的子集。
任何字符串都以空字符串开头。
首先,我们必须就以开头的定义达成一致。让 s
和 t
为 string
s我们说 s
以 t
如果 s.Length> = t.Length
并且 t
的第一个 t.Length
字符与代码>取值代码>。也就是说,
s.Length> = t.Length
和每个 Int32 index
,使 0< = index< t.Length
, s [index] == t [index]
为真。相反,如果语句
s
不以 t
开头
s.Length< t.Length
或 s.Length> = t.Length
并且存在 Int32 index
,使得 0< = index< t.Length
和 s [index]!= t [index]
是真的。简单来说, s
比 t
短,或者如果没有, t
中的字符与字符匹配的位置不同在 s
。
现在修复字符串 s
。我将确定 s
以空字符串开头。我将通过显示 s
不是以空字符串开头的情况来做到这一点。如果 s
不以空字符串开头,那么 s.Length< String.Empty.Length
或 s.Length> = String.Empty.Length
并且有一个 Int32 index
, 0< =指数< String.Empty.Length 代码>。但
s.Length> = 0
和 String.Empty.Length
等于零,因此 s.Length< String.Empty.Length
为true。类似地,由于``String.Empty.Length 等于零,因此没有
Int32索引满足
0< = index< String.Empty.Length`。因此
s.Length< String.Empty.Length
或 s.Length> = String.Empty.Length
并且有一个 Int32 index
, 0< =指数< String.Empty.Length 代码>
是假的。因此, s
不是以空字符串开头的情况。因此, s
必须以空字符串开头。
以下是以开头编码为 string
的扩展名的实现。
public static bool DoStartsWith(this string s, string t) {
if (s.Length >= t.Length) {
for (int index = 0; index < t.Length; index++) {
if (s[index] != t[index]) {
return false;
}
}
return true;
}
return false;
}
我们只说&quot; abcd&quot; .StartsWith(&quot;&quot;)
返回false。
如果是,则以下表达式eval为,true或false:
("abcd".Substring(0,0) == "")
事实证明,evals为true,所以字符串确实以空字符串开头;-),或换句话说,“abcd”的子字符串从位置0开始并且具有0长度等于空字符串“”。非常合乎逻辑的imo。
在C#中,规范告诉它做出反应;
要相等,value必须是空字符串(Empty),对此同一实例的引用,或者匹配此实例的开头。
为什么&#8220; abcd&#8221; .StartsWith(&#8220;&#8221;)返回true?
真正的答案:
必须是这样的,否则你会遇到
的情况 "".startsWith("") == false
"".equals("") == true
but yet
"a".startsWith("a") == true
"a".equals("a") == true
然后我们又重新获得了Y2K,因为依赖于相同字符串的所有银行软件都会让我们的帐户混乱,突然比尔盖茨将拥有我的财富而且我会拥有他的,并该死的!命运对我来说不是那么好。
两个字符串的前N个字符是相同的。 N是第二个字符串的长度,即零。
仅为记录, String.StartsWith()
在内部调用方法 System.Globalization.CultureInfo.IsPrefix()
,它明确地进行以下检查:
if (prefix.Length == 0)
{
return true;
}
因为字符串以“没有”开头很好。
如果你用正则表达式术语来思考它,那就有意义了。 每个字符串(不仅仅是“abcd”,还有“&quot;”和“sdf \ nff”), 在评估'begin with empty string'的正则表达式时返回true。
在C#中,它返回 true
的原因是开发人员专门编写了它。
如果您查看源代码,那么'找到处理空字符串的特定逻辑:
public Boolean StartsWith(String value)
{
return StartsWith(value, StringComparison.CurrentCulture);
}
public Boolean StartsWith(String value, StringComparison comparisonType)
{
...
if (value.Length == 0)
{
return true;
}