2013-01-07 20 views
4

我需要一個的PointF比作點如下:與點相比,pointf是否圓整?

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而不是相反,所以我認爲足夠要說點被轉換爲的PointF但同樣,我不知道。

+0

您是否嘗試過反向工程代碼? – nothrow

+1

你認爲是正確的,任何隱含發生的轉換都不會涉及任何數據丟失,因此int轉換爲float – prthrokz

+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_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; 
} 

這表明int值被轉換爲float值時Point轉換爲PointF,然後從原始PointF實例和轉換PointF實例的float值進行比較。

+0

完美。比我想得更深入。 – AppFzx

+0

很高興能幫到你! – rsbarro

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) 

所以,是的。該點被視爲用於比較的PointF。