string startswith c#




為什麼“abcd”.StartsWith(“”)返回true? (8)

標題是整個問題。 有人能給我一個為什麼發生這種情況的原因?


為什麼“abcd”.StartsWith(“”)返回true?

真實的答案:

它必須是這樣,否則你會遇到這種情況

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

    but yet

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

然後我們再來一遍Y2K,因為所有的銀行軟件都依賴於以自己開頭的相同字符串將會讓我們的賬戶混淆起來,突然比爾蓋茨將擁有我的財富,我會擁有他的,並且該死! 命運對我來說並不那麼友善。


兩個字符串的前N個字符是相同的。 N是第二個字符串的長度,即零。


在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;
    }

在C#中,這是specification告訴它做出反應的方式;

為了平等,值必須是空字符串(空),對同一個實例的引用,或匹配此實例的開始。


我將從一個更容易理解的相關事實開始。

空集是每個集的子集。

為什麼? 子集definition表明,如果A每個元素都是B元素,則AB的子集。 相反,如果A的元素不是B的元素,則A不是B的子集。

現在修復一個集合B 我將確定空集是B一個子集。 我將通過顯示不是空集不是B的子集的情況來做到這一點。 如果空集不是B的子集,那麼我可以找到不在B中的空集的元素。 但空集沒有任何元素,因此我找不到不在B的元素。 因此,空集不是B一個子集。 因此,空集必須是B一個子集。

任何字符串都以空字符串開頭。

首先,我們必須同意我們開始的定義。 假設ststring s如果s.Length >= t.Length並且t的前t字符與s字符匹配,我們就說s t 開始 。 也就是說, s.Length >= t.Length並且對於每個Int32 index ,使得0 <= index < t.Lengths[index] == t[index]為真。 相反,我們會說如果聲明不是從t開始

有一個Int32 index ,使得0 <= index < t.Lengths[index] != t[index]

是真的。 用簡單的英語, st短,或者,如果不是,則有一個角色與s的相同位置不匹配。

現在修復一個字符串s 。 我會建立s從空字符串開始。 我將通過顯示s不是以空字符串開始的情況來做到這一點。 如果s不是以空字符串開始,則s.Length < String.Empty.Lengths.Length >= String.Empty.Length並且存在Int32 index ,使得0 <= index < String.Empty.Length 。 但s.Length >= 0String.Empty.Length等於零,因此s.Length < String.Empty.Length不可能為true。 同樣,由於“String.Empty.Length is equal to zero, there is no satisfying 0 <= index <String.Empty.Length`的Int32索引。 因此

s.Length < String.Empty.Lengths.Length >= String.Empty.Length並且存在一個Int32 index ,使得0 <= index < 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;
}

以上兩個粗體的事實是真實的陳述的例子。 它們是真實的,因為定義它們的語句( 子集從頭開始 )是對空宇宙的普遍量化 。 空集中沒有元素,所以不能有任何空集的元素不在其他固定集中。 空字符串中沒有字符,因此空字符串中的某個位置不能與其他固定字符串中相同位置的字符匹配。


我會試著闡述Jon Skeet所說的。

假設x,y和z是字符串,+運算符實際上是串聯的,那麼:

如果我們可以分割z來寫z = x + y,這意味著z以x開始。 因為每個字符串z可以被拆分為z =“”+ z,所以每個字符串都以“”開始。

所以,因為(“”+“abcd”)==“abcd”,所以“abcd”以“”開始


此方法將value參數與此字符串開頭的子字符串(與該值的長度相同)進行比較,並返回一個指示它們是否相等的值。 為了平等,值必須是空字符串(空),對同一個實例的引用,或匹配此實例的開始。

.NET String.StartsWith

如果參數表示的字符序列是由此字符串表示的字符序列的前綴,則為true; 否則為假。 另請注意,如果參數是一個空字符串,或者等於由equals(Object)方法確定的此String對象, 則將返回true

Java String.startsWith


為了記錄, String.StartsWith()內部調用System.Globalization.CultureInfo.IsPrefix()方法,該方法明確地進行了以下檢查:

if (prefix.Length == 0)
{
    return true;
}






startswith