System.Drawing.Color 相等运算符不0xffffffff视为 Color.White



为什么这个值是false

Color.FromArgb(255, 255, 255, 255) == Color.White

更新这是设计的

下面是Color结构中反编译的Equals函数的副本:

public override bool Equals(object obj)
{
    //probably failure to convert from C++ source,
    //the following line should be invalid in C#, nevermind
    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(this.name)));
        }
    }
    return false;
}

我的问题是,MSFT到底为什么要把我和白色的丑陋方式进行比较?

static bool AreEqual(Color a, Color b)
{
  if (!a.Equals(b))
  {
    return
      a.A == b.A &&
      a.R == b.R &&
      a.G == b.G &&
      a.B == b.B;    
  }
  return true;
}

另外,我不明白为什么ColorFromArgb函数的1-arg过载需要int,它应该能够采取uint (0xffffffff)

.NET中的颜色就是这样工作的:

这个结构只与其他Color结构进行比较。来仅根据ARGB值比较颜色,您应该执行以下操作:

如果(color1.ToArgb () = = color2.ToArgb())…

这是因为。equals和==操作符确定等价性不仅仅使用颜色的ARGB值。例如,颜色。Black和color . fromarb(0,0,0)不被认为是相等的颜色。黑色是命名颜色,而color . fromarb(0,0,0)不是。

编辑:附加答案。

我的问题是,MSFT到底为什么要把我和白色的丑陋方式进行比较?

如果你以这样一种方式比较颜色,你想知道它们是否完全相同的颜色,直到ARGB组件的值,那么你应该以"丑陋"的方式比较它们。如果你用大多数。net程序员使用Color结构的相同方式比较颜色,那么你只想知道某些颜色是White还是RedChartreuse,而"漂亮"的方法(使用Equals和==)简单,易于使用,并且非常可读。

另外,"丑陋"的方式不是你发布的方法,而是这个:

if (color1.ToArgb() == color2.ToArgb()) ...

其实没那么丑。

还有一件事我不明白为什么Color的1参数构造函数接受int,它应该能够接受int (0xffffffff)

我想说,它应该能够采取uint,由于不可避免的混乱和颜色错误,将导致。很容易编写一个方法来完成此操作。

Color是一个结构,它包含超过四个字节的值。试试这个:

Color.FromArgb(255, 255, 255, 255).ToArgb() == Color.White.ToArgb()

The Color。fromarbb(255,255,255,255)不是一个命名的颜色,所以它的Name属性将是ffffff,对于命名的颜色,将是color。白色,名字就是白色。所以你的比较不起作用

可以使用

Color.FromArgb(255, 255, 255, 255).ToArgb() == Color.White.ToArgb()

(Color.FromArgb(255, 255, 255, 255).R == Color.White.R && Color.FromArgb(255, 255, 255, 255).G == Color.White.G && Color.FromArgb(255, 255, 255, 255).B == Color.White.B && Color.FromArgb(255, 255, 255, 255).A == Color.White.A)

如果我必须使用HTML颜色(这是我喜欢的),我使用这个:TextBox1。BackColor = System.Drawing.ColorTranslator.FromHtml("#FFFFFF")

名称不同,在Immediate窗口中查看这些结果:

?Color.FromArgb(255, 255, 255, 255)
"{Name=ffffffff, ARGB=(255, 255, 255, 255)}"
    A: 255
    B: 255
    G: 255
    IsEmpty: false
    IsKnownColor: false
    IsNamedColor: false
    IsSystemColor: false
    Name: "ffffffff"
    R: 255
?Color.White
"{Name=White, ARGB=(255, 255, 255, 255)}"
    A: 255
    B: 255
    G: 255
    IsEmpty: false
    IsKnownColor: true
    IsNamedColor: true
    IsSystemColor: false
    Name: "White"
    R: 255

我刚刚花了30分钟研究这个,因为你也让我很好奇,但是当我回来的时候,看起来其他人发布的正是我发现的。你是在比较两个不同的东西。你必须把它们放在同一个水平上,这样你就可以用其中一个系统来比较它们。绘图属性或其他海报建议之一。

public static class ExtendsUInt32
    {
        /// <summary>
        /// Converts a System.UInt32 to a System.Drawing.Color.
        /// Ex: var orangyColor = (0xFFDDAA22).ToColor(); //some kind of orange
        /// <remarks>
        /// Easier than writing var orangyColor = Color.FromArgb(unchecked((int)0xFFDDAA22))),
        /// or var orangyColor = Color.FromArgb(255,230,200,50);
        /// </remarks>
        /// </summary>
        /// <param name="color">A uint containing bytes A,R,G,B in high-to-low order (whatever this stores as on your platform's endianness).</param>
        /// <returns>A freshly picked System.Drawing.Color.</returns>
        public static Color ToColor(this UInt32 color)
        {
            var bytes = BitConverter.GetBytes(color);
            if (BitConverter.IsLittleEndian) { bytes = bytes.Reverse().ToArray(); }
            return Color.FromArgb(bytes[0],bytes[1],bytes[2],bytes[3]);
        }
    }

相关内容

  • 没有找到相关文章

最新更新