4

次のように 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. まったく異なる、予測不可能な何か

テストを書くこともできますが、ドキュメントで保証されている答えを見たいです。

また、Point から PointF への暗黙的な変換が存在し、その逆ではないため、Point が PointF に変換されていると言うには十分だと思いますが、確かなことはわかりません。

4

2 に答える 2

4

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に変換され、元のインスタンスと変換されたインスタンスの値が比較されることを示しています。floatPointPointFfloatPointFPointF

于 2013-01-07T16:37:13.717 に答える
3

ildasm.exe が表示する内容を見てみましょう。

IL_001f:  call       valuetype [System.Drawing]System.Drawing.PointF [System.Drawing]System.Drawing.Point::op_Implicit(valuetype  [System.Drawing]System.Drawing.Point)
IL_0024:  call       bool [System.Drawing]System.Drawing.PointF::op_Equality(valuetype [System.Drawing]System.Drawing.PointF,valuetype [System.Drawing]System.Drawing.PointF)

あ、はい。Point は、比較のために PointF として扱われます。

于 2013-01-07T16:33:05.850 に答える