제목은 전체 질문입니다. 누군가가 이런 일이 발생하는 이유를 알려줄 수 있습니까?
답변:
예-빈 문자열로 시작하기 때문입니다. 실제로 빈 문자열은 모든 문자 쌍 사이에 논리적으로 발생합니다.
이렇게 말하면 "시작"의 어떤 정의가이를 배제 할 수 있습니까? 다음은 그렇지 않은 "시작"에 대한 간단한 정의입니다.
"x의 첫 y.Length
문자 가 y의 문자와 일치 하면 x는 y로 시작합니다 ."
대체 (동등한) 정의 :
"x는 y로 시작하면 x.Substring(0, y.Length).Equals(y)
"
이해하기 쉬운 관련 사실부터 시작하겠습니다.
빈 집합은 모든 집합의 하위 집합입니다.
왜? 정의 의 서브 세트 상태 A
의 부분 집합 B
의 모든 요소가있는 경우 A
의 원소이다 B
. 반대로 의 요소 가 아닌 요소가있는 경우 A
의 하위 집합 이 아닙니다 .B
A
B
이제 세트를 수정하십시오 B
. 빈 집합이 B
. 빈 집합이의 하위 집합이 아닌 경우가 아님을 보여줌으로써이를 수행 할 것입니다 B
. 빈 집합이의 하위 집합이 아니면에없는 빈 집합 B
의 요소를 찾을 수 B
있습니다. 그러나 빈 집합에는 요소가 없으므로 .NET에없는 요소를 찾을 수 없습니다 B
. 따라서 빈 집합이의 하위 집합이 아닌 것은 아닙니다 B
. 따라서 빈 집합은의 하위 집합이어야합니다 B
.
모든 문자열은 빈 문자열로 시작합니다.
먼저, 시작 에 대한 정의에 동의해야합니다 . Let s
and t
be string
s 우리는 if로 s
시작 하고의 첫 문자 가 . 즉, 모든에 대한 그와 같은 , 사실이다. 반대로 if 문으로 시작하지 않는다고 말할 수 있습니다 .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
또는 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
0과 같으므로 사실이 s.Length < String.Empty.Length
될 수 없습니다 . 마찬가지로``String.Empty.Length is equal to zero, there is no
Int32 index 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;
}
위의 두 가지 대담한 사실은 막연하게 진실 된 진술의 예입니다 . 그것들을 정의하는 문장 ( 부분 집합과 로 시작 )이 빈 우주에 대한 보편적 인 수량화 라는 사실 때문에 그들은 사실입니다 . 빈 세트에는 요소가 없으므로 다른 고정 세트가 아닌 빈 세트의 요소가있을 수 없습니다. 빈 문자열에는 문자가 없으므로 다른 고정 문자열의 동일한 위치에있는 문자와 일치하지 않는 빈 문자열의 일부 위치로 문자가있을 수 없습니다.
이 메서드는 value 매개 변수를 value와 길이가 같은이 문자열의 시작 부분에있는 하위 문자열과 비교하여 같은지 여부를 나타내는 값을 반환합니다. 동일하려면 값이 빈 문자열 (Empty)이거나 동일한 인스턴스에 대한 참조이거나이 인스턴스의 시작과 일치해야합니다.
인수가 나타내는 문자 시퀀스가이 문자열이 나타내는 문자 시퀀스의 접두사이면 true이고; 그렇지 않으면 거짓. 인수가 빈 문자열 이거나 equals (Object) 메서드에 의해 결정된이 String 객체와 동일한 경우 true가 반환됩니다 .
"abcd".StartsWith("")
false를 반환 한다고합시다 .
그렇다면 다음 표현식은 true 또는 false로 평가됩니다.
("abcd".Substring(0,0) == "")
true로 평가되므로 문자열은 빈 문자열 ;-)로 시작합니다. 즉, 위치 0에서 시작하고 길이가 0 인 "abcd"의 하위 문자열은 빈 문자열 ""과 같습니다. 꽤 논리적 인 imo.
null
똑같이 적절한 반환 값이었던 것처럼 '정의되지 않음'으로 선언되었을 수도 있습니다 .
"abcd".StartsWith ( "")가 true를 반환하는 이유는 무엇입니까?
진정한 답 :
그렇지 않으면 당신은
"".startsWith("") == false
"".equals("") == true
but yet
"a".startsWith("a") == true
"a".equals("a") == true
그런 다음 다시 Y2K를 갖게 될 것입니다. 그 자체로 시작하는 동일한 문자열에 의존하는 모든 은행 소프트웨어가 우리 계좌를 뒤섞을 것이고 갑자기 Bill Gates가 내 부를 갖게 될 것이고 저는 그의 부를 갖게 될 것이기 때문입니다. 운명은 나에게 그런 종류가 아닙니다.
레코드를 위해 String.StartsWith()
내부적 System.Globalization.CultureInfo.IsPrefix()
으로 다음을 확인 하는 메서드 를 명시 적으로 호출합니다 .
if (prefix.Length == 0)
{
return true;
}
정규 표현식 용어로 생각하면 의미가 있습니다. 모든 문자열 ( "abcd"뿐만 아니라 ""및 "sdf \ nff")은 '빈 문자열로 시작'의 정규식을 평가할 때 true를 반환합니다.