【问题标题】:Compare two Color objects比较两个 Color 对象
【发布时间】:2014-01-26 12:00:48
【问题描述】:

这是 VS2010 和 .NET 4.0。我正在尝试比较两个 System.Drawing.Color 对象。

mStartColor.ToArgb() 的值为16777215

Color.Transparent.ToArgb() 的值为16777215

mStartColor <> Color.Transparent 的值为True

Color 对象的相等性如何实现?

编辑

谢谢大家。我得到了答案,尽管这对我来说没有多大意义(请参阅下面我对 Tim 和 Dave 的回答)。我会将 Tim 的帖子标记为答案,他是第一个回复的,但 Dave 的答案同样内容丰富。

【问题讨论】:

    标签: c# .net colors system.drawing


    【解决方案1】:

    颜色结构包含更多的数据,而不仅仅是实际的颜色信息,例如

    Color [Transparent] 
    R: 255 
    G: 255 
    B: 255 
    A: 0 
    IsKnownColor: True 
    IsEmpty: False 
    IsNamedColor: True 
    IsSystemColor: False 
    Name: Transparent 
    

    Color.FromArgb(16777215)

    Color [A=0, R=255, G=255, B=255] 
    R: 255 
    G: 255 
    B: 255 
    A: 0 
    IsKnownColor: False 
    IsEmpty: False 
    IsNamedColor: False 
    IsSystemColor: False 
    Name: ffffff 
    

    相等比较将使用所有这些来确定相等。你应该按照你已经提出的建议,并使用:

    Color.Transparent.ToArgb().Equals(mStartColor.ToArgb())
    

    【讨论】:

    • 谢谢戴夫。与下面蒂姆的回答大致相同。我不喜欢的是您列出的所有其他字段都是只读的,并且可能直接根据 A、R、G 和 B 的值计算它们的值。那么为什么 Equals() 不能按这种方式工作我们期望它?
    • 我会假设所有“系统”颜色都预定义为常量
    【解决方案2】:

    始终首先阅读documentation

    "要仅根据 ARGB 值比较颜色,您应该使用 ToArgb 方法。这是因为 Equals 和 Equality 成员 不仅仅使用 ARGB 值来确定等效性 颜色。例如,不考虑 Black 和 FromArgb(0,0,0) 相等,因为黑色是一种命名颜色,而 FromArgb(0,0,0) 不是"

    【讨论】:

    • 谢谢。它确实有帮助(实际上是一个精确的答案),但对我来说没有多大意义。如果它们在所有实际目的上都是等价的,为什么它们的对象不相等?
    • @dotNET:因为严格来说它们不是相同的颜色。我不知道在哪里使用Color.Equals 或 Color-==。因此,即使一种颜色看起来像另一种颜色,如果它没有相同的名称或相同的KnownColor,它也不相同。
    【解决方案3】:

    你可以编写一个扩展方法来比较两个颜色对象的 ARGB 值,如果它们相同则返回 true。

    这是扩展方法上的MSDN Documentation

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-02
      • 2012-08-17
      • 2014-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多