比较C#中的参考值,就像比较C/C++一样

本文关键字:比较 一样 C++ 参考 | 更新日期: 2023-09-27 18:23:55

我有一个B类,它有A类,这是A类和B类的简化版本。

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;
    }
    ...
}

我需要比较对象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#来做到这一点。

比较C#中的参考值,就像比较C/C++一样

您可以为此使用Object.ReferenceEquals。如果不覆盖Equals==,则会产生相同的结果。

ReferenceEquals(a, b.getA()

除非使用不安全的代码,否则不能在C#中使用指针。这是语言设计者深思熟虑的决定,因为指针容易出错,使优化和垃圾收集更加困难。然而,您可以通过"地址"来比较两个对象,即通过使用来检查它们是否是相同的引用

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

使用Object.ReferenceEquals方法。祝你好运

如前所述,Object.ReferenceEquals将执行您在这里所追求的操作。

使用不安全的代码也是可能的,并且可能对某些应用程序有用。就你在这里所展示的内容而言,老实说,这太过分了,可能不值得亚当指出的错误和优化问题的可能性——但如果速度成为问题,这个选项肯定是存在的,绝对值得。或者,如果你对与记忆相关的错误感到怀旧!

但是,正如不安全代码教程所提到的。。。在C#中使用指针是罕见的。

您可以使用"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());
}

您可以在这里阅读更多关于blitable和nonblitable的信息。

希望这篇文章能有所帮助!!