我需要按如下方式比较 PointF 和 Point:
PointF myPointF = new PointF(1.1,1.1);
Point myPoint = new Point(1,1);
bool Equal = (myPointF == myPoint);
但我想知道以下哪些是正确的,或者比较的实际发生方式是否正确:
- 首先将 myPoint 转换为 PointF
- myPointF 首先四舍五入为 Point
- 完全不同且不可预测的东西
可以编写测试,但我希望在文档中看到有保证的答案。
此外,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_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;
}
这表明当 Point
被转换为 PointF
时,int
值被转换为 float
值,然后比较来自原始 PointF
实例和转换后的 PointF
实例的 float
值。
关于c# - 与point相比,pointf是否四舍五入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14199856/