2

你能告诉我为什么以下条件是错误的吗?

List<Image> SelectedImages = new List<Image>();
SelectedImages.Add(Properties.Resources.my_image);
if (SelectedImages[0] == Properties.Resources.my_image)     // false
{
    ...
}

即使我写:

SelectedImages[0] = Properties.Resources.my_image;
if (SelectedImages[0] == Properties.Resources.my_image)     // false
{
    ...
}

我怎样才能使这种比较起作用?

4

2 回答 2

3

它们不相等,因为 Properties.Resources 制作了图像的副本并将该副本返回给您的代码。每次获得该图像时,您实际上是在创建一个全新的 Image 对象。它会创建一个副本,因为资源通常应该表现得像常量。如果您(例如)以某种方式修改了图片,您不希望您的代码更改图片。

那么你的代码会发生什么?您最终会比较两个恰好包含相同数据的不同图像对象。.NET 看到您有两个不同的对象并返回 false。它不会进行“深度”比较来查看对象是否具有相同的数据/状态。

这是一篇文章的链接,该文章从高层次上解释了正在发生的事情:https ://navaneethkn.wordpress.com/2009/10/15/understanding-equality-and-object-comparison-in-net-framework/

解决您的问题的一种快速方法是逐像素比较资源图像和您的 SelectedImage 图像,以查看它们是否“相等”。这显然会表现不佳。另一种更有效的方法可能是构建一个字典并使用一个键来跟踪图像最初来自哪里。

于 2013-06-19T21:30:11.300 回答
1

只需使用TagImage 对象中的属性。你可以在那里存储任何你想要的东西。只需像这样设置您的图像...

Image img_dbActive = MyApp.Properties.Resources.tray_icon_database_active;
img_dbActive.Tag = "tray_icon_database_active";

Image img_dbIdle = MyApp.Properties.Resources.tray_icon_database_idle;
img_dbIdle.Tag = "tray_icon_database_idle";

ToolStripStatusLabel lbl = new ToolStripStatusLabel("Database is doing something...", img_dbActive);
lbl.Image.Tag = "tray_icon_database_active";

if (lbl.Image.Tag == img_dbActive.Tag)
{
    //Images match
}
于 2017-01-04T03:35:08.810 回答