什么是真的发​​生

什么是真的发​​生

本文介绍了当你这样做的GetType(什么是真的发​​生)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

据我们所知,C#对象有一个指向其类型,所以,当你调用的GetType()它会检查指针并返回真正的类的一个对象。但是,如果我这样做:

  A objA =新的A(); 
obj对象=(对象)objA;
如果(obj.GetType()== typeof运算(对象)); //这是真实的



但是,这里所发生 obj对象=(对象) objA; ?是否建立某种形式的参考对象,引用 objA ,但有一个类型的指针,以对象,或者是它一个完全新的对象,这恰好是指向相同的属性,字段等为 objA ?当然,你现在可以访问两个对象的时候,就会有不同的类型,但指向相同的数据。如何工作



另一个问题是:是的GetType()保证返回的实际类型的对象呢?例如,假设有一个与签名 void方法(对象发件人)并传递类型的对象 A 作为一种方法的参数。请问 sender.GetType()返回类型 A 对象?为什么?



其他棘手的事情是,你可以做(A)OBJ ,也将努力。如何CLR现在 OBJ 一度键入 A



会很高兴,如果有人能通过CLR C#一样。



更新。我休息不好下来一点再清楚不过了,张贴问题之前应该运行的代码。所以,如果的GetType()真的总是返回真正的类型,比所有其他问题变得清晰了。


解决方案


这是在objA参考被复制到变量物镜。 (除非是值类型,在这种情况下,它是盒装和盒子的引用复制到OBJ。)





由于是这样的对象的类型。



Correct.

class A {}
class P
{
    public static void Main()
    {
        A objA = new A();
        object obj = (object)objA;
        bool b = obj.GetType() == typeof(object) ; // this is true
    }
}

No, that's false. Try it!

The reference that is in objA is copied to the variable obj. (Unless A is a value type, in which case it is boxed and a reference to the box is copied to obj.)

Neither. It copies the reference, period. It is completely unchanged.

It doesn't. The question is predicated on an assumption which is false. They will not have different types. They are the same reference. The variables have different types, but that's irrelevant; you're not asking the variable for its type, you're asking the contents of the variable for its type.

For your purposes, yes. There are obscure situations involving COM interop where it does not.

Type A.

Because that's the type of the object.

The C# compiler generates a castclass instruction. The castclass instruction does a runtime check to verify that the object reference implements the desired type. If it does not then the CLR throws an exception.

这篇关于当你这样做的GetType(什么是真的发​​生)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-22 12:05