gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:42:40 25 4
gpt4 key购买 nike

我需要按如下方式比较 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com