我需要将 PointF 与 Point 进行比较,如下所示:

PointF myPointF = new PointF(1.1,1.1);
Point myPoint = new Point(1,1);
bool Equal = (myPointF == myPoint);

但我想知道以下哪些是正确的,或者比较实际发生的方式是否有所不同:
  • myPoint 首先转换为 PointF
  • myPointF 四舍五入为 Point first
  • 完全不同且不可预测的东西

  • 人们可以编写一个测试,但我想看到文档中保证的答案。

    此外,there exists an implicit conversion from Point to PointF 而不是相反,所以我认为这足以说明 Point 正在转换为 PointF,但同样,我不确定。

    最佳答案

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

    这表明当 int 转换为 float 时,Point 值转换为 PointF 值,然后比较来自原始 float 实例和转换后的 PointF 实例的 PointF 值。

    关于c# - 与点相比,pointf 是否四舍五入?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14199856/

    10-13 09:29