与点相比,点是圆润的
本文关键字: | 更新日期: 2023-09-27 17:50:58
我需要按如下方式比较PointF和Point:
PointF myPointF = new PointF(1.1,1.1);
Point myPoint = new Point(1,1);
bool Equal = (myPointF == myPoint);
但是我想知道下面哪个是正确的,或者如果有不同的东西是正确的,那么比较是如何发生的:
- myPoint首先转换为PointF
- myPointF首先四舍五入到一个点
- 完全不同的和不可预测的
一个人可以写一个测试,但我希望看到答案保证在文档。
同样,存在从Point到pointtf的隐式转换而不是反向转换所以我认为这足以说明Point正在被转换为pointtf但是,我也不确定
使用LinqPad,可以很容易地查看IL以查看正在发生的事情。基本上,将Point
转换为PointF
,然后对PointF
调用==
相等法。
例如,使用以下代码:
System.Drawing.PointF myPointF = new System.Drawing.PointF(1.1f ,1.1f);
System.Drawing.Point myPoint = new System.Drawing.Point(1,1);
bool equal = (myPointF == myPoint);
Console.WriteLine(equal);
生成以下IL:
IL_0001: ldloca.s 00 // myPointF
IL_0003: ldc.r4 CD CC 8C 3F
IL_0008: ldc.r4 CD CC 8C 3F
IL_000D: call System.Drawing.PointF..ctor
IL_0012: nop
IL_0013: ldloca.s 01 // myPoint
IL_0015: ldc.i4.1
IL_0016: ldc.i4.1
IL_0017: call System.Drawing.Point..ctor
IL_001C: nop
IL_001D: ldloc.0 // myPointF
IL_001E: ldloc.1 // myPoint
IL_001F: call System.Drawing.Point.op_Implicit //<- convert Point to PointF
IL_0024: call System.Drawing.PointF.op_Equality //<- PointF equality
IL_0029: stloc.2 // equal
IL_002A: ldloc.2 // equal
IL_002B: call System.Console.WriteLine
如果使用ILSpy,可以同时找到Point.op_Implicit
和PointF.op_Equality
的内容。
// System.Drawing.Point
public static implicit operator PointF(Point p)
{
return new PointF((float)p.X, (float)p.Y);
}
// System.Drawing.PointF
public static bool operator ==(PointF left, PointF right)
{
return left.X == right.X && left.Y == right.Y;
}
这表明当Point
被转换为PointF
时,int
的值被转换为float
的值,然后比较原始PointF
实例和转换后的PointF
实例的float
的值。
让我们看看ildasm.exe显示了什么:
IL_001f: call valuetype [System.Drawing]System.Drawing.PointF [System.Drawing]System.Drawing.Point::op_Implicit(valuetype [System.Drawing]System.Drawing.Point)
IL_0024: call bool [System.Drawing]System.Drawing.PointF::op_Equality(valuetype [System.Drawing]System.Drawing.PointF,valuetype [System.Drawing]System.Drawing.PointF)
所以,是的。对于比较,Point被视为PointF。