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.Length
ký 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à A
là một tập hợp con của B
nếu mọi phần tử của A
một yếu tố B
. Ngược lại, A
không phải là một tập hợp con của B
nếu có một phần tử của A
nó 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 B
thì 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 s
and t
be string
s Chúng tôi nói rằng s
bắt đầu bằng t
if s.Length >= t.Length
và các t.Length
ký tự đầu tiên của t
khớp với các ký tự của s
. Đó là, s.Length >= t.Length
và đố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 t
câu lệnh if
s.Length < t.Length
hoặc s.Length >= t.Length
và có một thứ Int32 index
như vậy 0 <= index < t.Length
vàs[index] != t[index]
là đúng. Trong tiếng Anh đơn giản, s
ngắn hơn t
, hoặc, nếu không, có một ký tự t
khô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 đó s
bắ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 s
không bắt đầu bằng chuỗi trống. Nếu s
không bắt đầu bằng chuỗi trống thì s.Length < String.Empty.Length
hoặc s.Length >= String.Empty.Length
và có một chuỗi Int32 index
như vậy 0 <= index < String.Empty.Length
. Nhưng s.Length >= 0
và String.Empty.Length
bằng 0 nên không s.Length < String.Empty.Length
thể đúng. Tương tự, vì `` String.Empty.Length is equal to zero, there is no
Int32 index satisfying
0 <= index <String.Empty.Length`. vì thế
s.Length < String.Empty.Length
hoặc s.Length >= String.Empty.Length
và có một thứ Int32 index
như vậy0 <= index < String.Empty.Length
là sai. Do đó, nó không phải là trường hợp s
không bắt đầu với chuỗi rỗng. Do đó, s
phả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.
null
mộ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'.