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