[英]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.