2012-02-09 40 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

希望这篇文章有帮助!