繁体   English   中英

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

[英]Comparing the reference value in C# just like C/C++

我的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()始终为true,但是在同步到新的A和B之后,现在a != b.getA() 我使用调试器比较了a和b.getA()的元素,但它们似乎是相同的。

有什么方法可以比较a和b.getA()的引用(地址)吗? 使用C / C ++,我可以轻松地获取指针值,但是我不知道如何使用C#来实现。

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

ex 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());
}

您可以在此处阅读更多关于blittable和non-blittable的信息

希望这篇文章对你有帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM