C# “为什么?”;abcd";。StartsWith(";)返回true?

C# “为什么?”;abcd";。StartsWith(";)返回true?,c#,java,startswith,C#,Java,Startswith,标题是整个问题。有人能告诉我发生这种情况的原因吗?此方法将value参数与字符串开头与value长度相同的子字符串进行比较,并返回一个值,指示它们是否相等若要相等,值必须是空字符串(empty)、对同一实例的引用或与该实例的开头匹配。 如果参数表示的字符序列是此字符串表示的字符序列的前缀,则为true;否则就错了另请注意,如果参数是空字符串或等于由equals(object)方法确定的字符串对象,则将返回true 是-因为它确实以空字符串开头。实际上,空字符串在逻辑上出现在每对字符之间 这样说

标题是整个问题。有人能告诉我发生这种情况的原因吗?

此方法将value参数与字符串开头与value长度相同的子字符串进行比较,并返回一个值,指示它们是否相等若要相等,值必须是空字符串(empty)、对同一实例的引用或与该实例的开头匹配。

如果参数表示的字符序列是此字符串表示的字符序列的前缀,则为true;否则就错了另请注意,如果参数是空字符串或等于由equals(object)方法确定的字符串对象,则将返回true


是-因为它确实以空字符串开头。实际上,空字符串在逻辑上出现在每对字符之间

这样说吧:你能给出什么样的定义来排除这种情况?这里有一个简单的“从开始”定义,它不:

“如果x的第一个
y.Length
字符与y的字符匹配,则x以y开头。”

替代(等效)定义:


“如果
x.Substring(0,y.Length),x以y开头。等于(y)

两个字符串的前N个字符相同。N是第二个字符串的长度,即零。

在C#中,这是命令它作出反应的方式

若要相等,该值必须是空字符串(empty)、对同一实例的引用或与该实例的开头匹配


因为字符串很好地以“nothing”开头。如果你用正则表达式的术语来理解它,它是有意义的。 每个字符串(不仅是“abcd”,还包括“”和“sdf\nff”),
计算“以空字符串开头”的正则表达式时返回true。

我将尝试详细说明Jon Skeet所说的内容

假设x、y和z是字符串,+运算符实际上是串联的,那么:

如果我们可以将z拆分为z=x+y,这意味着z从x开始。 因为每个字符串z都可以拆分为z=”“+z,所以每个字符串都以“”开头

因此,因为(“+”abcd”)==”abcd“,所以“abcd”以“

开头,让我们说一下“
”abcd“。StartsWith(“”
返回false

如果是,那么以下表达式的计算结果是什么,true还是false:

 ("abcd".Substring(0,0) == "")

结果是evals为true,因此字符串确实以空字符串开头;-),换句话说,“abcd”的子字符串从位置0开始,长度为0,等于空字符串“”。我觉得这很合乎逻辑。

我将从一个更容易理解的相关事实开始

空集是每个集合的子集。

为什么??如果
A
的每个元素都是
B
的一个元素,则子集声明
A
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
的字符匹配。就是,
s.Length>=t.Length
并且对于每个
Int32索引
0=t.Length
,存在
Int32索引
0=String.Empty.Length
并且存在
Int32索引
0=0
String.Empty.Length
等于零,因此不可能
s.Length
为true。类似地,由于``String.Empty.Length
等于零,因此不存在满足
0=String.Empty.Length
Int32索引
0=t.Length){
对于(int index=0;index

以上两个大胆的事实就是例子。它们是真实的,因为定义它们的语句(子集和开头)是在空的宇宙之上。空集中没有元素,因此空集中不可能有不在其他固定集合中的任何元素。空字符串中没有字符,因此空字符串中的某个位置的字符不能与其他固定字符串中相同位置的字符不匹配。

仅作为记录,
string.StartsWith()
在内部调用方法
System.Globalization.CultureInfo.IsPrefix()
这将明确进行以下检查:

if (prefix.Length == 0)
{
    return true;
}
为什么“abcd”.StartsWith(“”)返回true

真正的答案是:

必须是那样否则你会有这样的情况

    "".startsWith("") == false 
    "".equals("") == true

    but yet

    "a".startsWith("a") == true
    "a".equals("a") == true

然后,我们将再次面临Y2K问题,因为所有依赖于从自身开始的相等字符串的银行软件将使我们的帐户混淆,突然比尔·盖茨将拥有我的财富,而我将拥有他的财富,该死!命运对我不是那么好。

x从y开始,如果x.Substring(0
    "".startsWith("") == false 
    "".equals("") == true

    but yet

    "a".startsWith("a") == true
    "a".equals("a") == true