2011-09-28 4 views
1

난 아직 C#을 비교적 새로운 해요 및 이에 대한 대답은 아마 매우 명백하지만, 다음과 같이 내가 열거가 정의한 그것을변수 비교 문제

를 해결하기 위해 사투를 벌인거야 :

enum Request { 
    None = 0, 
    GetData, 
    SendData, 
    some other values... 
}; 

I는 두 요청 타입으로 정의 제 1 가변 사용 할당

Request currentRequest; // This is a class member variable 
Request request; // This is a local variable within a method. 

다음과 같은 두 가지 변수를 currentRequest = Request.GetData; 두 번째 로컬 변수 요청은 request = (Request) 데이터를 사용하여 할당됩니다. 여기서 데이터는 값 1의 바이트입니다 (값이 수신되는 USB 데이터 버퍼에서 디코딩됨에 따라). 나는 이것이 관련성이 있는지는 모르겠지만 다만이를 언급한다. 내가 두 번째 변수가 선언되는 방법 내에서 비교하려는

, 나는 원래 이런 식으로했다 :

if(request != currentRequest) 
{ 
    // Throw an exception 
} 

이 대부분의 시간을 작동하지만, occaisionally를 제외하고는이 때문에 발생합니다 값은 동일하지 않지만 디버거에서 확인하면 Request.GetData와 같습니다. 이 날은 유사 ... 변수 오히려 내가 사용도 시도 있도록 값보다 객체에 대한 포인터가 될 수 있음을이 두 가지를

!request.Equals(currentRequest) 

request.CompareTo(currentRequest)!=0 

생각을 가지고 대부분의 시간을 작동하지만 occaisionally 디버거에서 값을 확인한 경우에도 모두 Request.GetData입니다.

나를 혼란스럽게하는 것은 그것이 대부분의 시간 동안 작동한다는 것입니다. 단지 occaisionally 실패합니다 - 나는 그것이 작동하거나 계속 작동하지 않을 것이라고 기대합니다.

아이디어가 있으십니까? 변수가 진정으로 입력 한 다음 Request의 경우

+0

enums가 정수이고 비교가 확실히 도청되지 않습니다. request 및 currentRequest 값을 어떻게 얻고 있습니까? – harold

+0

'=='이 될 수없는 유일한 방법은 여기에 해당하지 않는 박스형 인스턴스를'비교 '하는 경우입니다. – leppie

+0

당신은 귀하의 코드에서 요청 및 currentRequest와 함께 boxing/unboxing 작업을 수행하지 않았습니까? – Vasya

답변

1

아니, 그건 유형, 그리고 ==를 사용하는 것은 절대적으로 잘해야한다.

나는 디버거가 너에게 약간 이상한 것을 보여주고 있다고 생각한다. 무슨 일인지 보여주기 위해 예외를 모두 requestcurrentRequest에 포함 시키십시오.

+0

나는 USB 코드 작성 경험이있는 오래된 동료와 이야기를 나누었습니다. 위에서 언급 한 코드는 새로운 데이터가 수신 될 때마다 USB 장치의 콜백에서 발생합니다. 실제로 발생하는 것으로 보이는 것은 비교가 실제로 실패하지만 시간이 갈수록 중단 점에 도달하고 디버거에 표시된 값이 두 번째 콜백입니다 디버거가 비교 값이 아닌 변경된 값을 표시하도록 currentRequest 변수를 수정 중입니다. 이것은 콘솔에 두 변수의 값을 쓰는 것으로 증명되었습니다. 답장을 보내 주신 모든 분들께 감사드립니다! –

+0

@RichardBaxter : 콜백 값을 불변 개체로 캡슐화하여 이러한 상황에서 변경되지 않도록하는 것이 좋습니다. 그러면 한 번에 하나의 "메시지"를 처리 할 수 ​​있습니다. –

+0

제안 해 주셔서 감사합니다. –