C# 比较C中的参考值,就像C/C++;
我有B类有A类,这是A类和B类的简化版本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) {
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
或==
将产生相同的结果
expReferenceEquals(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是最安全的(但没有那么漂亮)。