为什么这个值是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;
}
另外,我不明白为什么Color
中FromArgb
函数的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
还是Red
或Chartreuse
,而"漂亮"的方法(使用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]);
}
}