c# - 与point相比,pointf是否四舍五入?

标签 c# comparison point

我需要按如下方式比较 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 首先四舍五入为 Point
  3. 完全不同且不可预测的东西

可以编写测试,但我希望在文档中看到有保证的答案。

此外,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;
}

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

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

相关文章:

geometry - 展开二维点分布的算法

python - python中的快速数据比较

c# - 如何在 C# 中执行比较函数

mongodb检查点是否在多边形中

c# - MVC 是否会在 return 语句之后以某种方式枚举结果?

javascript - 为什么javascript将0视为空字符串?

java - 绕中心点旋转点

c# - 将 .NET 外部 dll 合并到单个可执行文件

c# - 将类添加到最后一项

c# - 拖放元素的位置 (MouseDragElementBehavior)