2012-02-09 19 views
0

我已經B類,其具有A級,這是簡化的類A和版本B.比較在C#就像基準值C/C++

class A 
{ 
    int x; 
    int y; 

    public A(int x, int y) 
    { 
     this.x = x; 
     this.y = y; 
    } 

    public A() 
    { 
     x = 0; 
     y = 0; 
    } 
    ... 
} 

class B 
{ 
    A a; 
    public B(A a) 
    { 
     this.a = a; 
    } 

    public B() 
    { 
     this.a = null; 
    } 

    public A getA() 
    { 
     return a; 
    } 
    ... 
} 

我需要比較對象如下。

public class MyClass 
{ 
    public static void RunSnippet() 
    { 
     var a = new A(10, 20); 
     var b = new B(a); 
     Console.WriteLine(a == b.getA()); 
    } 
} 

a == b.getA()總是正確的,但同步到新的A和B,現在a != b.getA()後。我使用調試器比較了元素a和b.getA()的元素,但它們看起來是一樣的。

有什麼辦法比較a和b.getA()的引用(地址)嗎?使用C/C++,我可以很容易地獲得指針值,但我不知道如何使用C#來完成此操作。

+0

我是否錯過了觀點,或者您在尋找[Object.ReferenceEquals](http://msdn.microsoft.com/zh-cn/library/system.object.referenceequals.aspx)? – 2012-02-09 03:26:32

+0

同步是什麼意思? – colithium 2012-02-09 03:27:13

+0

因爲A和B是引用類型,而不是值類型,所以比較「他們的指針」正是你現在正在做的事情;這就是它迴歸平等的原因。 – dasblinkenlight 2012-02-09 03:27:57

回答

1

除非您使用不安全的代碼,否則不能在C#中使用指針。這是語言設計人員非常慎重的決定,因爲指針很容易出錯,並且使優化和垃圾收集更困難。但是,您可以通過「地址」比較兩個對象,即檢查它們是相同的,通過使用

Console.WriteLine(object.ReferenceEquals(a, b.getA())); 
0

如前所述,Object.ReferenceEquals會做你這裏後在做什麼。

使用unsafe代碼也是一種可能性,可能對某些應用程序有用。對於你在這裏展示的內容,這將是一個真實的矯枉過正,並且可能不值得亞當指出的錯誤和優化問題的可能性 - 但是這個選項當然存在,如果速度成爲一個問題,它肯定是值得的。或者如果你懷念與記憶有關的錯誤!

但是,正如Unsafe Code Tutorial提到的...在C#中使用指針是一種罕見的。

0

您可以使用「Object.ReferenceEquals」方法根據C#來比較引用類型,也可以獲取引用類型的地址,然後在C++中進行比較。

[StructLayout(LayoutKind.Sequential)] // To make type [Class A] blittable 
Class A 
{ 
    int x;  

    public A(int x) 
    { 
     this.x = x; 
    } 
    ... 
} 

Class B 
{ 
    A a; 
    public B(A a) 
    { 
     this.a = a; 
    }  

    public A GetA() 
    { 
     return a; 
    } 
    ... 
} 

main() 
{ 
    var a = new A(10, 20); 
    var b = new B(a); 
    GCHandle gc = GCHandle.Alloc(objA, GCHandleType.Pinned); // Through GCHandle you can access the managed object from unmanaged memory. 
    IntPtr add = gc.AddrOfPinnedObject(); //pointer 
    Console.WriteLine(add.ToString()); 
} 

你可以閱讀更多關於blittable和非blittable here

希望這篇文章有幫助!