2016-11-09 75 views
1

我創建了一個自定義UserControl。它裏面有它的初始化過程中充滿了枚舉值的ComboBox比較兩個枚舉值轉換爲對象

m_ComboBox.Items.AddRange((Object[])Enum.GetValues(typeof(Categories))); 

因爲我想保留以前ComboBox.SelectedItem的軌道,我創建了我保存其最後的值的變量:

private Object m_LastCategory; 

private void ComboBoxSelectedIndexChanged(Object sender, EventArgs e) 
{ 
    if (m_ComboBox.SelectedItem != m_LastCategory) 
     DoSomething(); 

    m_LastCategory = m_ComboBox.SelectedItem; 
} 

if語句未按預期工作。其實,即使m_LastCategory和當前SelectedItem是不同的(我知道它肯定),它總是返回true

我知道,我可以簡單地將兩個變量都返回枚舉,然後比較它們是否獲得正確的結果。但我使用Object是爲了避免不斷的對值進行裝箱/取消裝箱,並讓我的代碼更加優雅。所以我想知道是否有辦法解決這個問題。

的我發現迄今唯一的工作方法是這樣:

if (m_ComboBox.SelectedItem.ToString() != m_LastCategory.ToString()) 

,我仍然不知道它的前進的正確道路。

回答

2

我知道,我可以簡單地將這兩個變量返回枚舉,然後 比較它們獲得正確的結果。

這樣做。 Object equality by default is reference equality,即指向存儲器中相同位置的那兩個參考。兩個盒裝枚舉在內存中的兩個不同位置是兩個對象,這就是爲什麼它們總是不平等,而不管它們包含的值如何。

此外,通常保留儘可能多的類型信息是一個好主意;這可讓編譯器幫助您編寫正確的程序。鍵入您的m_LastCategory變量爲Object違反此原則。