关于“构造函数”中的几个小问题,也许面试会问到哦~
?构造函数这玩意也是面试官经常会问到的东西,我们知道一个类的状态初始化就全靠它了,下面提几个小问题。
?既然这么做了,那么设计者肯定就知道了一个原则就是实例构造器中,父类构造器先于子类执行,那么这个先执行就可 ? ? ?以做很多有意思的事情,比如你说的权限验证,可能有人会问为什么要先于子类执行,刚才我也说了,构造函数是用于 ? ? ?初始化本类状态的,这也叫“先扫屋子再请客”的道理吧~,然后风雨兼程的回溯到Object的ctor中。好了,现在来回答 ? ? ?你的问题,先把这个问题简化一下,就不用web项目来演示了。 Main( b =
Console.WriteLine(
Console.WriteLine( }
可以看到,确实Animal于Bird先执行,可能有人会问,那Animal调用的是谁的ctor呢?当然就是Object了,我们可以看看IL:
name =
{ { name =
age =
{ { age =
Age = }
其实这个问题的关键在于,反序列化的时候是否会调用构造函数的问题,先来通过Reflector看下源码,发现并没有代码,觉得 ? ? 有点小奇怪,就用ILSpy反编译一下,同样也没有代码,不可否认,底层肯定是有代码执行的,要么反编译不出来,要么clr用了 ? ? 其他的方式,反正我们看不到实现源代码,如果大家有什么好意见可以帮帮我,谢谢了 Reflector截图: ILSpy截图: 据资料说,里面最后调用了FormatterServices里面的GetSafeUninitializedObject来分配对象内存,分配完后就不走构造器 了,所以针对这个问题,只能记住了。最后为了验证一下,执行完代码之后确实没有走构造函数。
这个问题问的好,编译器会根据性能考虑,不会调用值类型的构造函数,即使你强制的new一下也不会执行 Main( Point point =
}
不过除非你自己显示定义有参构造函数,而且值类型有个特点就是读取之前必须初始化,否则会编译不通过。
能不能做,就要看类构造器的特征了,我们知道类构造器跟实例构造器一样,他是用来初始化静态字段的,线程 ? ? ?访问类构造器的时候内部会进行加锁处理,所以多个线程同时访问的时候,只会有一个线程执行了类构造器,所以 ? ? ?确实可以。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |