"ABCD".StartSwith ( "")가 True를 반환하는 이유는 무엇입니까?
-
02-07-2019 - |
문제
제목은 전체 질문입니다. 누군가 나에게 이런 일이 일어나는 이유를 줄 수 있습니까?
해결책
예 - 빈 문자열로 시작하기 때문입니다. 실제로, 빈 문자열은 모든 문자 쌍 사이에서 논리적으로 발생합니다.
이런 식으로 말하십시오 : "시작"의 어떤 정의는 당신이 이것을 배제 할 수 있습니까? 다음은 "시작"의 간단한 정의입니다.
"X는 첫 번째 경우 y로 시작합니다 y.Length
X의 문자는 Y의 문자와 일치합니다. "
대안 (동등한) 정의 :
"X는 y if로 시작합니다 x.Substring(0, y.Length).Equals(y)
"
다른 팁
나는 Jon Skeet의 말에 대해 자세히 설명하려고 노력할 것입니다.
x, y 및 z가 문자열이고 + 연산자가 실제로 연결이라고 가정 해 봅시다.
z를 쪼개기 위해 z = x + y를 쓸 수 있다면 z가 x로 시작한다는 것을 의미합니다. 모든 문자열 z는 z = "" + z로 분할 될 수 있으므로 모든 문자열은 ""로 시작합니다.
따라서 ( "" + "abcd") == "ABCD"는 "ABCD"가 시작됩니다. "
이 메소드는 값 매개 변수를 값과 동일한 길이 인이 문자열의 시작 부분에서 하위 문자열과 비교하고 동일인지를 나타내는 값을 반환합니다. 동일하려면 값은 빈 문자열 (빈), 동일한 인스턴스에 대한 참조 이거나이 인스턴스의 시작과 일치해야합니다.
인수로 표시되는 문자 시퀀스 가이 문자열로 표시되는 문자 시퀀스의 접두사 인 경우. 그렇지 않으면 거짓. 인수가 빈 문자열이면 참이되게됩니다. 또는 Equals (Object) 메소드에 의해 결정된이 문자열 객체와 동일합니다.
이해하기 쉬운 관련 사실부터 시작하겠습니다.
빈 세트는 모든 세트의 하위 집합입니다.
왜요? 그만큼 정의 의 서브 세트 그것을 말합니다 A
서브 세트입니다 B
모든 요소가 있다면 A
요소입니다 B
. 거꾸로, A
하위 집합이 아닙니다 B
요소가있는 경우 A
그것은 요소가 아닙니다 B
.
이제 세트를 수정하십시오 B
. 나는 빈 세트가 B
. 빈 세트가의 하위 집합이 아니라는 것은 그렇지 않다는 것을 보여줌으로써 이것을 할 것입니다. B
. 빈 세트가 하위 집합이 아닌 경우 B
그런 다음 빈 세트의 요소를 찾을 수 있습니다. B
. 그러나 빈 세트에는 요소가 없으므로 안에없는 요소를 찾을 수 없습니다. B
. 따라서 빈 세트가 하위 집합이 아닌 경우가 아닙니다. B
. 따라서 빈 세트는 B
.
모든 문자열은 빈 문자열로 시작합니다.
먼저, 우리는 우리의 정의에 동의해야합니다 시작합니다. 허락하다 s
그리고 t
~이다 string
우리는 그렇게 말합니다 s
시작합니다 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 색인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("")
거짓을 반환합니다.
그렇다면 다음 표현식은 참 또는 거짓으로 무엇을 평가합니까?
("abcd".Substring(0,0) == "")
문자열은 진정으로 evals이라는 것이 밝혀졌습니다. 그래서 문자열은 빈 문자열로 시작하거나, 즉, 위치 0에서 시작하고 0 길이를 갖는 "ABCD"의 하위 문자열이 빈 문자열과 같다 "고 말합니다. 꽤 논리적 인 IMO.
C#에서 이것은 방법입니다 사양 반응하라고 말한다.
동일하려면 값은 빈 문자열 (빈), 동일한 인스턴스에 대한 참조 이거나이 인스턴스의 시작과 일치해야합니다.
"ABCD".StartSwith ( "")가 True를 반환하는 이유는 무엇입니까?
진짜 답변 :
그렇지 않으면 그렇게해야합니다.
"".startsWith("") == false
"".equals("") == true
but yet
"a".startsWith("a") == true
"a".equals("a") == true
그리고 우리는 동등한 문자열에 의존하는 모든 은행 소프트웨어가 우리 계정을 섞어 놓고 갑자기 Bill Gates가 내 부를 가질 것이고 나는 그를 가질 것이기 때문에 우리는 다시 Y2K를 다시 가질 것입니다! 운명은 나에게 그런 종류가 아닙니다.
두 문자열의 첫 번째 N 문자는 동일합니다. n 두 번째 문자열의 길이, 즉 0입니다.
기록만을 위해서, String.StartsWith()
내부적으로 방법을 호출합니다 System.Globalization.CultureInfo.IsPrefix()
다음을 명시 적으로 확인합니다.
if (prefix.Length == 0)
{
return true;
}
문자열은 "아무것도"와 잘 시작하기 때문입니다.
정규 표현 용어로 생각하면 의미가 있습니다. 모든 문자열 ( "abcd", "또한" "및"sdf nff "가 아님)은 '빈 문자열로 시작'의 정규 표현식을 평가할 때 true를 반환합니다.
C#에서는 그것이 돌아 오는 이유입니다 true
개발자는 구체적으로 코딩 된 것입니다.
당신이 확인하면 소스 코드, 빈 문자열을 처리하기위한 특정 논리를 찾을 수 있습니다.
public Boolean StartsWith(String value)
{
return StartsWith(value, StringComparison.CurrentCulture);
}
public Boolean StartsWith(String value, StringComparison comparisonType)
{
...
if (value.Length == 0)
{
return true;
}