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

C# 比较C中的参考值,就像C/C++;,c#,debugging,pointers,reference,C#,Debugging,Pointers,Reference,我有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) {

我有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#实现这一点

您可以使用它。如果不重写
Equals
==
将产生相同的结果

exp
ReferenceEquals(a,b.getA()

您可以使用它。如果您不重写
Equals
=
,它将产生相同的结果


ex
ReferenceEquals(a,b.getA()

使用方法。祝你好运。

使用方法。祝你好运。

除非你使用的是不安全的代码,否则你不能在C#中使用指针。这是语言设计者非常慎重的决定,因为指针容易出错,使优化和垃圾收集更加困难。但是,你可以通过“地址”来比较两个对象也就是说,通过使用

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

除非您使用的是不安全的代码,否则您不能在C#中使用指针。这是语言设计者非常慎重的决定,因为指针容易出错,并且使优化和垃圾收集更加困难。但是,您可以通过“地址”来比较两个对象,即使用

Console.WriteLine(object.ReferenceEquals(a, b.getA()));
如前所述,我会做你想做的事

使用代码也是一种可能,并且对某些应用程序可能有用。正如您在这里所展示的,这将是一种过分的做法,可能不值得亚当指出的错误和优化问题的可能性——但是,如果速度成为一个问题,或者如果您是feeling怀旧记忆相关错误

但是,正如前面提到的那样……在C#中使用指针是很少见的。

正如前面提到的,它将完成您在这里要做的事情

使用代码也是一种可能,并且对某些应用程序可能有用。正如您在这里所展示的,这将是一种过分的做法,可能不值得亚当指出的错误和优化问题的可能性——但是,如果速度成为一个问题,或者如果您是feeling怀旧记忆相关错误

<>但是,正如提到的…在C语言中指针的使用是稀有的。

< P>可以使用“对象。引用相等”的方法来比较引用类型的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());
}
你可以阅读更多关于飞艇和非飞艇的信息

希望此帖子有帮助!!

< p>您可以使用“Objist.RealthError”方法来比较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());
}
你可以阅读更多关于飞艇和非飞艇的信息


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

我是没有抓住要点,还是你在寻找答案?因为A和B是引用类型,而不是值类型,比较“它们的指针”正是你正在做的事情;这就是为什么它是相等的。除非你在处理奇怪的类,==将为类(而不是值类型/字符串)做你想要做的事情。但是,如果有人重写==运算符,请小心。Object.ReferenceEquals是最安全的(但没有那么漂亮)。我是没有抓住要点,还是你在寻找?因为A和B是引用类型,而不是值类型,比较“它们的指针”这正是您已经在做的事情;这就是它返回相等值的原因。除非您使用奇怪的类,==将为类(而不是值类型/字符串)执行您想要的操作。但是,如果有人重写==运算符,请小心。Object.ReferenceEquals是最安全的(但没有那么漂亮)。