我理解,相等性检查的语义会根据您是检查值类型还是引用类型而发生更改。引用类型不是更高级别的指针吗?使用引用类型时到底发生了什么?现在运行时是否正在处理所有解除引用,向上转换等问题?
答案 0 :(得分:4)
是的,确切地说,引用类型只是由垃圾收集器管理的内存的“指针”。
C ++:
MyClass* mc = new MyClass();
Myclass* mc2 = mc;
mc == mc2 // true, points at the same memory address
C#:
MyClass mc = new MyClass();
MyClass mc2 = mc;
mc == mc2 // also true for the same reason
答案 1 :(得分:2)
引用类型的C#相等运算符检查两个操作数是否引用同一个对象,除非相等运算符被覆盖:
http://msdn.microsoft.com/en-us/library/53k8ybth.aspx
有关Object.Equals
和等于运算符==
的详细信息,请查看此处:
答案 2 :(得分:0)
答案 3 :(得分:0)
Eric Lippert有一篇好文章(也解释了参考,指针和地址之间的关系)...... http://blogs.msdn.com/ericlippert/archive/2009/02/17/references-are-not-addresses.aspx
答案 4 :(得分:0)
引用是一种用于管理内存中对象的数据结构。如果您熟悉C,则可能使用了fprintf()等缓冲IO例程。如果你在调试器中查看fprintf的FILE句柄,你会发现指向数据的指针只是数据结构的一个依赖于实现的细节。 C库管理fprintf()所需的所有内存分配。
参考也是如此。除非使用GCHandle固定对象,否则实际数据的位置可能会发生变化。但是,固定对象会降低系统效率。您只会这样做以使用非托管代码来连接缓冲区。 另外:我同意timvw关于他链接的Eric Lippert的帖子,但我没有足够的代表投票。