2011-09-28 101 views
1

我還是比較新的C#和答案,這可能是很明顯的,但我在努力解決這個問題變量比較的問題

我已經定義了一個枚舉如下:

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

我然後有兩個變量都定義爲類型請求如下

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

第一變量被使用分配currentRequest = Request.GetData; 第二局部變量請求是使用請求=(請求)的數據,其中數據是值1字節(作爲值被從USB數據的緩衝器被接收的解碼)來分配。我不知道這是否相關,但提及它以防萬一。

我想他們其中第二變量聲明的方法中比較,我本來是這樣的:

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

這工作的大部分時間,但occaisionally拋出異常,因爲這兩個值不等於,但是當我在調試器中檢查它們時,它們都等於Request.GetData。這讓我思考這兩個變量可能指向對象的指針,而不是價值,所以我嘗試使用也...

!request.Equals(currentRequest) 

request.CompareTo(currentRequest)!=0 

,同樣這兩種工作的大部分時間,但occaisionally即使在調試器中檢查這些值時它們都失敗,它們都是Request.GetData。

什麼是真正讓我感到困惑的是,它的作品大部分時間,卻偏偏沒有occaisionally - 我希望它工作或不工作始終。

任何想法?

+0

枚舉是整數,比較絕對不是竊聽 - 你是如何得到的請求,並currentRequest值是多少? – harold

+0

它們不能是'=='的唯一方法是'比較'盒裝實例時,這裏不是這種情況。 – leppie

+0

你確定在你的代碼中沒有請求和currentRequest的裝箱/拆箱操作嗎? – Vasya

回答

1

不,如果變量真的是Request那麼這是一個類型,並使用==應該是絕對好的。

我懷疑調試器顯示你的東西有點奇怪。我建議你做的例外包括requestcurrentRequest告訴你這是怎麼回事。

+0

我跟一位在編寫USB代碼方面經驗豐富的老同事講話,他給了我一些指導。我上面提到的代碼發生在從每當接收到新數據的USB設備,這似乎是發生的是,比較是真正失敗的回調,但受時間斷點一直打到並顯示在調試器第二個回調的值已經開始修改currentRequest變量,因此調試器顯示更改後的值,而不是比較值。通過將這兩個變量的值寫入控制檯證明了這一點。謝謝大家誰回覆! –

+0

@RichardBaxter:值得將回調的值封裝到一個不可變的對象中,以避免它們在這種情況下發生變化 - 所以您可以一次處理一個「消息」。 –

+0

感謝您的建議,我會盡力。 –