2014-07-19 2 views
0

메모리에 저장할 때 문자열의 끝이 \0 문자입니까? 컴파일러는 어떻게 끝을 알고 있습니까 ?? 그것이 사실이라면C# 문자열의 끝

다음 = -1

+0

아니요. 문자열은 C와 같이 Null로 끝나는 대신 문자 배열과 길이 마커를가집니다. – Casey

+0

0으로 끝나는 문자열은 'C'에서 사용되며 C#에서는 사용되지 않습니다. –

+2

.NET 문자열의 끝에 0이있는 이유는 I/O에서 문자열이 많이 사용되고 운영 체제 호출이 필요하기 때문입니다. C 호출. 컴파일러는 관련이 없으므로 대부분의 문자열 처리 코드는 CLR에 있으며 끝 부분에 제로 터미네이터를 가져옵니다. –

답변

8

내부적

MSDN 가입일

Console.WriteLine(str.LastIndexOf('\0')); 

길이를 반환해야하지만, 출력은 텍스트가 순차 읽기로 저장된 Char 개체의 유일한 컬렉션입니다. C# 문자열 끝에는 null 종결 문자가 없습니다. 그러므로 C# 문자열은 임의의 수의 내장 된 널 문자 ('\ 0')를 포함 할 수 있습니다. 이 그것을 직접 전달 될 수있는 수단으로서 존 소총의 Strings in .NET and C#

에서도

문자열은 널 종료 멀리 API에 관한 한 아니지만는 문자 배열은 널 종료 인 inter-op가 문자열을 유니 코드로 마샬링해야한다고 지정한다고 가정하면 복사 작업이 포함되지 않은 관리되지 않는 함수에 적용됩니다.

가 간단히 내부 문자 배열은 \0로 끝나지 않지만 API (예를 들어, LastIndexof)는 무시된다. 수동 교류 # 문자열 (예를 들어, Hello\0World)의 중간에 \0를 삽입하면

또한,는 C# 문자열 API가 그것을 무시하지만, 다른 API의의가 첫 번째 \0 과거의 모든 것을 무시하고 결국하지 않을 수 있습니다 (예 : , World).

string 객체가 문자열의 길이를 포함하는 reference source

public override int GetHashCode() { 
    //... 
    Contract.Assert(src[this.Length] == '\0', "src[this.Length] == '\\0'"); 
    //... 
} 
+0

좋아요, LastIndexOf가 \ 0을 무시하면 그 존재를 확인하는 방법을 제안 해주세요. – Sujeet

+0

@SujeetKumar 다시 전체 C# API에서 무시됩니다. 증명을 원한다면 1) 소스 코드를 보거나 2) 널 문자의 존재를 검사하는 작은 C 프로그램을 작성하고 P/Invoke를 사용하여 C#에서 호출 할 수 있습니다. C# 소스 코드의 일부분을 추가하여 문자열이 null-char로 끝나는 것을 증명했습니다. – dcastro

+1

당신은 우리의 말을 받아 들일 수 있습니다. 디버거를보고 싶다면 Debug + Windows + Memory + Memory 1 창이 나타납니다. 주소 상자에 문자열 변수 이름을 입력하십시오. 패딩이나 다른 객체에 속하는 바이트와 구별하기가 어렵지만 0은 정확히 두드러지지 않습니다. 객체의 syncblk는 종종 0입니다. –

2

보면,이 말은 위치를 알지 방법이다. 실제로 관리되지 않는 호환성을 위해 문자열 끝에 '\ 0'기호가 있지만 관리 코드에서 액세스 할 수 없습니다.

+0

따라서 'LastIndexOf()'의 범위를 벗어납니다. –

관련 문제