比较两个转换为对象的枚举值
Compare Two Enum Values Cast to Object
我创建了一个自定义 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
不同(我肯定知道),它总是 returns true
.
我知道,我可以简单地将两个变量都转换回枚举,然后比较它们以获得正确的结果。但是我使用 Object
是为了避免值的常量 boxing/unboxing 并使我的代码更加优雅。所以我想知道有没有什么办法可以解决这个问题。
到目前为止我发现的唯一可行的替代方法是这个:
if (m_ComboBox.SelectedItem.ToString() != m_LastCategory.ToString())
而且我仍然不确定这是继续进行的正确方法。
I know, I could simply cast both variables back to enum and then
compare them getting the right result.
这样做。 Object equality by default is reference equality,即这两个引用是否指向内存中的同一位置。两个盒装枚举是内存中两个不同位置的两个对象,这就是为什么无论它们包含的值如何,它们总是不相等的。
此外,通常最好保留尽可能多的类型信息;这让编译器可以帮助您编写正确的程序。将 m_LastCategory
变量键入 Object
违反了这一原则。
我创建了一个自定义 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
不同(我肯定知道),它总是 returns true
.
我知道,我可以简单地将两个变量都转换回枚举,然后比较它们以获得正确的结果。但是我使用 Object
是为了避免值的常量 boxing/unboxing 并使我的代码更加优雅。所以我想知道有没有什么办法可以解决这个问题。
到目前为止我发现的唯一可行的替代方法是这个:
if (m_ComboBox.SelectedItem.ToString() != m_LastCategory.ToString())
而且我仍然不确定这是继续进行的正确方法。
I know, I could simply cast both variables back to enum and then compare them getting the right result.
这样做。 Object equality by default is reference equality,即这两个引用是否指向内存中的同一位置。两个盒装枚举是内存中两个不同位置的两个对象,这就是为什么无论它们包含的值如何,它们总是不相等的。
此外,通常最好保留尽可能多的类型信息;这让编译器可以帮助您编写正确的程序。将 m_LastCategory
变量键入 Object
违反了这一原则。