4

我需要将 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 到 PointF 的隐式转换,而不是相反的转换,所以我认为这足以说明 Point 正在转换为 PointF,但同样,我不确定。

4

2 回答 2

4

使用 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;
}

这表明当转换为 a时,这些int值被转换为float值,然后将原始实例和转换后的实例的值进行比较。PointPointFfloatPointFPointF

于 2013-01-07T16:37:13.717 回答
3

让我们看看 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 进行比较。

于 2013-01-07T16:33:05.850 回答