Başlık, sorunun tamamıdır. Birisi bana bunun neden olduğuna bir sebep verebilir mi?
Yanıtlar:
Evet - çünkü boş dizeyle başlıyor. Aslında, boş dizge mantıksal olarak her karakter çifti arasında oluşur.
Şöyle söyleyin: "ile başlar" ın bunu engelleyebilecek hangi tanımını verebilirdiniz? Aşağıda, "şununla başlar" ın basit bir tanımı vardır, ancak bunlar şu şekilde değildir:
"x'in ilk y.Length
karakterleri y'ninkilerle eşleşirse x, y ile başlar."
Alternatif (eşdeğer) bir tanım:
"x, y ile başlar eğer x.Substring(0, y.Length).Equals(y)
"
Jon Skeet'in söylediklerini detaylandırmaya çalışacağım.
Diyelim ki x, y ve z dizelerdir ve + operatörü aslında bitiştirmedir, o zaman:
Z'yi z = x + y yazmak için bölebilirsek, bu z'nin x ile başladığı anlamına gelir. Her z dizisi z = "" + z'ye bölünebildiğinden, her dizenin "" ile başladığı sonucu çıkar.
Yani, ("" + "abcd") == "abcd" olduğu için "abcd" nin ""
Anlaşılması daha kolay olan ilgili bir gerçekle başlayacağım.
Boş küme, her kümenin bir alt kümesidir.
Neden? Altkümenin tanımı , öğesinin her öğesinin öğesinin bir öğesi olup olmadığının bir alt kümesi olduğunu belirtir . Tersine, öğesinin öğesi olmayan bir öğesi olup olmadığının bir alt kümesi değildir .A
B
A
B
A
B
A
B
Şimdi bir seti düzeltin B
. Boş kümenin bir alt kümesi olduğunu belirleyeceğim B
. Bunu, boş kümenin bir alt kümesi olmadığını göstererek yapacağım B
. Boş küme, B
öğesinin bir alt kümesi değilse, içinde olmayan boş kümenin bir öğesini bulabilirim B
. Ama boş küme herhangi bir elemana sahip değil ve bu yüzden içinde olmayan bir eleman bulamıyorum B
. Bu nedenle, boş kümenin bir alt kümesi olmadığı durum söz konusu değildir B
. Bu nedenle, boş küme, alt kümesi olmalıdır B
.
Herhangi bir dize boş dizeyle başlar.
İlk olarak, ile başlangıç tanımımız üzerinde anlaşmalıyız . Let s
and t
be string
s Diyoruz ki, if s
ile başlar ve karakterlerin ilk karakterleri ile eşleşir . Yani, her için böyle , doğrudur. Tersine, bunun eğer ifade ile başlamadığını söyleyebiliriz.t
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
veya s.Length >= t.Length
ve Int32 index
böyle bir şey var 0 <= index < t.Length
ves[index] != t[index]
doğru. Düz İngilizce'de, s
daha kısadır t
veya değilse, t
aynı konumdaki karakterle eşleşmeyen bir karakter vardır s
.
Şimdi bir dizeyi düzeltin s
. Bunun s
boş dizeyle başladığını belirleyeceğim. Bunu s
boş dizeyle başlamayan durumun olmadığını göstererek yapacağım . Eğer s
o zaman boş dize ile başlamaz s.Length < String.Empty.Length
veya s.Length >= String.Empty.Length
bir var Int32 index
böyle 0 <= index < String.Empty.Length
. Ama s.Length >= 0
ve String.Empty.Length
bunun için imkansız yani sıfıra eşittir s.Length < String.Empty.Length
gerçek olamayacak. Benzer şekilde, `String.Empty.Length is equal to zero, there is no
Int32 indeksi satisfying
0 <= index <String.Empty.Length`. Bu nedenle
s.Length < String.Empty.Length
ya da s.Length >= String.Empty.Length
öyle bir şey var Int32 index
ki0 <= index < String.Empty.Length
yanlış. Bu nedenle s
boş dizge ile başlamayan durum böyle değildir. Bu nedenle, s
boş dizeyle başlamalıdır.
Aşağıdaki, uzantısı olarak kodlanmış başlangıçların bir uygulamasıdır 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;
}
Yukarıdaki iki cesur gerçek , boş bir şekilde doğru ifadelerin örnekleridir . Onları tanımlayan ifadelerin ( alt küme ve onunla başlayan ) boş evrenler üzerindeki evrensel nicelikler olması nedeniyle doğrudurlar . Boş kümede öğe yoktur, bu nedenle başka bir sabit kümede olmayan boş kümenin herhangi bir öğesi olamaz. Boş dizede karakter yoktur, bu nedenle boş dizedeki bazı konumlar başka bir sabit dizede aynı konumdaki karakterle eşleşmediği için bir karakter olamaz.
Bu yöntem, değer parametresini, değerle aynı uzunluktaki bu dizenin başındaki alt dizeyle karşılaştırır ve eşit olup olmadıklarını gösteren bir değer döndürür. Eşit olması için değerin boş bir dize (Boş) olması, aynı örneğe bir başvuru olması veya bu örneğin başlangıcıyla eşleşmesi gerekir.
bağımsız değişken tarafından temsil edilen karakter dizisi, bu dizeyle temsil edilen karakter dizisinin bir öneki ise true; aksi takdirde false. Ayrıca, bağımsız değişken boş bir dizeyse veya equals (Object) yöntemiyle belirlendiği gibi bu String nesnesine eşitse true değerinin döndürüleceğini unutmayın .
Sadece söyleyelim "abcd".StartsWith("")
yanlış döndürür .
eğer öyleyse, aşağıdaki ifade neyi değerlendirir, doğru veya yanlış:
("abcd".Substring(0,0) == "")
sonuç olarak değişmesi doğru olur, böylece dizge boş dizgeyle başlar ;-) veya başka bir deyişle, "abcd" nin 0 konumundan başlayan ve uzunluğu 0 olan "" alt dizesi boş dizgeye eşittir "". Oldukça mantıklı bir imo.
null
eşit derecede uygun bir dönüş değeri olacağı gibi 'tanımsız' olarak da ilan edilmiş olabilir .
C # 'da spesifikasyon ona nasıl tepki vermesini söyler;
Eşit olması için değerin boş bir dize (Boş) olması, aynı örneğe bir başvuru olması veya bu örneğin başlangıcıyla eşleşmesi gerekir.
Neden “abcd” .StartsWith (“”) true döndürüyor?
GERÇEK CEVAP:
Bu şekilde olmalı, aksi halde davaya sahip olurdun
"".startsWith("") == false
"".equals("") == true
but yet
"a".startsWith("a") == true
"a".equals("a") == true
ve sonra yeniden Y2K'ya sahip olurduk çünkü kendilerinden başlayarak eşit dizelere dayanan tüm banka yazılımları hesaplarımızı karıştıracak ve aniden Bill Gates benim servetim olacak ve ben de onunkine sahip olacağım ve lanet olsun! Kader bana pek iyi gelmiyor.
Sadece kayıt için, String.StartsWith()
dahili System.Globalization.CultureInfo.IsPrefix()
olarak aşağıdaki kontrolü açıkça yapan yöntemi çağırır :
if (prefix.Length == 0)
{
return true;
}
Bunu normal ifadelerle düşünürseniz, mantıklı geliyor. Her dizge (sadece "abcd" değil, ayrıca "" ve "sdf \ nff"), 'boş dizeyle başlar' normal ifadesini değerlendirirken true değerini döndürür.