2011-09-28 74 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

感谢您的建议,我会尽力。 –