c# - 为什么这个颜色比较失败?

标签 c# colors

为什么这个断言会失败?

Assert.AreEqual( Color.Red, Color.FromArgb( Color.Red.A, Color.Red.R, Color.Red.G, Color.Red.B ) );

最佳答案

以下是颜色比较的实现方式:

public override bool Equals(object obj)
{
    if (obj is Color)
    {
        Color color = (Color) obj;
        if ((this.value == color.value)
            && (this.state == color.state)
            && (this.knownColor == color.knownColor))
        {
            return ((this.name == color.name)
                || ((this.name != null)
                   && (color.name != null)
                   && this.name.Equals(color.name)));
        }
    }
    return false;
}

工作原理:

  1. 字段 value 比较。它是当前实例的 Argb 值(它们存储在 long 类型的一个字段中)。所以,如果 Argb 不同,我们就有不同的颜色。您成功通过了这一步。
  2. 字段 state 比较。它显示了颜色的创建方式:来自 Argb、来自 KnownColor 或按名称。 实际上你的比较在这一步失败了。
  3. 字段 knownColor 比较。它具有 KnownColor 枚举值,如果颜色不是从已知颜色创建的,则为零。
  4. 字段 name 比较。它对所有颜色都有 null 值,但按名称创建的颜色除外。

所以,如果你想比较颜色的值,你应该使用 value 字段进行比较(它由 ToArgb 方法返回):

Assert.AreEqual(color1.ToArgb(), color2.ToArgb());

编辑

要创建某些颜色的副本,您可以使用以下扩展方法:

public static class ColorHelper
{
    public static Color Copy(this Color color)
    {
        if (color.IsKnownColor)
            return Color.FromKnownColor(color.ToKnownColor());

        if (color.IsNamedColor)
            return Color.FromName(color.Name);

        // this is better, then pass A,r,g,b separately
        return Color.FromArgb(color.ToArgb()); 
    }

现在断言通过了:

Assert.AreEqual(Color.Red, Color.Red.Copy());

但这没有任何意义,因为您可以在程序的每个地方使用单一颜色实例:)

关于c# - 为什么这个颜色比较失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9994019/

相关文章:

c# - 如果语句突然被 Visual Studio 2010 在下一行格式化

c# - WPF EventTrigger 并不总是触发

c# - Exception 对象是否可能由于其内部错误而引发另一个异常?

javascript - 如何减去asp文本框值并将结果放入asp标签中

javascript - React Native TextInput 不同字母/字符的不同背景颜色?

javascript - 在 JavaScript 中构建类似 LINQ 的查询 API

javascript - HTML & Js 颜色选择器 : What am I doing wrong?

colors - 计算 1 种颜色的颜色范围,从浅色到深色(er)色

安卓。 CheckBox偏好颜色

java - 如何从使用 LinearGradientPaint 绘制的 Canvas 中获取特定的 RGB 值?