我创建了一个自定义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())
我仍然不确定这是否正确。
答案 0 :(得分:2)
我知道,我可以简单地将两个变量都转换回enum然后 比较他们得到正确的结果。
那样做。 Object equality by default is reference equality,即那两个引用指向内存中的相同位置。两个盒装枚举是内存中两个不同位置的两个对象,这就是为什么它们总是不相等,无论它们包含什么值。
此外,保留尽可能多的类型信息通常是一个好主意;这让编译器可以帮助您编写正确的程序。将m_LastCategory
变量键入为Object
会违反此原则。