Tiêu đề là toàn bộ câu hỏi. Ai đó có thể cho tôi một lý do tại sao điều này xảy ra?
Câu trả lời:
Có - bởi vì nó bắt đầu bằng chuỗi trống. Thật vậy, chuỗi rỗng xảy ra một cách hợp lý giữa mọi cặp ký tự.
Hãy giải thích theo cách này: bạn có thể đưa ra định nghĩa nào về "bắt đầu bằng" có thể loại trừ điều này? Đây là một định nghĩa đơn giản về "bắt đầu với" không:
"x bắt đầu bằng y nếu các y.Lengthký tự đầu tiên của x khớp với các ký tự của y."
Một định nghĩa thay thế (tương đương):
"x bắt đầu bằng y nếu x.Substring(0, y.Length).Equals(y)"
Tôi sẽ cố gắng giải thích kỹ hơn những gì Jon Skeet đã nói.
Giả sử x, y và z là các chuỗi và toán tử + trên thực tế là phép nối, khi đó:
Nếu chúng ta có thể tách z để viết z = x + y có nghĩa là z bắt đầu bằng x. Vì mọi chuỗi z có thể được chia thành z = "" + z nên mọi chuỗi đều bắt đầu bằng "".
Vì vậy, bởi vì ("" + "abcd") == "abcd" nên "abcd" bắt đầu bằng ""
Phương thức này so sánh tham số giá trị với chuỗi con ở đầu chuỗi này có cùng độ dài với giá trị và trả về giá trị cho biết chúng có bằng nhau hay không. Để bằng nhau, giá trị phải là một chuỗi rỗng (Empty), một tham chiếu đến cùng một phiên bản này hoặc khớp với phần đầu của phiên bản này.
true nếu chuỗi ký tự được đại diện bởi đối số là tiền tố của chuỗi ký tự được đại diện bởi chuỗi này; sai khác. Cũng lưu ý rằng true sẽ được trả về nếu đối số là một chuỗi rỗng hoặc bằng đối tượng Chuỗi này được xác định bởi phương thức equals (Object).
Tôi sẽ bắt đầu với một thực tế liên quan dễ hiểu hơn.
Tập hợp rỗng là tập hợp con của mọi tập hợp.
Tại sao? Các định nghĩa của tập hợp con các quốc gia mà Alà một tập hợp con của Bnếu mọi phần tử của Amột yếu tố B. Ngược lại, Akhông phải là một tập hợp con của Bnếu có một phần tử của Anó không phải là một phần tử của B.
Bây giờ sửa một tập hợp B. Tôi sẽ thiết lập rằng tập hợp trống là tập hợp con của B. Tôi sẽ làm điều này bằng cách chỉ ra rằng không phải là trường hợp tập hợp rỗng không phải là tập hợp con của B. Nếu tập hợp trống không phải là một tập hợp con Bthì tôi có thể tìm thấy một phần tử của tập hợp trống không có trong đó B. Nhưng tập hợp rỗng không có bất kỳ phần tử nào và do đó tôi không thể tìm thấy một phần tử không có trong đó B. Do đó, không có trường hợp nào tập rỗng không phải là tập con của B. Do đó, tập hợp rỗng phải là tập hợp con của B.
Bất kỳ chuỗi nào bắt đầu bằng chuỗi rỗng.
Đầu tiên, chúng ta phải đồng ý về định nghĩa của chúng ta về start with . Let sand tbe strings Chúng tôi nói rằng s bắt đầu bằng t if s.Length >= t.Lengthvà các t.Lengthký tự đầu tiên của tkhớp với các ký tự của s. Đó là, s.Length >= t.Lengthvà đối với mọi Int32 indexđiều đó 0 <= index < t.Length, s[index] == t[index]đều đúng. Ngược lại, chúng tôi sẽ nói rằng điều sđó không bắt đầu bằng tcâu lệnh if
s.Length < t.Lengthhoặc s.Length >= t.Lengthvà có một thứ Int32 indexnhư vậy 0 <= index < t.Lengthvàs[index] != t[index]
là đúng. Trong tiếng Anh đơn giản, sngắn hơn t, hoặc, nếu không, có một ký tự tkhông khớp với ký tự như cùng một vị trí trong s.
Bây giờ sửa một chuỗi s. Tôi sẽ thiết lập điều đó sbắt đầu với chuỗi trống. Tôi sẽ làm điều này bằng cách chỉ ra rằng nó không phải là trường hợp skhông bắt đầu bằng chuỗi trống. Nếu skhông bắt đầu bằng chuỗi trống thì s.Length < String.Empty.Lengthhoặc s.Length >= String.Empty.Lengthvà có một chuỗi Int32 indexnhư vậy 0 <= index < String.Empty.Length. Nhưng s.Length >= 0và String.Empty.Lengthbằng 0 nên không s.Length < String.Empty.Lengththể đúng. Tương tự, vì `` String.Empty.Length is equal to zero, there is noInt32 index satisfying0 <= index <String.Empty.Length`. vì thế
s.Length < String.Empty.Lengthhoặc s.Length >= String.Empty.Lengthvà có một thứ Int32 indexnhư vậy0 <= index < String.Empty.Length
là sai. Do đó, nó không phải là trường hợp skhông bắt đầu với chuỗi rỗng. Do đó, sphải bắt đầu bằng chuỗi trống.
Sau đây là một triển khai của bắt đầu với mã hóa là một phần mở rộng cho 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;
}
Hai dữ kiện được in đậm ở trên là những ví dụ về các tuyên bố hoàn toàn đúng . Chúng đúng bởi thực tế là các phát biểu xác định chúng ( tập hợp con và bắt đầu bằng ) là các định lượng phổ quát đối với các vũ trụ trống. Không có phần tử nào trong tập hợp rỗng, vì vậy không thể có bất kỳ phần tử nào của tập hợp rỗng không nằm trong một số tập hợp cố định khác. Không có ký tự nào trong chuỗi trống, vì vậy không thể có ký tự vì một số vị trí trong chuỗi trống không khớp với ký tự ở cùng vị trí trong một số chuỗi cố định khác.
Hãy chỉ nói rằng "abcd".StartsWith("")trả về false.
nếu vậy thì biểu thức sau đánh giá là gì, đúng hay sai:
("abcd".Substring(0,0) == "")
nó chỉ ra là true, vì vậy chuỗi bắt đầu bằng chuỗi trống ;-), hay nói cách khác, chuỗi con của "abcd" bắt đầu từ vị trí 0 và có độ dài 0 bằng chuỗi trống "". Imo khá logic.
nullmột giá trị trả về thích hợp như nhau.
Tại sao “abcd” .StartsWith (“”) trả về true?
CÂU TRẢ LỜI THỰC TẾ:
Nó phải theo cách đó nếu không bạn sẽ gặp trường hợp
"".startsWith("") == false
"".equals("") == true
but yet
"a".startsWith("a") == true
"a".equals("a") == true
và sau đó chúng ta lại có Y2K vì tất cả các phần mềm ngân hàng phụ thuộc vào các chuỗi bằng nhau bắt đầu với chính chúng sẽ khiến tài khoản của chúng ta bị trộn lẫn và đột nhiên Bill Gates sẽ có tài sản của tôi và tôi có của anh ấy, và chết tiệt! Số phận không tốt với tôi.
Chỉ đối với bản ghi, String.StartsWith()gọi nội bộ phương thức System.Globalization.CultureInfo.IsPrefix()thực hiện kiểm tra rõ ràng sau:
if (prefix.Length == 0)
{
return true;
}
Nếu bạn nghĩ về nó trong thuật ngữ biểu thức chính quy, nó có ý nghĩa. Mọi chuỗi (không chỉ "abcd", cả "" và "sdf \ nff"), đều trả về true khi đánh giá biểu thức chính quy của 'bắt đầu bằng chuỗi rỗng'.