2008-10-08 3 views
1

그래, 이건 이상한거야. 쓰레기 데이터는 무작위가 아니며 실행 파일 자체의 하위 문자열로 보입니다.문자열 (C#)의 정크 데이터를 야기한 예외

private void Form1_Load(object sender, EventArgs e) 
{ 
    string s = GetValue(); 
    // at this point, s == "400". Why isn't really relevant (dumbed down a test) 
    if (s != "18446744073709551615") 
     throw new Exception(); 
     // When the exception is thrown though, the string is set to random 
     // data from inside the executable. 
} 

이것은 다른 장소에있는 및 String.format() 호출로 GetValue 특정 겉보기에 하찮은 구현 세부 사항()에 의존하는 것 같다.

누구나 비슷한 것을 경험했거나 이와 관련하여 어떤 아이디어가 있습니까?

+0

나는 당신이 데이터를 확인하는 "때"가 또 다른 큰 문제는 어떻게 더 중요한 것은 "S"의 데이터를 점검되고있다 –

+0

얼마나 오래 상관없이 정의를 GetValue()의를 포함하지한다고 생각? 예외가 throw 된 후 "s"가 범위를 벗어난 후에 확인하고 있습니까? –

+0

예, VS가 처리되지 않은 예외 사항을 팝업 한 후입니다. 전에는 로컬 변수에 대해 이런 일이 발생했음을 기억하지 못합니다. –

답변

2

을 설명 지방 주민 "VS의 창"

"그리고 나는 그것을 확인하고 있습니다." 일반적인 믿음과는 달리 C#은 어느 정도의 최적화를 수행 할 수 있습니다. 함수 마지막에 "KeepAlive"를 추가하지 않으면 실제로 값을 저장하지 않아도됩니다.

+0

Ryan과 같은 질문입니다. 함수의 시작 부분에 선언 된 정수가 문자열처럼 예외와 함께 사라지지 않는 이유는 무엇입니까? –

+0

사라 졌는지 어떻게 알 수 있습니까? 그것은 다른 위치에서 더 적은 공간을 차지 했으므로 아직 발판을 세우지 않았을 것입니다. –

+0

음, C#이기 때문에 int는 값 유형이고 문자열은 참조 유형입니다. –

0

예외가 던져 범위를 벗어나 이제 한 후에는 다음 메모리에 앉아 쓰레기에 지나지 가리키는해야 변수를 확인하는 경우. 예외가 발생하기 전후에이 변수의 값을 검사 해 보았습니까?

+0

이 경우 인 것 같습니다.하지만 왜 문자열로만 발생하는 것입니까? 동일한 범위의 정수가 있으면 "지역"창에서 그 값을 볼 수 있습니다. –