与点相比,点是圆润的

本文关键字: | 更新日期: 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);

但是我想知道下面哪个是正确的,或者如果有不同的东西是正确的,那么比较是如何发生的:

  1. myPoint首先转换为PointF
  2. myPointF首先四舍五入到一个点
  3. 完全不同的和不可预测的

一个人可以写一个测试,但我希望看到答案保证在文档。

同样,存在从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_ImplicitPointF.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。

相关文章:
  • 没有找到相关文章