C #의 암호
나는 “CorruptedString”(솔루션)을 발견했습니다 . 다음은 책의 프로그램 코드입니다.
var s = "Hello";
string.Intern(s);
unsafe
{
fixed (char* c = s)
for (int i = 0; i < s.Length; i++)
c[i] = 'a';
}
Console.WriteLine("Hello"); // Displays: "aaaaa"
이 프로그램에 "aaaaa"가 표시되는 이유는 무엇입니까? 이 프로그램을 다음과 같이 이해합니다.
- CLR에 인턴 풀 보유 "안녕하세요"(나는 화상 숭배로서 인턴 풀).
string.Intern(s)
CLR이 "Hello"문자열을 예약하기 때문에 아무 작업도하지 않습니다. 예약 된 "Hello"문자열의 주소 만 반환합니다 (객체 s는 동일한 주소를 가짐).- 프로그램은 포인터를 통해 "Hello"문자열의 내용이 변경됩니다.
- ??? Hello 학원 인턴 풀에 없어야하며 오류 집합니다! 하지만 괜찮습니다. 프로그램이 확장으로 실행됩니다.
인턴 풀을 이해하면 높이 사전과 가변됩니다. 아니면 내가 뭔가를 놓친 까 요?
처음으로 "Hello"를 사용하면 응용 프로그램 전역 저장소에 포함됩니다. 당신이 실행하고있는 사실을 바탕으로 unsafe
(이상 대한 모드 unsafe
여기에 ) 당신은 높은 수준의 값에 할당 된 위치에 있습니다 s
.
for (int i = 0; i < s.Length; i++)
c[i] = 'a';
당신은 메모리에있는 것을 편집하고 있습니다. 다음에 인턴 된 메모리 저장소에 액세스 할 때 방금 변경 한 데이터를 유지하면서 메모리의 동일한 주소를 사용합니다. 그것은 없이는 불가능할 것 unsafe
입니다. string.Intern(s);
여기서 역할을하지 않습니다. 주석 처리하면 동일하게 작동합니다.
그런 다음
Console.WriteLine("Hello"); // Displays: "aaaaa"
.NET
주소가 있는지 확인 "Hello"
하고 방금 업데이트 한 주소가 있는지 확인 합니다 "aaaaa"
. 수 'a'
문자의 길이에 의해 결정된다 "Hello"
.
@Jaroslav Kadlec 대답이하고 완전하면서도코드 동작에 대한 정보를 더 추가 하고이 경우 왜string.Intern(s);
쓸모가없는지 추가하고 싶습니다.
인턴 풀 소개
.NET은 모든 고래 리터럴에 대해 인스턴스를 자동으로 실행합니다. 이는 애플리케이션의 모든 고유 노드에 대한 참조를 저장하는 특수 테이블을 사용하여 수행됩니다.
그러나 명시 적으로 선언 된 문자열 만 컴파일-step에서 인턴된다는 점에 유의하는 것이 중요합니다 .
다음 코드를 고려하십시오.
var first = "Hello"; //Will be interned
var second = "World"; //Will be interned
var third = first + second; //Will not be interned
어떤 상황에서는 물론 우리는 인턴에 실행 중 일부를 원하는 것으로 String.Intern
확인 후 수행 할 수 있습니다 String.IsInterned
.
그래서 OP의 스 니펫으로 돌아갑니다.
//...
var s = "Hello";
string.Intern(s);
//...
이 경우에는 string.Intern(s);
이미 단계에서 인턴하므로 쓸모가 없습니다.
참고 URL : https://stackoverflow.com/questions/41219991/corrupted-string-in-c-sharp
'ProgramingTip' 카테고리의 다른 글
Node.js + express.js + passport.js : 서버 재시작 사이에 인증 유지 (0) | 2020.11.02 |
---|---|
필요한에 배경을 추가해야합니까? (0) | 2020.11.02 |
코드 흐름을하는 도구 (C / C ++) (0) | 2020.11.02 |
"다중 대상 패턴"Makefile 오류 (0) | 2020.11.02 |
스칼라 변수를 선언해야합니다. (0) | 2020.11.02 |