Назва - це ціле питання. Хтось може сказати мені причину, чому це трапляється?
Назва - це ціле питання. Хтось може сказати мені причину, чому це трапляється?
Відповіді:
Так - тому що він починається з порожнього рядка. Дійсно, порожній рядок логічно виникає між кожною парою символів.
Покладіть це так: яке визначення поняття "починається з" ви могли б дати, щоб це не дозволило? Ось просте визначення поняття "починається з", яке не означає:
"x починається з y, якщо перші y.Length
символи x збігаються з y."
Альтернативне (еквівалентне) визначення:
"x починається з y, якщо x.Substring(0, y.Length).Equals(y)
"
Я спробую детальніше розказати про те, що сказав Джон Скіт.
Скажімо, x, y та z - це рядки, а оператор + насправді є конкатенацією, тоді:
Якщо ми можемо розділити z на запис z = x + y, це означає, що z починається з x. Оскільки кожен рядок z може бути розділений на z = "" + z, отже, кожен рядок починається з "".
Отже, оскільки ("" + "abcd") == "abcd", виходить, що "abcd" починається з ""
Цей метод порівнює параметр значення з підрядком на початку цього рядка, який має однакову довжину зі значенням, і повертає значення, яке вказує, чи рівні вони. Щоб бути рівним, значення має бути порожнім рядком (Empty), посиланням на цей самий екземпляр або відповідати початку цього екземпляра.
істина, якщо послідовність символів, представлена аргументом, є префіксом послідовності символів, представленої цим рядком; інакше помилково. Також зауважте, що true буде повернуто, якщо аргумент є порожнім рядком або дорівнює цьому об’єкту String, як визначено методом equals (Object).
Почну з пов'язаного факту, який легше зрозуміти.
Порожній набір є підмножиною кожного набору.
Чому? Визначення з підмножини станів , що A
є підмножиною , B
якщо кожен елемент A
є елементом B
. І навпаки, A
не є підмножиною, B
якщо є елемент, A
який не є елементом B
.
Тепер виправте набір B
. Я встановлю, що порожній набір є підмножиною B
. Я зроблю це, показавши, що це не те, що порожній набір не є підмножиною B
. Якби порожній набір не був підмножиною, B
тоді я міг би знайти елемент порожнього набору, якого немає B
. Але порожній набір не має жодних елементів, і, отже, я не можу знайти елемент, якого немає B
. Тому справа не в тому, що порожній набір не є підмножиною B
. Таким чином, порожній набір повинен бути підмножиною B
.
Будь-який рядок починається з порожнього рядка.
По-перше, ми повинні погодитись з нашим визначенням початку . Let s
and t
be string
s Ми говоримо, що s
починається з t
if s.Length >= t.Length
і перші t.Length
символи t
відповідності символам s
. Тобто, 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 <= index < String.Empty.Length
. Але s.Length >= 0
і String.Empty.Length
дорівнює нулю, тому неможливо s.Length < String.Empty.Length
бути правдою. Подібним чином, оскільки `` String.Empty.Length is equal to zero, there is no
Int32 індекс satisfying
0 <= index <String.Empty.Length '' . Тому
s.Length < String.Empty.Length
або s.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;
}
Два вищезазначені жирні факти є прикладами безглуздо правдивих тверджень . Вони істинні в силу того, що твердження, що їх визначають ( підмножина і починається з ), є універсальними квантифікаціями над порожніми всесвітами. У порожньому наборі немає елементів, тому не може бути елементів порожнього набору, не в якомусь іншому фіксованому наборі. У порожньому рядку немає символів, тому не може бути символу, оскільки якась позиція в порожньому рядку не відповідає символу в тій самій позиції в іншому фіксованому рядку.
Скажімо, "abcd".StartsWith("")
повертає false.
якщо так, то що означає наступний вираз, true або false:
("abcd".Substring(0,0) == "")
виявляється, evals до true, тому рядок починається з порожнього рядка ;-), або іншими словами, підрядок "abcd", що починається з позиції 0 і має 0 довжину, дорівнює порожньому рядку "". Досить логічне іммо.
null
це було б не менш відповідним значенням повернення.
У C # це те, як специфікація говорить йому реагувати;
Щоб бути рівним, значення має бути порожнім рядком (Empty), посиланням на цей самий екземпляр або відповідати початку цього екземпляра.
Чому “abcd” .StartsWith (“”) повертає true?
РЕАЛЬНИЙ ВІДПОВІДЬ:
Це повинно бути так, інакше у вас був би випадок де
"".startsWith("") == false
"".equals("") == true
but yet
"a".startsWith("a") == true
"a".equals("a") == true
і тоді у нас знову буде Y2K, тому що все банківське програмне забезпечення, яке залежить від рівних рядків, починаючи з них самих, змішає наші рахунки, і раптом Білл Гейтс отримає моє багатство, а я його отримаю, і блін! Доля просто не така добра для мене.
Тільки для запису, String.StartsWith()
внутрішньо викликає метод, System.Globalization.CultureInfo.IsPrefix()
який явно робить наступну перевірку:
if (prefix.Length == 0)
{
return true;
}
Якщо ви думаєте про це регулярними виразами, це має сенс. Кожен рядок (не просто "abcd", а також "" та "sdf \ nff") повертає значення true при обчисленні регулярного виразу "починається з порожнього рядка".