<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_徐 磊</title><subtitle type="text">.NET技术</subtitle><id>http://feed.cnblogs.com/blog/u/40287/rss</id><updated>2011-11-07T08:50:42Z</updated><author><name>徐 磊</name><uri>http://www.cnblogs.com/xugao918/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/xugao918/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/40287/rss"/><entry><id>http://www.cnblogs.com/xugao918/archive/2011/10/31/2228616.html</id><title type="text">探索CLR原理系列(3):方法元数据和IL(适合老鸟,新人勿沉迷其中)</title><summary type="text">前一篇我们探索了类型的第一种成员：字段。字段在IL编译时，会生成MdToken和偏移量，因为对于类型来说，一个类型在编译时就已经确定了字段的个数，所以偏移量对于编译器来说是已知的，字段和偏移量分别由元数据表(Field和ClassLayout)来记录。	本篇我们来讨论类型中的另一种成员:方法.在本系列的第一篇探索CLR原理系列(1):类型中我们说到类型中只有两种成员:字段和方法.字段是用来描述类型的状态,而方法则提供了类型所具备的功能.首先我们来看看方法在IL中是如何描述的.先来定义一个类型.publicclassMethodClass{privatestringname=&amp;quot;xule</summary><published>2011-10-31T01:24:00Z</published><updated>2011-10-31T01:24:00Z</updated><author><name>徐 磊</name><uri>http://www.cnblogs.com/xugao918/</uri></author><link rel="alternate" href="http://www.cnblogs.com/xugao918/archive/2011/10/31/2228616.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/xugao918/archive/2011/10/31/2228616.html"/><content type="html">&lt;span  style="font-size: 13px; background-color: #ffffff; "&gt;&lt;p style="box-sizing: border-box; "&gt;&lt;span style="box-sizing: border-box; background-color: #ffffff; font-size: 10pt; "&gt;&lt;span  style="white-space: pre; color: #333333; "&gt;	&lt;/span&gt;&lt;/span&gt;&lt;span style="box-sizing: border-box; background-color: #ffffff; font-size: 10pt; color: #808080; "&gt;前一篇我们探索了类型的第一种成员：字段。字段在IL编译时，会生成MdToken和偏移量，因为对于类型来说，一个类型在编译时就已经确定了字段的个数，所以偏移量对于编译器来说是已知的，字段和偏移量分别由元数据表(Field和ClassLayout)来记录。&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;span  style="background-color: #ffffff; "&gt;&lt;p style="box-sizing: border-box; "&gt;&lt;span  style="color: #4b4b4b; font-family: verdana, Arial, helvetica, sans-seriff; font-size: 13px; line-height: 20px; box-sizing: border-box; white-space: pre; "&gt;	&lt;/span&gt;&lt;font  color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff" size="2"&gt;&lt;span  style="line-height: 20px; font-family: Arial; font-size: 10pt; color: #808080; "&gt;本篇我们来讨论类型中的另一种成员:方法.在本系列的第一篇&lt;a title="探索CLR原理系列(1):类型" href="http://www.cnblogs.com/xugao918/archive/2011/09/19/2179622.html"&gt;&lt;span style="font-family: Arial; font-size: 10pt; color: #808080; "&gt;探索CLR原理系列(1):类型&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span  style="line-height: 20px; font-family: Arial; font-size: 10pt; color: #808080; "&gt;&amp;nbsp;中我们说到&lt;/span&gt;&lt;/font&gt;&lt;span style="font-family: Arial; font-size: 10pt; color: #808080; "&gt;类型中只有两种成员:字段和方法.字段是用来描述类型的状态,而方法则提供了类型所具备的功能.首先我们来看看方法在IL中是如何描述的.先来定义一个类型.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&amp;nbsp;MethodClass&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&amp;nbsp;name=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;xulei&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&amp;nbsp;int&amp;nbsp;age=&lt;span style="color: #800080;"&gt;10&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;static&amp;nbsp;int&amp;nbsp;&lt;span style="color: #0000FF;"&gt;Add&lt;/span&gt;(int&amp;nbsp;a,ref&amp;nbsp;int&amp;nbsp;b)&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;静态&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;a&amp;nbsp;+&amp;nbsp;b;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&amp;nbsp;static&amp;nbsp;int&amp;nbsp;&lt;span style="color: #0000FF;"&gt;Sub&lt;/span&gt;(out&amp;nbsp;int&amp;nbsp;a,out&amp;nbsp;&amp;nbsp;int&amp;nbsp;b)&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;私有静态&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;10&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;5&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;a&amp;nbsp;-&amp;nbsp;b;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;WriteName()&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;公有&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.Write(name);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;protected&lt;/span&gt;&amp;nbsp;int&amp;nbsp;GetAge()&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;受保护&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;age;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;WriteNameAndAge()&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;私有&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.Write(name&amp;nbsp;+&amp;nbsp;age.ToString());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;p&gt;&lt;span  style="background-color: #ffffff; "&gt;&lt;span  style="white-space: pre; color: #808080; "&gt;	&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Arial; font-size: 10pt; color: #808080; "&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;这个类型中我们定义了2个不同访问级别静态方法,3个不同访问级别的实例方法.下面我们来看看这些方法的元数据。&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;TypeDef&amp;nbsp;#&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #800080;"&gt;02000003&lt;/span&gt;)&lt;br /&gt;-------------------------------------------------------&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF00FF;"&gt;TypDefName:&lt;/span&gt;&amp;nbsp;TestDemo1.Type.MethodClass&amp;nbsp;&amp;nbsp;(&lt;span style="color: #800080;"&gt;02000003&lt;/span&gt;) &amp;nbsp;//类型标识&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;Method&lt;/span&gt;&amp;nbsp;#&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #800080;"&gt;06000003&lt;/span&gt;) &amp;nbsp; //方法标识&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-------------------------------------------------------&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MethodName:&amp;nbsp;Add&amp;nbsp;(06000003)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Flags&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;[&lt;span style="color: #0000ff; "&gt;P&lt;/span&gt;&lt;span style="color: #0000ff; "&gt;ublic&lt;span style="color: #000000; "&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #ff0000; "&gt;&amp;nbsp;[&lt;/span&gt;&lt;span style="color: #ff0000; "&gt;Static]&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RVA&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;0x00002064&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ReturnType:&amp;nbsp;I4&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2&amp;nbsp;Arguments &amp;nbsp;//参数列表&lt;br /&gt;&lt;span style="background-color: #33cccc; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: #33cccc; "&gt;Argument&amp;nbsp;#&lt;/span&gt;&lt;span style="color: #800080; background-color: #33cccc; "&gt;1&lt;/span&gt;&lt;span style="background-color: #33cccc; "&gt;:&amp;nbsp;I4 &amp;nbsp; &amp;nbsp;//值传递&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #33cccc; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: #33cccc; "&gt;Argument&amp;nbsp;#&lt;/span&gt;&lt;span style="color: #800080; background-color: #33cccc; "&gt;2&lt;/span&gt;&lt;span style="background-color: #33cccc; "&gt;:&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: #33cccc; "&gt;ByRef&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: #33cccc; "&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: #33cccc; "&gt;I4 &amp;nbsp;&lt;/span&gt;&lt;div style="display: inline-block; "&gt;&lt;/div&gt;&lt;span style="background-color: #33cccc; "&gt;//引用传递&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&amp;nbsp;Parameters&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;span style="color: #800080;"&gt;1&lt;/span&gt;)&amp;nbsp;ParamToken&amp;nbsp;:&amp;nbsp;(&lt;span style="color: #800080;"&gt;08000001&lt;/span&gt;)&amp;nbsp;Name&amp;nbsp;:&amp;nbsp;a&amp;nbsp;&lt;span style="color: #FF00FF;"&gt;flags:&lt;/span&gt;&amp;nbsp;[none]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;span style="color: #800080;"&gt;2&lt;/span&gt;)&amp;nbsp;ParamToken&amp;nbsp;:&amp;nbsp;(&lt;span style="color: #800080;"&gt;08000002&lt;/span&gt;)&amp;nbsp;Name&amp;nbsp;:&amp;nbsp;b&amp;nbsp;&lt;span style="color: #FF00FF;"&gt;flags:&lt;/span&gt;&amp;nbsp;[none]&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;Method&lt;/span&gt;&amp;nbsp;#&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #800080;"&gt;06000004&lt;/span&gt;)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-------------------------------------------------------&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF00FF;"&gt;MethodName:&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;Sub&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #800080;"&gt;06000004&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Flags&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;[&lt;span style="color: #0000FF;"&gt;Private&lt;/span&gt;]&amp;nbsp;&lt;span style="color: #ff0000; "&gt;[Static]&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RVA&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;&lt;span style="color: #800080;"&gt;0x0000207c&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: yellow; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: yellow; "&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff00ff; background-color: yellow; "&gt;ReturnType:&lt;/span&gt;&lt;span style="background-color: yellow; "&gt;&amp;nbsp;I4 &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;div style="display: inline-block; "&gt;&lt;/div&gt;&lt;/span&gt;&lt;span  style="background-color: yellow; "&gt;这部分黄色的就是方法签名&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="color: #800080; background-color: yellow; "&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 2&lt;/span&gt;&lt;span style="background-color: yellow; "&gt;&amp;nbsp;Arguments&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: yellow; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Argument&amp;nbsp;#&lt;/span&gt;&lt;span style="color: #800080; background-color: yellow; "&gt;1&lt;/span&gt;&lt;span style="background-color: yellow; "&gt;:&lt;/span&gt;&lt;span style="background-color: yellow; "&gt;ByRef&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: yellow; "&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: yellow; "&gt;I4 &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: yellow; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Argument&amp;nbsp;#&lt;/span&gt;&lt;span style="color: #800080; background-color: yellow; "&gt;2&lt;/span&gt;&lt;span style="background-color: yellow; "&gt;:&lt;/span&gt;&lt;span style="background-color: yellow; "&gt;ByRef&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: yellow; "&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: yellow; "&gt;I4&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #99cc00; "&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080; background-color: #99cc00; "&gt;2&lt;/span&gt;&lt;span style="background-color: #99cc00; "&gt;&amp;nbsp;Parameters &amp;nbsp; &amp;nbsp; &amp;nbsp; 这部分是参数元数据表的内容&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #99cc00; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #800080; background-color: #99cc00; "&gt;1&lt;/span&gt;&lt;span style="background-color: #99cc00; "&gt;)&amp;nbsp;ParamToken&amp;nbsp;:&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #800080; background-color: #99cc00; "&gt;08000003&lt;/span&gt;&lt;span style="background-color: #99cc00; "&gt;)&amp;nbsp;Name&amp;nbsp;:&amp;nbsp;a&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff00ff; background-color: #99cc00; "&gt;flags:&lt;/span&gt;&lt;span style="background-color: #99cc00; "&gt;&amp;nbsp;[&lt;/span&gt;&lt;span style="background-color: #99cc00; "&gt;out&lt;/span&gt;&lt;span style="background-color: #99cc00; "&gt;]&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #99cc00; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #800080; background-color: #99cc00; "&gt;2&lt;/span&gt;&lt;span style="background-color: #99cc00; "&gt;)&amp;nbsp;ParamToken&amp;nbsp;:&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #800080; background-color: #99cc00; "&gt;08000004&lt;/span&gt;&lt;span style="background-color: #99cc00; "&gt;)&amp;nbsp;Name&amp;nbsp;:&amp;nbsp;b&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff00ff; background-color: #99cc00; "&gt;flags:&lt;/span&gt;&lt;span style="background-color: #99cc00; "&gt;&amp;nbsp;[&lt;/span&gt;&lt;span style="background-color: #99cc00; "&gt;out&lt;/span&gt;&lt;span style="background-color: #99cc00; "&gt;]&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;Method&lt;/span&gt;&amp;nbsp;#&lt;span style="color: #800080;"&gt;3&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #800080;"&gt;06000005&lt;/span&gt;)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-------------------------------------------------------&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF00FF;"&gt;MethodName:&lt;/span&gt;&amp;nbsp;WriteName&amp;nbsp;(&lt;span style="color: #800080;"&gt;06000005&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: #ff0000; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000; "&gt;Flags&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&lt;/span&gt;&lt;span style="color: #ff0000; "&gt;&amp;nbsp;[&lt;/span&gt;&lt;span style="color: #ff0000; "&gt;Public&lt;/span&gt;&lt;span style="color: #ff0000; "&gt;]&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RVA&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;&lt;span style="color: #800080;"&gt;0x00002091&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: yellow; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hasThis &amp;nbsp; &amp;nbsp;方法签名&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000; background-color: #ffff00; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000; background-color: #ffff00; "&gt;ReturnType:&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000; background-color: #ffff00; "&gt;Void&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: yellow; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;No&amp;nbsp;arguments.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;Method&lt;/span&gt;&amp;nbsp;#&lt;span style="color: #800080;"&gt;4&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #800080;"&gt;06000006&lt;/span&gt;)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-------------------------------------------------------&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF00FF;"&gt;MethodName:&lt;/span&gt;&amp;nbsp;GetAge&amp;nbsp;(&lt;span style="color: #800080;"&gt;06000006&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Flags&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;&lt;span style="color: #ff0000; "&gt;[Family]&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RVA&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;&lt;span style="color: #800080;"&gt;0x000020a0&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: yellow; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hasThis &amp;nbsp; &amp;nbsp;方法签名&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: yellow; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff00ff; background-color: yellow; "&gt;ReturnType:&lt;/span&gt;&lt;span style="background-color: yellow; "&gt;&amp;nbsp;I4 &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: yellow; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;No&amp;nbsp;arguments.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;Method&lt;/span&gt;&amp;nbsp;#&lt;span style="color: #800080;"&gt;5&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #800080;"&gt;06000007&lt;/span&gt;)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-------------------------------------------------------&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF00FF;"&gt;MethodName:&lt;/span&gt;&amp;nbsp;WriteNameAndAge&amp;nbsp;(&lt;span style="color: #800080;"&gt;06000007&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: #ff0000; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000; "&gt;Flags&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;[&lt;/span&gt;&lt;span style="color: #ff0000; "&gt;Private&lt;/span&gt;&lt;span style="color: #ff0000; "&gt;]&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RVA&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;&lt;span style="color: #800080;"&gt;0x000020b8&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: yellow; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hasThis &amp;nbsp; 方法签名&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: yellow; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff00ff; background-color: yellow; "&gt;ReturnType:&lt;/span&gt;&lt;span style="background-color: yellow; "&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff; background-color: yellow; "&gt;Void&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: yellow; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;No&amp;nbsp;arguments.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span  style="font-family: 'Courier New'; font-size: 13px; line-height: 19px; background-color: #f5f5f5; "&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;span  style="background-color: #ffffff; "&gt;&lt;p&gt;&lt;span style="font-family: Arial; font-size: 10pt; color: #808080; "&gt;&amp;nbsp;&lt;/span&gt;&lt;span  style="white-space: pre; color: #333333; font-family: Arial; font-size: 10pt; "&gt;	&lt;/span&gt;&lt;span style="font-family: Arial; font-size: 10pt; color: #808080; "&gt;可以看到在方法的原数据中包括了对方法的完整的描述,代码中高亮部分有二部分内容,方法返回值,方法参数.这二部分内容称之为方法签名,大家注意静态方法和实例方法有什么区别?仔细看一下,多了一个HasThis,关于原因我们在后面讨论.我们前一篇说过字段在Dll中有一个字段元数据表来描述所有的字段,那么方法也同样有一个方法的元数据表.来看看它是什么样子的.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/xugao918/%E6%96%B9%E6%B3%95%E5%8E%9F%E6%95%B0%E6%8D%AE%E8%A1%A8.png" width="586" height="164" alt="" /&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;span  style="background-color: #ffffff; "&gt;&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;&lt;span style="color: #808080; font-size: 10pt; font-family: Arial; "&gt;方法的元数据表的Token是以0X06开头的,Token是IL中的标识数据,例如静态方法Add的标识为06000003,flags中标注了可见性,以及抽象,虚,静态,密封等方法的标记.Signature就是方法的签名，由返回值和参数组成。RVA是方法体在Dll文件中的相对地址，也就是方法的代码所在的相对地址。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #808080; font-size: 10pt; font-family: Arial; "&gt;&lt;span  style="white-space: pre; "&gt;	&lt;/span&gt;除此之外，还有方法参数的起始位置.在类型那一篇中,我们讨论过类型中包含了字段起始位置,和方法的起始位置,那么这里的参数起始位置和前面二者的原理是相同的,用来查找方法的参数.来看看方法参数的元数据表吧&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/xugao918/%E6%96%B9%E6%B3%95%E5%8F%82%E6%95%B0.png" width="423" height="91" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;&lt;span style="font-size: 10pt; color: #808080; "&gt;在上面的IL代码中Add方法的参数分别为一个值传递，一个引用传递，那么他们在IL中被标示为Byref，并且Out参数的Flags被标注为out，而Ref则与值传递参数的Flags没有任何区别，都为None，那么CLR在运行时如何判断呢？关键在于IL代码中，我们可以看到一个类似于C++中的去地址操作符&amp;amp;.&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;.method&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;hidebysig&lt;/span&gt;&amp;nbsp;static&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int32&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;Add&lt;/span&gt;(&lt;span style="color: #0000FF;"&gt;int32&lt;/span&gt;&amp;nbsp;a,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff; background-color: yellow; "&gt;int32&lt;/span&gt;&lt;span style="background-color: yellow; "&gt;&amp;amp;&lt;/span&gt;&amp;nbsp;b)&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;span  style="background-color: #ffffff; "&gt;&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;&lt;span style="color: #808080; font-size: 10pt; "&gt;这就是引用传递和值传递的区别了，Out参数也一样，只不过在参数原数据表中的Flags中标记了一个Out。那么参数原数据表中Flags的另一个标记Opt是什么意思呢？？呵呵，大家可以自己试验一下，定义一个可变参数 &lt;/span&gt;&lt;span style="font-size: 10pt; color: #0000ff; "&gt;params int&lt;/span&gt;&lt;span style="color: #808080; font-size: 10pt; "&gt; a 看看。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;span style="color: #808080; font-size: 10pt; "&gt;Sequence是什么意思？他代表参数的位置，也就是第几个参数。所以Sequence的值不能大于方法的参数个数。&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;p&gt;&lt;span  style="background-color: #ffffff; "&gt;&lt;span style="font-size: 10pt; "&gt;&lt;span  style="white-space: pre; "&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;&lt;span style="color: #808080; font-size: 10pt; "&gt;也许大家会问，那么参数的类型呢，怎么不在参数元数据表中？这个秘密就是在方法的签名中。。。懂了吗？&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;span  style="background-color: #ffffff; "&gt;&lt;span style="font-size: 10pt; "&gt;&lt;span  style="white-space: pre; "&gt;	&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: red; "&gt;总结&lt;/span&gt;&lt;/p&gt;&lt;span  style="background-color: #ffffff; "&gt;&lt;p&gt;&lt;span style="color: #808080; font-size: 10pt; "&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: #ff6600; "&gt;我们了解了方法是由元数据和IL代码组成。元数据中包括了方法的签名，方法的参数，以及参数的描述，IL代码中包含了方法的执行逻辑&amp;nbsp;。每个方法在方法元数据表中都有一条记录，该记录包括方法在编译时的标识Token，以及方法的可见性，契约的特征Flags，还有方法的参数和返回值组成的签名，乃至引用了方法的每一个参数的特征，由参数元数据表来记录这些信息。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;hr /&gt;&amp;nbsp;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;下一篇我们来聊聊方法在类型继承中的情况。。。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;img src="http://www.cnblogs.com/xugao918/aggbug/2228616.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/xugao918/archive/2011/10/31/2228616.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/xugao918/archive/2011/10/12/2190228.html</id><title type="text">[原创]探索CLR原理系列--索引贴</title><summary type="text">本系列使用SOS来Debug示例代码,让我们一起看看自己编写的代码,编译后的程序集以及CLR运行时的真实面貌,从而更加深入的了解.net.本系列将围绕下面这张图,来和大家一起分享.net的真实世界.本人能力有限,难免会有理解错误的地方,欢迎大家指正. 由于某些媒体和个人喜欢拿来主义，所以笔者加了水印，见谅见谅。。。不影响大家看就是了，字比较小，可将浏览器放大。探索CLR原理系列(1):类型探索CLR原理系列(2):字段探索CLR原理系列(3):方法元数据和IL 探索CLR原理系列(4):继承关系中的方法探索CLR原理系列(5):方法表探索CLR原理系列(6):接口虚表与方法偏移探索C...</summary><published>2011-10-12T03:16:00Z</published><updated>2011-10-12T03:16:00Z</updated><author><name>徐 磊</name><uri>http://www.cnblogs.com/xugao918/</uri></author><link rel="alternate" href="http://www.cnblogs.com/xugao918/archive/2011/10/12/2190228.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/xugao918/archive/2011/10/12/2190228.html"/><content type="html">&lt;div&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;span&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;span&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&#xD;
&lt;div style="text-align: left;"&gt;&lt;span style="font-size: 12pt; "&gt;　　本系列使用SOS来Debug示例代码,让我们一起看看自己编写的代码,编译后的程序集以及CLR运行时的真实面貌,从而更加深入的了解.net.本系列将围绕下面这张图,来和大家一起分享.net的真实世界.本人能力有限,难免会有理解错误的地方,欢迎大家指正.&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;span&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;span&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&#xD;
&lt;div style="text-align: left;"&gt;　　&lt;img src="http://images.cnblogs.com/cnblogs_com/xugao918/init.png" width="1057" height="480" alt="" /&gt;&lt;/div&gt;&lt;p style="text-align: left;"&gt;&lt;span&gt;		&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;span&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-size: 12pt; "&gt;由于某些媒体和个人喜欢拿来主义，所以笔者加了水印，见谅见谅。。。不影响大家看就是了，字比较小，可将浏览器放大。&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;p style="text-align: left;"&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;/p&gt;&#xD;
&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;span&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;span&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&#xD;
&lt;div style="text-align: left;"&gt;&lt;strong&gt;&lt;a href="http://www.cnblogs.com/xugao918/archive/2011/09/19/2179622.html"&gt;&lt;span style="font-family: Arial; font-size: 12pt; "&gt;探索CLR原理系列(1):类型&amp;nbsp;&lt;/span&gt;&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;strong&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;/span&gt;&#xD;
&lt;/span&gt;&lt;/strong&gt;&lt;div&gt;&lt;/div&gt;&#xD;
&lt;strong&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;/span&gt;&#xD;
&lt;/span&gt;&lt;/strong&gt;&lt;div style="text-align: left;"&gt;&lt;a href="http://www.cnblogs.com/xugao918/archive/2011/10/08/2189514.html"&gt;&lt;strong style="font-family: Arial; font-size: 12pt; "&gt;探索CLR原理系列(2):字段&lt;/strong&gt;&lt;/a&gt;&lt;/div&gt;&lt;p style="text-align: left;"&gt;&lt;font face="Verdana" size="3"&gt;&lt;span&gt;&lt;strong&gt;&lt;a href="http://www.cnblogs.com/xugao918/archive/2011/10/29/2228616.html" title="探索CLR原理系列(3):方法元数据和IL "&gt;&lt;span style="font-family: Arial; font-size: 12pt; "&gt;探索CLR原理系列(3):方法元数据和IL &lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;strong style="font-family: Arial; font-size: 12pt; "&gt;探索CLR原理系列(4):&lt;/strong&gt;&lt;span&gt;&lt;strong&gt;继承关系中的方法&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;strong&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;/span&gt;&#xD;
&lt;/strong&gt;&lt;div&gt;&lt;/div&gt;&#xD;
&lt;strong&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;/span&gt;&#xD;
&lt;/span&gt;&lt;/strong&gt;&lt;div style="text-align: left;"&gt;&lt;strong style="font-family: Arial; font-size: 12pt; "&gt;探索CLR原理系列(5):方法表&lt;/strong&gt;&lt;/div&gt;&lt;p style="text-align: left;"&gt;&lt;strong style="font-family: Arial; font-size: 12pt; "&gt;探索CLR原理系列(6):接口虚表与方法偏移&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;strong&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;/span&gt;&#xD;
&lt;/strong&gt;&lt;div&gt;&lt;/div&gt;&#xD;
&lt;strong&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;/span&gt;&#xD;
&lt;/span&gt;&lt;/strong&gt;&lt;div style="text-align: left;"&gt;&lt;strong style="font-family: Arial; font-size: 12pt; "&gt;探索CLR原理系列(7):特殊的方法-构造和析构&lt;/strong&gt;&lt;span style="font-size: 12pt; font-family: Arial; "&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;strong&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;/span&gt;&#xD;
&lt;/span&gt;&lt;/strong&gt;&lt;div&gt;&lt;/div&gt;&#xD;
&lt;strong&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;/span&gt;&#xD;
&lt;/span&gt;&lt;/strong&gt;&lt;div style="text-align: left;"&gt;&lt;strong style="font-family: Arial; font-size: 12pt; "&gt;探索CLR原理系列(8):实例化&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;strong&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;/span&gt;&#xD;
&lt;/span&gt;&lt;/strong&gt;&lt;div&gt;&lt;/div&gt;&#xD;
&lt;strong&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;/span&gt;&#xD;
&lt;/span&gt;&lt;/strong&gt;&lt;div style="text-align: left;"&gt;&lt;strong style="font-family: Arial; font-size: 12pt; "&gt;探索CLR原理系列(9):栈中有什么&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;strong&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;/span&gt;&#xD;
&lt;/span&gt;&lt;/strong&gt;&lt;div&gt;&lt;/div&gt;&#xD;
&lt;strong&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;/span&gt;&#xD;
&lt;/span&gt;&lt;/strong&gt;&lt;div style="text-align: left;"&gt;&lt;strong style="font-family: Arial; font-size: 12pt; "&gt;探索CLR原理系列(10):装箱和拆箱&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;strong&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;/span&gt;&#xD;
&lt;/span&gt;&lt;/strong&gt;&lt;div&gt;&lt;/div&gt;&#xD;
&lt;strong&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;/span&gt;&#xD;
&lt;/span&gt;&lt;/strong&gt;&lt;div style="text-align: left;"&gt;&lt;strong style="font-family: Arial; font-size: 12pt; "&gt;探索CLR原理系列(11):垃圾回收和析构&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;strong&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;/span&gt;&#xD;
&lt;/span&gt;&lt;/strong&gt;&lt;div&gt;&lt;/div&gt;&#xD;
&lt;strong&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;/span&gt;&#xD;
&lt;/span&gt;&lt;/strong&gt;&lt;div style="text-align: left;"&gt;&lt;strong style="font-family: Arial; font-size: 12pt; "&gt;探索CLR原理系列(12):线程栈和应用程序域&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;strong&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;/span&gt;&#xD;
&lt;/span&gt;&lt;/strong&gt;&lt;div&gt;&lt;/div&gt;&#xD;
&lt;strong&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;/span&gt;&#xD;
&lt;/span&gt;&lt;/strong&gt;&lt;div style="text-align: left;"&gt;&lt;strong style="font-family: Arial; font-size: 12pt; "&gt;探索CLR原理系列(13):反射&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;span&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;span color="#4b4b4b" face="verdana, Arial, helvetica, sans-seriff"&gt;&lt;span&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&#xD;
&lt;div style="text-align: left;"&gt;&lt;span style="font-size: 12pt; "&gt;由于各部分之间的相关性比较复杂,所以目录有可能会改变.&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span&gt;&lt;a id="homepage1_HomePageDays_DaysList_DayItem_0_DayList_0_TitleUrl_0" href="http://www.cnblogs.com/xugao918/archive/2011/10/08/2189514.html"&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/xugao918/aggbug/2190228.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/xugao918/archive/2011/10/12/2190228.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/xugao918/archive/2011/10/08/2189514.html</id><title type="text">[原创]探索CLR原理系列(2):字段在内存中的布局  (适合老鸟,新人勿沉迷其中)</title><summary type="text">上一篇文章我们探索了类型,每一个类型在元数据的Typedef表中,会分配一个MdToken(类型标记),当你写的方法需要访问这个类型时,也是使用MdToken到相关Dll的元数据表去加载它到Load Heap,LoadHeap是用来存放类型的空间,它并不保存类型的实例.我们可以为类型定义一系列成员,包括:字段,属性,方法,事件和嵌套类,但我们跟踪类型的EEclass,发现类型中只有两类成员,字段(事件就是一个委托,而委托只是一个类型,所以事件就是一个字段而已,但表现有些特殊后续介绍)和方法(属性实际就是方法).	这篇文章就让我们一起来探索类型中很重要的一部分:字段.首先来说明一下为什么类型需.</summary><published>2011-10-08T01:24:00Z</published><updated>2011-10-08T01:24:00Z</updated><author><name>徐 磊</name><uri>http://www.cnblogs.com/xugao918/</uri></author><link rel="alternate" href="http://www.cnblogs.com/xugao918/archive/2011/10/08/2189514.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/xugao918/archive/2011/10/08/2189514.html"/><content type="html">&lt;p&gt;&lt;span  style="color: #4b4b4b; font-family: verdana, Arial, helvetica, sans-seriff; font-size: 13px; line-height: 20px; background-color: #ffffff; "&gt;&lt;span style="box-sizing: border-box; color: #000000; background-color: #ffffff; "&gt;&lt;span  style="white-space: pre; "&gt;	&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;上一篇文章我们探索了类型,每一个类型在元数据的Typedef表中,会分配一个MdToken(类型标记),当你写的方法需要访问这个类型时,也是使用MdToken到相关Dll的元数据表去加载它到Load Heap,LoadHeap是用来存放类型的空间,它并不保存类型的实例.我们可以为类型定义一系列成员,包括:字段,属性,方法,事件和嵌套类,但我们跟踪类型的EEclass,发现类型中只有两类成员,字段(事件就是一个委托,而委托只是一个类型,所以事件就是一个字段而已,但表现有些特殊后续介绍)和方法(属性实际就是方法).&lt;span  style="font-family: verdana, Arial, helvetica, sans-seriff; font-size: 13px; line-height: 20px; background-color: #ffffff; color: #000000; "&gt;&lt;span style="box-sizing: border-box; "&gt;&lt;span style="box-sizing: border-box; color: #000000; "&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;这篇文章就让我们一起来探索类型中很重要的一部分:字段.首先来说明一下为什么类型需要字段?&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;在面向对象的语言中,每一个类型或者实例化的对象都代表一个可以解决某种特定问题的实体.那么这些实体就会有描述自身当前状态的需要,如何满足这种需要呢?&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;类型的状态我们使用静态字段来描述,实例的状态我们使用实例字段来表述,还有一部分状态我们需要它是不可变的(常量字段).那么这三类字段在IL中如何表现,CLR有如何加载分配内存呢,下面我们一起来扒一扒字段的隐私.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="white-space: pre; "&gt;	&lt;/span&gt;我们来定义一个类型,这个类型中包括静态字段,实例字段和常量字段.这里我们只讨论字段,所以不考虑封装性.&lt;span  style="font-family: 'Courier New'; font-size: 13px; line-height: 19px; background-color: #f5f5f5; "&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&amp;nbsp;TestObjectType1&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;SX;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #0000ff; "&gt;&amp;nbsp;o&lt;/span&gt;&lt;font  color="#0000ff"&gt;&lt;span style="color: #0000ff; "&gt;bject&amp;nbsp;&lt;/span&gt;&lt;/font&gt;X;&lt;font  color="#0000ff"&gt;&lt;br /&gt;&#xD;
&lt;/font&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0000FF;"&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;public&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;const&amp;nbsp;&lt;/span&gt;&lt;font  color="#0000ff"&gt;double&amp;nbsp;&lt;/font&gt;CX=&lt;span style="color: #800080;"&gt;10&lt;/span&gt;;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;&lt;span style="color: #0000ff; "&gt;public readonly string&amp;nbsp;&lt;/span&gt;RX;&amp;nbsp;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;font  face="'Courier New'" size="2"&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;我们来看看IL中是如何表示的.&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;TypeDef&amp;nbsp;#&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="background-color: yellow; "&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #800080; background-color: yellow; "&gt;02000003&lt;/span&gt;&lt;span style="background-color: yellow; "&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;上篇文章提到的类型标识.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;-------------------------------------------------------&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF00FF;"&gt;TypDefName:&lt;/span&gt;&amp;nbsp;TestDemo1.Type.TestObjectType1&amp;nbsp;&amp;nbsp;(&lt;span style="color: #800080;"&gt;02000003&lt;/span&gt;)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Flags&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;[&lt;span style="color: #0000FF;"&gt;Public&lt;/span&gt;]&amp;nbsp;[AutoLayout]&amp;nbsp;[&lt;span style="color: #0000FF;"&gt;Class&lt;/span&gt;]&amp;nbsp;[AnsiClass]&amp;nbsp;[&lt;span style="color: #0000FF;"&gt;BeforeFieldInit&lt;/span&gt;]&amp;nbsp;&amp;nbsp;(&lt;span style="color: #800080;"&gt;00100001&lt;/span&gt;)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;Extends&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;&lt;span style="color: #800080;"&gt;01000001&lt;/span&gt;&amp;nbsp;[TypeRef]&amp;nbsp;System.Object&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Field&amp;nbsp;#&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="background-color: yellow; "&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #800080; background-color: yellow; "&gt;04000001&lt;/span&gt;&lt;span style="background-color: yellow; "&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;常量字段标识&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-------------------------------------------------------&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Field&amp;nbsp;&lt;span style="color: #FF00FF;"&gt;Name:&lt;/span&gt;&amp;nbsp;CX&amp;nbsp;(&lt;span style="color: #800080;"&gt;04000001&lt;/span&gt;)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Flags&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;[&lt;span style="color: #0000FF;"&gt;Public&lt;/span&gt;]&lt;span style="background-color: yellow; "&gt;&amp;nbsp;[Static]&lt;/span&gt;&amp;nbsp;&lt;span style="background-color: yellow; "&gt;[Literal]//注意这个词&lt;/span&gt; [HasDefault]&amp;nbsp;&amp;nbsp;(&lt;span style="color: #800080;"&gt;00008056&lt;/span&gt;)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;&lt;span style="color: #ff00ff; background-color: #ffff00; "&gt;DefltValue:&lt;/span&gt;&lt;span style="background-color: #ffff00; "&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="background-color: #ffff00; "&gt;R8&lt;/span&gt;&lt;span style="background-color: #ffff00; "&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080; background-color: #ffff00; "&gt;10&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000; background-color: #ffff00; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; background-color: #ffff00; "&gt;注意值被直接写到这里,常量就是静态的&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Field&amp;nbsp;&lt;span style="color: #FF00FF;"&gt;type:&lt;/span&gt;&amp;nbsp;&amp;nbsp;R8&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;字段类型double在IL中的表示&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Field&amp;nbsp;#&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="background-color: yellow; "&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #800080; background-color: yellow; "&gt;04000002&lt;/span&gt;&lt;span style="background-color: yellow; "&gt;)&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;静态字段标识&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-------------------------------------------------------&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Field&amp;nbsp;&lt;span style="color: #FF00FF;"&gt;Name:&lt;/span&gt;&amp;nbsp;SX&amp;nbsp;(&lt;span style="color: #800080;"&gt;04000002&lt;/span&gt;)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Flags&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;[&lt;span style="color: #0000FF;"&gt;Public&lt;/span&gt;]&amp;nbsp;[Static]&amp;nbsp;&amp;nbsp;(&lt;span style="color: #800080;"&gt;00000016&lt;/span&gt;)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Field&amp;nbsp;&lt;span style="color: #FF00FF;"&gt;type:&lt;/span&gt;&amp;nbsp;&amp;nbsp;I4&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;字段类型，int32在IL中的表示&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Field&amp;nbsp;#&lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="background-color: yellow; "&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #800080; background-color: yellow; "&gt;04000003&lt;/span&gt;&lt;span style="background-color: yellow; "&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;实例字段&#xD;
&lt;div style="display: inline-block; "&gt;&lt;/div&gt;&#xD;
&lt;/span&gt;&lt;span  style="color: #008000; "&gt;标识&lt;/span&gt;&lt;span style="color: #008000;"&gt;.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-------------------------------------------------------&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Field&amp;nbsp;&lt;span style="color: #FF00FF;"&gt;Name:&lt;/span&gt;&amp;nbsp;X&amp;nbsp;(&lt;span style="color: #800080;"&gt;04000003&lt;/span&gt;)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Flags&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;[&lt;span style="color: #0000FF;"&gt;Public&lt;/span&gt;]&amp;nbsp;&amp;nbsp;(&lt;span style="color: #800080;"&gt;00000006&lt;/span&gt;)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Field&amp;nbsp;&lt;span style="color: #FF00FF;"&gt;type:&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span  style="color: #000000; "&gt;Object&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt;字段类型&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; Field #4 (04000004)&lt;/div&gt;&lt;div&gt;&lt;span  style="white-space: pre;"&gt;&amp;nbsp;   &lt;/span&gt;-------------------------------------------------------&lt;/div&gt;&lt;div&gt;&lt;span style="white-space:pre"&gt;	&lt;/span&gt;Field Name: RX (04000004)&lt;/div&gt;&lt;div&gt;&lt;span style="white-space:pre"&gt;	&lt;/span&gt;Flags &amp;nbsp; &amp;nbsp; : [Public] &lt;span style="background-color: yellow; "&gt;[InitOnly]&lt;/span&gt; &amp;nbsp;(00000026) //只能在初始化时赋值&lt;/div&gt;&lt;div&gt;&lt;span style="white-space:pre"&gt;	&lt;/span&gt;CallCnvntn: [FIELD]&lt;/div&gt;&lt;div&gt;&lt;span style="white-space:pre"&gt;	&lt;/span&gt;Field type: &amp;nbsp;String&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;根据上面的IL,我们看到字段也有它的0400000X标识,实例字段和静态字段只有一点不同,就是[Static]关键字.而常量也是静态字段,但是与普通静态字段相比还多了[HasDefault],代表它有默认值.[Literal]说明在CLR布局类型内存时,不包含此字段.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="white-space: pre; "&gt;	&lt;/span&gt;那么CLR如何在加载一个类型的时候，侦测到类型中的字段呢？&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="white-space: pre; "&gt;	&lt;/span&gt;上一篇我们提到了TypeDef元数据表，表中有一个字段是FieldList(参见上一篇&lt;a href="http://www.cnblogs.com/xugao918/archive/2011/09/19/2179622.html" target="_blank" title="类型"&gt;探索CLR原理(1)-类型&lt;/a&gt;)，这个字段会指向一个Field元数据表中，该类型所定义的字段的起始位置，也就是说每个类型定义的字段不管是静态还是动态在元数据表中是连续的。该元数据表以字段的标识做为索引。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/xugao918/Field.png" alt="" /&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;我们来看看在CLR中一个类型的静态字段和实例字段在内存中是怎样的。CLR如何访问一个字段？先来编写一段C#代码：&lt;span  style="font-family: 'Courier New'; font-size: 13px; line-height: 19px; background-color: #f5f5f5; "&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;TestObjectType1&amp;nbsp;t&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;TestObjectType1();&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; t.X&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff; "&gt;new object&lt;/span&gt;();&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;给实例字段赋值&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; TestObjectType1.SX&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;20&lt;/span&gt;;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;给静态字段赋值&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;double&lt;/span&gt;&amp;nbsp;b&amp;nbsp;=&amp;nbsp;TestObjectType1.CX;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;给常量赋值&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;看看IL中如何表现这段代码&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;初始化一个object&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF00FF;"&gt;IL_0008:&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;newobj&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;instance&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;[mscorlib&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;23000001&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;]System.Object&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;01000001&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;::.ctor()&amp;nbsp;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;0A000011&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;为实例字段X赋值&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF00FF;"&gt;IL_000d:&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;stfld&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;object&lt;/span&gt;&amp;nbsp;TestDemo1.Type.TestObjectType1&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;02000003&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;::X&amp;nbsp;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000; background-color: yellow; "&gt;04000003&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000; background-color: yellow; "&gt;*/&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;将20推送入栈&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF00FF;"&gt;IL_0012:&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;ldc.i4.s&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;20&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;为静态字段赋值&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF00FF;"&gt;IL_0014:&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;stsfld&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int32&lt;/span&gt;&amp;nbsp;TestDemo1.Type.TestObjectType1&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;02000003&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;::SX&amp;nbsp;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000; background-color: yellow; "&gt;04000002&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000; background-color: yellow; "&gt;*/&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;加载常量&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF00FF;"&gt;IL_0019:&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;ldc.r8&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;10&lt;/span&gt;. &amp;nbsp;&lt;span style="background-color: yellow; "&gt;//注意这里，并没有使用任何标识，而是直接将10放到了IL中&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div&gt;&lt;span style="white-space:pre"&gt;	&lt;/span&gt; 我们在上一篇说到，CLR加载一个类型，是通过类型元数据中的标识在TypeDef的元数据表中查找类型，在加载类型的时候一定需要加载字段，不管是静态还是实例的字段，参见上一篇，开篇时的那幅图。为什么实例字段也需要加载到类型上，实例字段不是属于对象吗？原因是当你的类型被实例化的时候，需要一份已有的实例字段的描述，来布局你的实例的内存。这样讲好象不太容易理解，咱们先用SOS来看看上面代码中实例化的TestObjectType1到底是个什么鸟样？&lt;/div&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;p&gt;&lt;span  style="font-family: 'Courier New'; font-size: 13px; line-height: 19px; background-color: #f5f5f5; "&gt;TestObjectType1&amp;nbsp;t&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;TestObjectType1();&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div&gt;&lt;br /&gt;&#xD;
t.X&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;object&lt;/span&gt;();&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;给实例字段赋值&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;span style="background-color: yellow; "&gt;TestObjectType1.SX&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080; background-color: yellow; "&gt;20&lt;/span&gt;&lt;span style="background-color: yellow; "&gt;;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000; background-color: yellow; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; background-color: yellow; "&gt;给静态字段赋值 &amp;nbsp; 调试当前点&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;br /&gt;&#xD;
double&amp;nbsp;b&amp;nbsp;=&amp;nbsp;TestObjectType1.CX;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;获取常量&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;br /&gt;&#xD;
!dumpobj&amp;nbsp;&lt;span style="color: #800080;"&gt;0x022bb928&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;span style="color: #FF00FF;"&gt;Name:&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TestDemo1.Type.TestObjectType1&lt;br /&gt;&#xD;
&lt;span style="color: #FF00FF;"&gt;MethodTable:&lt;/span&gt;&amp;nbsp;001838e8&lt;br /&gt;&#xD;
&lt;span style="color: #FF00FF;"&gt;EEClass:&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;00181518&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;span style="color: #FF00FF;"&gt;Size:&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;12&lt;/span&gt;(&lt;span style="color: #800080;"&gt;0xc&lt;/span&gt;)&amp;nbsp;bytes&lt;br /&gt;&#xD;
&lt;span style="color: #FF00FF;"&gt;File:&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF00FF;"&gt;D:&lt;/span&gt;\History\Test\ConsoleApplication1\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe&lt;br /&gt;&#xD;
&lt;span style="color: #FF00FF;"&gt;Fields:&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Field&amp;nbsp;&amp;nbsp;&amp;nbsp;Offset&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Type&amp;nbsp;VT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Attr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Value &amp;nbsp;Name&lt;br /&gt;&#xD;
68e1f568&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080; background-color: yellow; "&gt;4000003&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;4&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Object&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&amp;nbsp;&lt;span style="color: red; "&gt;instance&lt;/span&gt;&amp;nbsp;&lt;span style="background-color: yellow; "&gt;022bb934 &amp;nbsp; X &amp;nbsp;//可以看到Object被赋值了&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span  style="font-family: 'Courier New'; font-size: 13px; line-height: 19px; background-color: #f5f5f5; "&gt;68e228f8&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080; background-color: yellow; "&gt;4000002&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;24&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Int32&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span  style="font-family: 'Courier New'; font-size: 13px; line-height: 19px; background-color: #f5f5f5; color: red; "&gt;static&lt;/span&gt;&lt;span  style="font-family: 'Courier New'; font-size: 13px; line-height: 19px; background-color: #f5f5f5; "&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span  style="font-family: 'Courier New'; font-size: 13px; line-height: 19px; background-color: yellow; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080; background-color: yellow; "&gt;0&lt;/span&gt;&amp;nbsp; &amp;nbsp;SX&lt;/span&gt;&amp;nbsp;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;通过上面的调试信息，我们发现二个问题，第一：Offset，第二竟然没有常量的信息！！&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;首先我们先来看Offset(偏移量),我们先不管这个偏移量是相对于哪个内存地址的偏移。实例字段X的偏移量是4，一个引用类型的指针所占的大小是4，那么静态字段的偏移量应该是8，可是这里竟然是24，为什么？&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;为了察看以上信息，笔者不得不更换代码的实现。因为SOS调试信息有些东西看不到。重新定义代码&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;类型定义&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&amp;nbsp;TestObjectType1&lt;br /&gt;&#xD;
{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;font  color="#0000ff"&gt;int&amp;nbsp;&lt;/font&gt;SX=&amp;nbsp;&lt;font  color="#0000ff"&gt;&lt;span style="color: #000000; "&gt;10&lt;/span&gt;&lt;/font&gt;;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;font  color="#0000ff"&gt;int&amp;nbsp;&lt;/font&gt;X=&amp;nbsp;&lt;font  color="#0000ff"&gt;&lt;span style="color: #000000; "&gt;20&lt;/span&gt;&lt;/font&gt;；&amp;nbsp;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&#xD;
&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;主函数&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&amp;nbsp;TestObjectType1&amp;nbsp;t&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;TestObjectType1()；&lt;/p&gt;&#xD;
&lt;p&gt;Test(&lt;span style="color: #0000ff; "&gt;ref &lt;/span&gt;&lt;span style="color: #000000; "&gt;t.X&lt;/span&gt;);&amp;nbsp;&lt;/p&gt;&#xD;
&lt;div style="display: inline-block; "&gt;&lt;/div&gt;&#xD;
Test(&lt;span style="color: #0000ff; "&gt;ref&amp;nbsp;&lt;/span&gt;TestObjectType1.SX); //使用地址传递，以拿到地址&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;Test()方法只是使用地址传递来拿到静态变量的地址,再次启动SOS调试。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;0019ebf4&amp;nbsp;&lt;span style="color: #800080;"&gt;00340109&lt;/span&gt;&amp;nbsp;TestDemo1.Type.TestMain.Main()&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF00FF;"&gt;LOCALS:&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;span style="color: #800080;"&gt;0x0019ebf8&lt;/span&gt;&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080; background-color: #00ccff; "&gt;0x0255b928&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;t实例的地址&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;br /&gt;&#xD;
0019ebb0&amp;nbsp;003401c4&amp;nbsp;TestDemo1.Type.TestMain.Test(&lt;span style="color: #0000FF;"&gt;Int32&lt;/span&gt;&amp;nbsp;ByRef)&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF00FF;"&gt;PARAMETERS:&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;x&amp;nbsp;(&lt;span style="color: #800080;"&gt;0x0019ebb0&lt;/span&gt;)&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080; background-color: #00ccff; "&gt;0x0255b92c&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;t.X的地址&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;!&lt;br /&gt;&#xD;
0019ebb0&amp;nbsp;003401c4&amp;nbsp;TestDemo1.Type.TestMain.Test(&lt;span style="color: #0000FF;"&gt;Int32&lt;/span&gt;&amp;nbsp;ByRef)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF00FF;"&gt;PARAMETERS:&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;x&amp;nbsp;(&lt;span style="color: #800080;"&gt;0x0019ebb0&lt;/span&gt;)&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080; background-color: #ffff00; "&gt;0x001d391c&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;TestObjectType1.SX的地址&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;br /&gt;&#xD;
!dumpobj&amp;nbsp;&lt;span style="color: #800080;"&gt;0x0255b928&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;span style="color: #FF00FF;"&gt;Name:&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TestDemo1.Type.TestObjectType1&lt;br /&gt;&#xD;
&lt;span style="color: #FF00FF;"&gt;MethodTable:&lt;/span&gt;&amp;nbsp;&lt;span style="background-color: #ffff00; "&gt;001d38f8&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;span style="color: #FF00FF;"&gt;EEClass:&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;001d151c&lt;br /&gt;&#xD;
&lt;span style="color: #FF00FF;"&gt;Fields:&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Field&amp;nbsp;&amp;nbsp;&amp;nbsp;Offset&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Type&amp;nbsp;VT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Attr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Value&amp;nbsp;Name&lt;br /&gt;&#xD;
68e228f8&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;4000002&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;4&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Int32&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;instance&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&amp;nbsp;X&lt;br /&gt;&#xD;
68e228f8&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;4000001&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;24&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Int32&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;static&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;10&lt;/span&gt;&amp;nbsp;SX&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span  style="font-size: 12px; line-height: 20px; "&gt;&lt;span style="box-sizing: border-box; font-size: 12px; line-height: 1.5; color: #000000; "&gt;Vtable&amp;nbsp;&lt;/span&gt;&lt;span style="box-sizing: border-box; font-size: 12px; line-height: 1.5; color: #ff00ff; "&gt;Slots:&lt;/span&gt;&lt;span style="box-sizing: border-box; font-size: 12px; line-height: 1.5; color: #000000; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="box-sizing: border-box; font-size: 12px; line-height: 1.5; color: #800080; background-color: #ffffff; "&gt;4&lt;/span&gt;&lt;span style="box-sizing: border-box; font-size: 12px; line-height: 1.5; color: #000000; "&gt;&lt;br style="box-sizing: border-box; " /&gt;&#xD;
Total&amp;nbsp;&lt;/span&gt;&lt;span style="box-sizing: border-box; font-size: 12px; line-height: 1.5; color: #0000ff; "&gt;Method&lt;/span&gt;&lt;span style="box-sizing: border-box; font-size: 12px; line-height: 1.5; color: #000000; "&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="box-sizing: border-box; font-size: 12px; line-height: 1.5; color: #ff00ff; "&gt;Slots:&lt;/span&gt;&lt;span style="box-sizing: border-box; font-size: 12px; line-height: 1.5; color: #000000; "&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="box-sizing: border-box; font-size: 12px; line-height: 1.5; "&gt;&lt;font  color="#800080"&gt;&lt;span style="background-color: #808080; "&gt;6&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;注意图中以相同颜色标注的两对地址，首先看蓝色的。他们的地址相差4，与Offset4相等，说明实例字段的Offset是指和实例的指针的偏移量。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="white-space: pre; "&gt;	&lt;/span&gt;那么黄色的偏移量是多少呢？呵呵，答案一定是24了，如果你再定义一个静态字段(引用类型)那么肯定就是28了，大家可以试试。 为什么偏移量是24呢？&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;注意灰色的部分，原来静态字段是放在方法表后面的。。。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;可能很多人会问，这里的测试代码为什么不用引用类型，因为引用类型用地址获取时，是引用类型实例所在的地址，静态变量只是引用了这个地址。笔者也想通过内存来分析这个引用类型，可是笔者实在不知道那内存中显示的16进制的垃圾数字，到底是啥意思。见谅！！&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;关于值类型的字段，其实和引用类型一样，也是有一个FieldDes来描述所有的字段，当CLR加载类型时，也会将这部分内容加载进去，大致上就是字段类型和偏移地址。元数据是不加载到CLR中的，最多就是一个MdToken的标识，和前一篇说到类型时一样。今天说到的内存结构如下图(前一篇图的部分内容)，图中标黄的部分。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="white-space:pre"&gt;				&lt;/span&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/xugao918/%E5%AD%97%E6%AE%B5%E5%86%85%E5%AD%98.png" width="364" height="477" alt="" /&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;那么偏移地址是怎样生成的呢？答案是IL编译时，在DLL的元数据表中还有一个表叫做ClassLayout，表中定义了相应字段的偏移地址，以上面提到的Field元数据表中，字段的标识做索引。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="white-space: pre; "&gt;	&lt;img src="http://images.cnblogs.com/cnblogs_com/xugao918/Classlayout.png" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;那么CLR如何访问字段，使通过MdToken吗？我们来看看方法执行时的汇编，就一目了然了。&lt;span  style="font-family: 'Courier New'; font-size: 13px; line-height: 19px; background-color: #f5f5f5; "&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;TestObjectType1&amp;nbsp;t&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;TestObjectType1();&lt;br /&gt;&#xD;
t.X&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;20&lt;/span&gt;;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
004D0106&amp;nbsp;8945C4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dword&amp;nbsp;ptr&amp;nbsp;[ebp-3Ch],eax&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;取得当前对象&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;004D0109&amp;nbsp;8B45C4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;eax,dword&amp;nbsp;ptr&amp;nbsp;[ebp-3Ch]&lt;br /&gt;&#xD;
004D010C&amp;nbsp;C7400414000000&amp;nbsp;&amp;nbsp;&amp;nbsp;mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dword&amp;nbsp;ptr&amp;nbsp;[eax+&lt;span style="color: #800080;"&gt;4&lt;/span&gt;],14h&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;将当前对象&amp;nbsp;+4&amp;nbsp;的偏移地址处存储20;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;原来在方法执行时，使用的都是偏移地址(除反射动态查找字段以外).&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong style="color: red; font-size: 14pt; "&gt;字段在继承时会怎样 ？&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;有很多人并不是很清楚继承时字段是怎样的，比如静态字段能不能继承？下面我们专门来讨论一下这个问题。有类如下：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&amp;nbsp;TestObjectType1&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;SX&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;10&lt;/span&gt;;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;PX;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;X;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&amp;nbsp;TestObjectType2&amp;nbsp;:&amp;nbsp;TestObjectType1&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{}&amp;nbsp;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;font  face="'Courier New'" size="2"&gt;&lt;span  style="line-height: 19px;"&gt;&#xD;
&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;div&gt;&lt;font  face="'Courier New'" size="2"&gt;&lt;span  style="white-space:pre"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;&lt;font  face="'Courier New'" size="2"&gt;&#xD;
&lt;/font&gt;&#xD;
&lt;div&gt;&lt;span style="white-space: pre; "&gt;	&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;我们来看看IL是怎样的。TestObjectType1在这里笔者就不列出来了，主要看它的派生类。&lt;/p&gt;&#xD;
&lt;font  face="'Courier New'" size="2"&gt;&#xD;
&lt;p style="line-height: 19px; "&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;TypeDef&amp;nbsp;#&lt;span style="color: #800080;"&gt;3&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #800080;"&gt;02000004&lt;/span&gt;)&lt;br /&gt;&#xD;
-------------------------------------------------------&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TypDefName:&amp;nbsp;TestDemo1.Type.TestObjectType2&amp;nbsp;&amp;nbsp;(&lt;span style="color: #800080;"&gt;02000004&lt;/span&gt;)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Flags&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;[Public]&amp;nbsp;[AutoLayout]&amp;nbsp;[Class]&amp;nbsp;[AnsiClass]&amp;nbsp;[BeforeFieldInit]&amp;nbsp;&amp;nbsp;(&lt;span style="color: #800080;"&gt;00100001&lt;/span&gt;)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Extends&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;&lt;span style="color: #800080;"&gt;02000003&lt;/span&gt;&amp;nbsp;[TypeDef]&amp;nbsp;TestDemo1.Type.TestObjectType1&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;/font&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;我们发现在TestObjectType2中没有任何字段定义，这是为什么？为了搞明白原因，我们再次使用SOS来察看。&lt;/div&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;!dumpobj&amp;nbsp;&lt;span style="color: #800080;"&gt;0x0260b928&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;span style="color: #FF00FF;"&gt;Name:&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TestDemo1.Type.TestObjectType1 //父类型&lt;br /&gt;&#xD;
&lt;span style="color: #FF00FF;"&gt;MethodTable:&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800080;"&gt;00303914 //自己的方法表&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;span style="color: #FF00FF;"&gt;EEClass:&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;00301538&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;span style="color: #FF00FF;"&gt;Fields: //自己的字段表&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Field&amp;nbsp;&amp;nbsp;&amp;nbsp;Offset&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Type&amp;nbsp;VT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Attr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Value&amp;nbsp;Name&lt;br /&gt;&#xD;
6a7128f8&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;4000002&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;4&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Int32&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;instance&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&amp;nbsp;PX&lt;br /&gt;&#xD;
6a7128f8&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;4000003&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;8&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Int32&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;instance&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&amp;nbsp;X&lt;br /&gt;&#xD;
6a7128f8&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;4000001&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;24&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Int32&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;static&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;10&lt;/span&gt;&amp;nbsp;SX&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
!dumpobj&amp;nbsp;&lt;span style="color: #800080;"&gt;0x0260b938&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;span style="color: #FF00FF;"&gt;Name:&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TestDemo1.Type.TestObjectType2&lt;br /&gt;&#xD;
&lt;span style="color: #FF00FF;"&gt;MethodTable:&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800080;"&gt;00303980&amp;nbsp;&#xD;
&lt;div style="display: inline-block; "&gt;&lt;/div&gt;&#xD;
&lt;/span&gt;&lt;span  style="color: #800080; "&gt;//自己的方法表&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;span style="color: #FF00FF;"&gt;EEClass:&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;003015a4&lt;br /&gt;&#xD;
&lt;span style="color: #FF00FF;"&gt;Fields:&amp;nbsp;&#xD;
&lt;div style="display: inline-block; "&gt;&lt;/div&gt;&#xD;
&lt;/span&gt;&lt;span  style="color: #ff00ff; "&gt;//自己的字段表&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Field&amp;nbsp;&amp;nbsp;&amp;nbsp;Offset&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Type&amp;nbsp;VT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Attr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Value&amp;nbsp;Name&lt;br /&gt;&#xD;
6a7128f8&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;4000002&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;4&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Int32&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;instance&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&amp;nbsp;PX &amp;nbsp; //私有字段也被继承。&lt;br /&gt;&#xD;
6a7128f8&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;4000003&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;8&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Int32&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;instance&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&amp;nbsp;X&lt;br /&gt;&#xD;
6a7128f8&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;4000001&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;24&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Int32&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;static&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800080;"&gt;10&lt;/span&gt;&amp;nbsp;SX&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span  style="white-space: pre; "&gt;	&lt;/span&gt;这里为了证明子类和父类不是使用同一个字段，我们做一下测试：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span  style="font-family: verdana, 'courier new'; font-size: 14px; line-height: 21px; "&gt;&lt;span  style="font-family: 'Courier New'; font-size: 13px; line-height: 19px; background-color: #f5f5f5; "&gt;TestObjectType1&amp;nbsp;t1&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff; "&gt;new&lt;/span&gt;&amp;nbsp;TestObjectType1();&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;TestObjectType2&amp;nbsp;t2&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;TestObjectType2();&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
Test(ref&amp;nbsp;TestObjectType1.SX);&lt;br /&gt;&#xD;
Test(ref&amp;nbsp;TestObjectType2.SX);&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;再次使用SOS，看看两个静态变量是否指向相同地址。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;002eeda8&amp;nbsp;&lt;span style="color: #800080;"&gt;00520224&lt;/span&gt;&amp;nbsp;TestDemo1.Type.TestMain.Test(&lt;span style="color: #0000FF;"&gt;Int32&lt;/span&gt;&amp;nbsp;ByRef)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF00FF;"&gt;PARAMETERS:&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;x&amp;nbsp;(&lt;span style="color: #800080;"&gt;0x002eeda8&lt;/span&gt;)&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;0x003033b8&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;002eeda8&amp;nbsp;&lt;span style="color: #800080;"&gt;00520224&lt;/span&gt;&amp;nbsp;TestDemo1.Type.TestMain.Test(&lt;span style="color: #0000FF;"&gt;Int32&lt;/span&gt;&amp;nbsp;ByRef)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #FF00FF;"&gt;PARAMETERS:&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span  style="font-family: verdana, 'courier new'; font-size: 14px; line-height: 21px; "&gt;&lt;span  style="font-family: 'Courier New'; font-size: 13px; line-height: 19px; background-color: #f5f5f5; "&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;x&amp;nbsp;(&lt;span style="color: #800080; "&gt;0x002eeda8&lt;/span&gt;)&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080; "&gt;0x003033b8&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;结果是什么呢？&lt;span style="background-color: yellow; "&gt;原来静态变量的继承时逻辑上的，也就是说物理上来讲父类和子类，共享共有的静态字段。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span  style="white-space: pre; "&gt;	&lt;/span&gt;那么实例变量呢？&amp;nbsp;&lt;span style="background-color: yellow; "&gt;肯定是不共享的，大家可以自己做测试。&lt;/span&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;&lt;span style="color: red; "&gt;&lt;strong&gt;总结：&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="background-color: #ffffff; color: #993300; "&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;本篇我们探索了类型的第一种成员：字段。字段在IL编译时，会生成MdToken和偏移量，因为对于类型来说，一个类型在编译时就已经确定了字段的个数，所以偏移量对于编译器来说是已知的，字段和偏移量分别由元数据表(Field和ClassLayout)来记录。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;&lt;span style="background-color: #ffffff; color: #993300; "&gt;在类型的CLR内存布局中，有一个FieldDesList，它指向类型的字段描述(主要是字段签名和偏移量).当CLR首次加载类型时，会根据元数据表来生成&lt;/span&gt;&amp;nbsp;&lt;span style="background-color: #ffffff; color: #993300; "&gt;FieldDesList，包括实例和&lt;/span&gt;&lt;span style="background-color: #ffffff; color: #993300; "&gt;静态字段，其中静态字段的偏移量是相对于方法表中最后一项方法地址而言，所以静态字段在类型方法列表的后面进行布局，也就是说你的静态字段就存储在这个空间,它是属于类型的,也就是说所有这个类型的实例共享这个静态字段。而实例字段则是和实例在一起，属于每一个实例,它的偏移量是以实例的类型指针为基址而计算的。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span  style="white-space: pre; "&gt;	&lt;/span&gt;&lt;span style="background-color: #ffffff; color: #993300; "&gt;子类从父类派生时,所有字段全部被派生,与可访问性无关,但对于静态字段来说,子类和父类都指向相同地址,即逻辑继承,物理上则共享.&lt;/span&gt;&amp;nbsp;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;下一篇将于大家一起探讨关于类型的另一个成员：方法，内容将会非常多，也是CLR中比较复杂的设计之一.关于实例的部分，笔者将单独分出一篇来和大家一起讨论，届时我们将分析实例的生成(GC堆和栈),以及实例的销毁(垃圾回收和栈资源的释放).&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/xugao918/aggbug/2189514.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/xugao918/archive/2011/10/08/2189514.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/xugao918/archive/2011/09/19/2179622.html</id><title type="text">[原创]探索CLR原理系列(1):类型   (适合老鸟,新人勿沉迷其中)</title><summary type="text">CLR是整个Dotnet的灵魂,CIL则是这个灵魂可以发挥其跨越平台,穿越语言,跳跃....的保证.其实有很多书籍和文章都介绍了什么是CLR,什么是CIL,CTS,CLS这样的一大堆概念,可是他们具体的表现形式,以及运作的原理是大部分人都想知道的秘密,却没有什么太好的途径来获取这些信息.本系列将从C#代码-&amp;gt;CIL-&amp;gt;CLR来探索我们编写的C#代码,最终如何成为本地机器语言,并且执行.过程中会使用...</summary><published>2011-09-19T01:26:00Z</published><updated>2011-09-19T01:26:00Z</updated><author><name>徐 磊</name><uri>http://www.cnblogs.com/xugao918/</uri></author><link rel="alternate" href="http://www.cnblogs.com/xugao918/archive/2011/09/19/2179622.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/xugao918/archive/2011/09/19/2179622.html"/><content type="html">&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; CLR是整个Dotnet的灵魂,CIL则是这个灵魂可以发挥其跨越平台,穿越语言,跳跃....的保证.其实有很多书籍和文章都介绍了什么是CLR,什么是CIL,CTS,CLS这样的一大堆概念,可是他们具体的表现形式,以及运作的原理是大部分人都想知道的秘密,却没有什么太好的途径来获取这些信息.本系列将从C#代码-&amp;gt;CIL-&amp;gt;CLR来探索我们编写的C#代码,最终如何成为本地机器语言,并且执行.过程中会使用VS2010+SOS调试.关于SOS调试的详细内容,大家可以上网搜索,这里不再赘述.&lt;/div&gt;&lt;div&gt;一直想写这个系列的文章,可是内容太多,其中各部分之间的相关性很复杂,让我感觉无从下手.终于决定先硬着头皮写一篇看看,否则可能永远也不知道该从哪里些起.文章中的内容都是笔者大量的阅读书籍以及从网络搜索资料加上自己的试验,调试所理解到的东西,笔者能力有限,如有误导观众之处,欢迎大家指出.我们可以一起讨论,一起来完善这些知识.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;先给大家一个图，笔者吐血画出来的，可以先看看Load堆中类型大致是一个怎么样的状态。图中的其他内容，笔者将陆续介绍给大家,这个图只是其中的一部分,还有线程栈的部分,由于图太大,等说到那部分再发吧.图中的MatedataToken就是我们今天介绍的从IL到CLR，类型的标记的一部分,即TestObjectType1的类型标记码（2000003）。&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img alt="" src="http://images.cnblogs.com/cnblogs_com/xugao918/clr.png" width="1049" height="465" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff0000; " &gt;&lt;span style="white-space: pre" &gt;&lt;/span&gt;&lt;span  style="white-space:pre"&gt;		&lt;/span&gt;由于某些媒体和个人喜欢拿来主义，所以笔者加了水印，见谅见谅。。。不影响大家看就是了，字比较小，可将浏览器放大。&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="white-space: pre" &gt;&lt;/span&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;今天先来说说.net中的类型,我们先不去区分什么值类型在声明它的地方,引用类型类型的实例在GC堆中.实际在CLR中有3个堆(GC堆，Load堆，大对象堆）,我们今天要描述的是&lt;span style="color: #000000; "&gt;Load堆用来存放类型而不是类型的实例&lt;/span&gt;，关于GC堆是后面要做的事情.只说类型,首先看一下笔者定义的类型.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;TestObjectType1&lt;/span&gt; &#xD;
&lt;div&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;struct&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;TestValueType1&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;interface&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;ITestInterface1&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;10&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;delegate&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;TestDelegate1();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span style="white-space: pre" &gt; 	&lt;/span&gt;在这里我只定义了类型,类型中没有任何成员,下面我将编译生成程序集,然后来看看CIL中他们是什么样子.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="white-space: pre" &gt; 	&lt;/span&gt;首先来看看引用类型&lt;span style="line-height: 19px; background-color: #f5f5f5; font-family: 'Courier New'; font-size: 13px" &gt;TestObjectType1&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;span style="line-height: 19px; background-color: #f5f5f5; font-family: 'Courier New'; font-size: 13px" &gt;&lt;span style="color: #008080"&gt;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;TypeDef&amp;nbsp;#&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #800080"&gt;02000002&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="background-color: yellow; color: #000000"&gt;//类型标记&lt;span style="background-color: #ffff00"&gt;码&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &#xD;
&lt;div&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;-------------------------------------------------------&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;TypDefName:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;TestDemo1.Type.TestObjectType1&amp;nbsp;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #800080"&gt;02000003&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&lt;span style="background-color: yellow; color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Flags&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;[&lt;/span&gt;&lt;span style="background-color: yellow; color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="background-color: yellow; color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #000000"&gt;[AutoLayout]//类型字段加载方式&lt;/span&gt;&lt;span style="background-color: yellow; color: #000000"&gt;&amp;nbsp;[&lt;/span&gt;&lt;span style="background-color: yellow; color: #0000ff"&gt;Class&lt;/span&gt;&lt;span style="background-color: yellow; color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;[AnsiClass]&amp;nbsp;[&lt;/span&gt;&lt;span style="color: #0000ff"&gt;BeforeFieldInit&lt;/span&gt;&lt;span style="background-color: #ffffff; color: #000000"&gt;]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Extends&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;01000001&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;[TypeRef]&amp;nbsp;System.Object &lt;/span&gt;&lt;span style="background-color: yellow; color: #000000"&gt;//父类&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;TypeRef&amp;nbsp;#&lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #800080"&gt;01000001&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;-------------------------------------------------------&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;Token:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0x01000001&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;10&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;ResolutionScope:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0x23000001&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;11&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;TypeRefName:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: yellow; color: #000000"&gt;&amp;nbsp;System.Object&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span style="white-space: pre" &gt;&lt;/span&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;可以看到在CIL的元数据部分,可以清晰地看到&lt;span style="line-height: 19px; background-color: #f5f5f5; font-family: 'Courier New'; font-size: 13px" &gt;TestObjectType1继承自Object以及它的类型内存布局,这是CLR用来区分如何分配实例的内存的关键.还有类型标记(反射和JIT编译时会使用类型标记来快速的查找类型).&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="white-space: pre" &gt;&lt;/span&gt;下面来看看Struct和Class有什么不同?&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;TypeDef&amp;nbsp;#&lt;/span&gt;&lt;span style="color: #800080"&gt;2&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #000000"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #800080"&gt;02000004&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #000000"&gt;) 类型标记码&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;-------------------------------------------------------&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;TypDefName:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;TestDemo1.Type.TestValueType1&amp;nbsp;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #800080"&gt;02000004&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Flags&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;[&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt;]&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #000000"&gt;[SequentialLayout] &lt;/span&gt;&lt;span style="background-color: #ffff00; color: #000000"&gt;//类型字段加载方式&lt;/span&gt;&lt;span style="background-color: yellow; color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #000000"&gt;&amp;nbsp;[&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #0000ff"&gt;Class&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #000000"&gt;]&amp;nbsp;[Sealed]&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;[AnsiClass]&amp;nbsp;[&lt;/span&gt;&lt;span style="color: #0000ff"&gt;BeforeFieldInit&lt;/span&gt;&lt;span style="background-color: #ffffff; color: #000000"&gt;]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Extends&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;01000002&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;[TypeRef]&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #000000"&gt;System.ValueType&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #000000"&gt;&amp;nbsp;Layout&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #ff00ff"&gt;Packing:&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #800080"&gt;0&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #000000"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #ff00ff"&gt;Size:&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;TypeRef&amp;nbsp;#&lt;/span&gt;&lt;span style="color: #800080"&gt;2&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #800080"&gt;01000002&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;-------------------------------------------------------&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;10&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;Token:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0x01000002&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;11&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;ResolutionScope:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0x23000001&lt;/span&gt; &lt;/div&gt;&lt;span style="line-height: 19px; background-color: #f5f5f5; font-family: 'Courier New'; font-size: 13px" &gt;&lt;span style="color: #008080"&gt;12&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;TypeRefName:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.ValueType&lt;/span&gt;&lt;/span&gt; &lt;/div&gt;&#xD;
&lt;p&gt;&lt;span style="white-space: pre" &gt; 	&lt;/span&gt;值类型都继承自ValueType,当然ValueType也最终继承自Object,在这里大家可以看到它的Flags中也是Class,而且还是Sealed.还有一个需要注意的是Layout中,它的Size竟然是1,我们并没有定义任何的成员阿?这里的1笔者将会在后面给出答案.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="white-space: pre" &gt;&lt;/span&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;我们再来看看接口有什么不同&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;TypeDef&amp;nbsp;#&lt;/span&gt;&lt;span style="color: #800080"&gt;3&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #000000"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #800080"&gt;02000005&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #000000"&gt;)//类型标记码&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;-------------------------------------------------------&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;TypDefName:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;TestDemo1.Type.ITestInterface1&amp;nbsp;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #800080"&gt;02000005&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;4&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Flags&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;[&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;]&amp;nbsp;[AutoLayout]&lt;span style="background-color: yellow"&gt;&amp;nbsp;[Interface]&amp;nbsp;[Abstract]&lt;/span&gt;&amp;nbsp;[AnsiClass] &amp;nbsp;&lt;/div&gt;&lt;span style="line-height: 19px; background-color: #f5f5f5; font-family: 'Courier New'; font-size: 13px" &gt;&lt;span style="color: #008080"&gt;5&lt;/span&gt;&amp;nbsp;&lt;span style="background-color: yellow; color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: yellow; color: #0000ff"&gt;Extends&lt;/span&gt;&lt;span style="background-color: yellow; color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: yellow; color: #800080"&gt;01000000&lt;/span&gt;&lt;span style="background-color: yellow; color: #000000"&gt;&amp;nbsp;[TypeRef] //父类不存在&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span style="white-space: pre" &gt; 	&lt;/span&gt;可以看到接口不存在任何父类,它只是一个纯抽象的契约而已,很多书上都说任何类型都最终继承自Object是不严谨的.那么为什么接口不继承自Object呢,简单来说由于Object已实现的方法,如果接口继承自它,那么接口也就有了这些虚方法和受保护的方法,虚方法可以重写,那么就破坏了接口做为契约的本质.在实现了接口的所有类型的方法表中,将开辟两个Tostring,两个GetHashcode等的方法槽造成你调用方法时产生二义性,并且还会大量的占用内存(虽然一个方法槽只有4个字节,但是架不住类型多).你或许会说两个方法槽最终可以指向同一个方法地址,Ok.这样说两个相同的方法有同一种实现,即占用了内存,还什么用都没有,为什么要这样做呢?&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="white-space: pre" &gt;&lt;/span&gt;&amp;nbsp;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;OK,讨论完接口我们来看看委托,这里我们只是为了解一下委托的类型,关于委托笔者会单独写一篇文章来探索它.&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;TypeDef&amp;nbsp;#&lt;/span&gt;&lt;span style="color: #800080"&gt;4&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #000000"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #800080"&gt;02000006&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #000000"&gt;)//类型标记码&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;-------------------------------------------------------&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;TypDefName:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;TestDemo1.Type.TestDelegate1&amp;nbsp;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #800080"&gt;02000006&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;4&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Flags&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;[&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="background-color: #ffffff; color: #000000"&gt;]&amp;nbsp;[AutoLayout]&lt;/span&gt;&lt;span style="background-color: yellow; color: #000000"&gt;&amp;nbsp;[&lt;/span&gt;&lt;span style="background-color: yellow; color: #0000ff"&gt;Class&lt;/span&gt;&lt;span style="background-color: yellow; color: #000000"&gt;]&amp;nbsp;[Sealed]&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;[AnsiClass] &amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;5&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Extends&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;01000003&lt;/span&gt;&amp;nbsp;[TypeRef]&amp;nbsp;&lt;span style="background-color: yellow"&gt;System.MulticastDelegate //父类&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span style="line-height: 19px" &gt;&lt;span style="white-space: pre" &gt;&lt;/span&gt;&lt;/span&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;委托在实际就是一个类,继承自(MulticastDelegate,它又继承自Delegate,而最终也是Object的孩子),并且和值类型一样都是Sealed.表示它们不可以被继承,至于为什么不可以被继承,笔者将会在后续的文章中介绍. 我们在这里讨论了Class,Interface,struct,Delegete 发现他们的类型标记都是&lt;span style="background-color: #ffff00"&gt;0200000X&lt;/span&gt;,都是用TypeDef来定义类型,用TypeRef来表述父类,并且有足够的信息来描述你写的C#代码.而且除了Interface,全部都被定义为Class.那么当CLR来加载这些元数据时,靠什么来区分你所定义的Struct和Class呢?CLR如何快速去查找类型呢?&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="white-space: pre" &gt;&lt;/span&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;dll中的数据到底是什么样子的,当CLR加载一个DLL乃至加载一个类型到物理内存的时候如何查找类型?&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="white-space: pre" &gt;&lt;/span&gt;在编译好的dll中,实际上是由很多张表,以及一些特定的string堆,Guid堆,BLOB堆来组成的元数据,我们先来看看TypeDef表.你所定义的类型都被放在TypeDef表中,这个表你可以想象成如同二维的数据库表一样,有Token&lt;span style="line-height: 19px; background-color: #ffff00; font-family: 'Courier New'; font-size: 13px" &gt;类型标记码&lt;/span&gt;作为主键,还可以查找到它的父类(Extends)的类型标记码.以及类型到底是Class,Valuetype,Interface(图中Flags的注释中的C，I，V)前两个是根据他们的父类来识别,而Interface有关键字来表示,参照上面的元数据.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img alt="" src="http://images.cnblogs.com/cnblogs_com/xugao918/TypeDef.png" width="589" height="123" /&gt;&lt;/p&gt;&#xD;
&lt;div style="display: inline-block"&gt;&lt;/div&gt;&lt;span style="line-height: 19px" &gt;&lt;br /&gt;&lt;/span&gt;&#xD;
&lt;p&gt;&lt;span style="white-space: pre" &gt; 	&lt;/span&gt;我们现在来看看CLR如何加载一个类型.&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #008080"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TestObjectType1&amp;nbsp;obj&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;TestObjectType1();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TestValueType1&amp;nbsp;val&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;TestValueType1();&lt;/div&gt;&lt;span style="line-height: 19px; background-color: #f5f5f5; font-family: 'Courier New'; font-size: 13px" &gt;&lt;span style="color: #008080"&gt;4&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;相关IL&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="line-height: 19px; background-color: #f5f5f5; font-family: 'Courier New'; font-size: 13px" &gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;IL_0001:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;newobj&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;instance&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;TestDemo1.Type.TestObjectType1&lt;/span&gt;&lt;span style="background-color: yellow; color: #008000"&gt;/*&lt;/span&gt;&lt;span style="background-color: yellow; color: #008000"&gt;02000003&lt;/span&gt;&lt;span style="background-color: yellow; color: #008000"&gt;*/&lt;/span&gt;&lt;span style="color: #000000"&gt;::.ctor()&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;IL_0010: &amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;initobj&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TestDemo1.Type.TestValueType1&lt;/span&gt;&lt;span style="background-color: yellow; color: #008000"&gt;/*&lt;/span&gt;&lt;span style="background-color: yellow; color: #008000"&gt;02000004&lt;/span&gt;&lt;span style="background-color: yellow; color: #008000"&gt;*/&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span style="white-space: pre" &gt;&lt;/span&gt;&lt;span style="color: red"&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;原来在IL代码中是使用类型标记码来标记语句,然后CLR通过标记加载它的&lt;/span&gt;.我们使用SOS来调试一下,看看在CLR在内存中把类型表现为什么样子.&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: yellow; color: #000000"&gt;TestObjectType1&amp;nbsp;obj&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: yellow; color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="background-color: yellow; color: #000000"&gt;&amp;nbsp;TestObjectType1();&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp; //调试C#代码的当前语句 &amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;TestValueType1&amp;nbsp;val&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;TestValueType1();&amp;nbsp;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000"&gt;0022eb9c&amp;nbsp;0037009e&amp;nbsp;TestDemo1.Type.TestMain.Main()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;LOCALS:&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;线程栈地址&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0x0022eba8&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0x00000000&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;GC堆地址(引用类型)&amp;nbsp;or&amp;nbsp;线程栈地址(值类型)&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="white-space: pre" &gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;可以看到引用类型也被初始化为0,但它是一个地址,地址为0也就是引用不存在,为null&lt;/span&gt;&lt;/p&gt;&lt;span style="line-height: 19px; background-color: #f5f5f5; font-family: 'Courier New'; font-size: 13px" &gt;&lt;span style="color: #000000"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0x0022eba4&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0x00000000 &amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//这里可以看到值类型被默认初始化为0&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;可以看到当new还没有执行时, 0x0022eba8(obj )指向的值是0,由于地址为0的引用就是不存在的,所以等于null.val 的值等于0,也就是说在线程栈上,没有东西可以为null,所有的东西都有值,这也就是为什么值类型不需要构造函数也一样可以初始化.没有人可以阻止值类型的初始化.&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: #ffffff; color: #000000"&gt;TestObjectType1&amp;nbsp;obj&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: #ffffff; color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="background-color: #ffffff; color: #000000"&gt;&amp;nbsp;TestObjectType1();&lt;/span&gt;&lt;span style="background-color: #ffffff; color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #000000"&gt;TestValueType1&amp;nbsp;val&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="background-color: #ffff00"&gt;&amp;nbsp;TestValueType1();&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp; &#xD;
&lt;div style="display: inline-block"&gt;&lt;/div&gt;&lt;/span&gt;//调试C#代码的当前语句&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;LOCALS:&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;&lt;/span&gt;&lt;div style="display: inline-block; "&gt;&lt;/div&gt;&lt;span style="color: #800080; "&gt;0x0022eba8&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0x0240b928 &amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="color: #000000"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;&lt;/span&gt;&lt;div style="display: inline-block; "&gt;&lt;/div&gt;&lt;span style="color: #800080; "&gt;0x0022eba4&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="line-height: 19px; background-color: #f5f5f5; font-family: 'Courier New'; font-size: 13px" &gt;&lt;span style="color: #000000"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0x00000000&lt;/span&gt;&lt;/span&gt; &lt;/div&gt;&#xD;
&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;在new执行后,obj的内存在GC中被分配,可以看出new关键字分配了内存，并将分配好的内存地址返回给栈上的地址空间。现在我们来看看0x0240b928这块内存空间有什么？&lt;span style="line-height: 19px; background-color: #f5f5f5; font-family: 'Courier New'; color: #800080; font-size: 13px" &gt;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000"&gt;!dumpobj&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0x0240b928&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div&gt;&lt;span style="color: #ff00ff"&gt;Name:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TestDemo1.Type.TestObjectType1&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;MethodTable:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;001538f4&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;方法表&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;EEClass:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;00151564&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;类型关系图&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;Fields:&lt;/span&gt;&lt;span style="color: #000000"&gt;none&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;字段&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;可以看到在在这块地址上有方法表的地址，字段列表的地址，以及类型继承关系的地址。让我们一个一个来看，首先EEclass&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #000000"&gt;!dumpclass&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;00151564&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;Name:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TestDemo1.Type.TestObjectType1&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;mdToken:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: #ff0000; color: #000000"&gt;ed13f792&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #000000"&gt;0&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #000000"&gt;2000003 &amp;nbsp;//红色部分是Dll被加载到虚拟内存空间的地址&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;Parent&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;&lt;span style="color: #000000"&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6c1a3ef8&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;父类的地址&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Method&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;Table:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;001538f4&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;方法表的地址,与上面的指向是一样的&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;Vtable&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;Slots:&lt;/span&gt;&lt;span style="color: #800080"&gt;4&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;4个虚方法&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000"&gt;Total&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Method&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;Slots:&lt;/span&gt;&lt;span style="color: #800080"&gt;5&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;方法表中的方法个数&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;Attributes:&lt;/span&gt;&lt;span style="color: #800080"&gt;100001&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;类型的类别&amp;nbsp;(引用类型)&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff"&gt;NumInstanceFields:&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;实例字段的个数&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="line-height: 19px; background-color: #f5f5f5; font-family: 'Courier New'; font-size: 13px" &gt;&lt;span style="color: #ff00ff"&gt;NumStaticFields:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;静态字段的个数&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: #ffffff; color: #000000; "&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;MdToken是记录了类型在元数据表里(IL编译后的类型标记码)的标记。这样我们在使用反射时，就可以很快地定位到元数据的信息,&lt;/span&gt;&lt;span style="color: #000000; "&gt;前面的那一部分(ed13f792)是dll在虚拟内存中的地址.&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;例如&amp;nbsp;&amp;nbsp;System.Type t = typeof(TestObjectType1); &amp;nbsp;将会定位到类型的mdToken，然后找到类型所在Dll中的元数据表Typedef，根据2000003这个主键找到元数据，读取并返回一个Type类型的实例 t，到当前线程栈的内存空间中。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;接下来我们看看父类的内容，ParentClass&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="line-height: 21px; font-family: verdana, 'courier new'; font-size: 14px" &gt;&amp;nbsp;&lt;span style="line-height: 19px; background-color: #f5f5f5; font-family: 'Courier New'; font-size: 13px" &gt;!dumpclass&amp;nbsp;6c1a3ef8&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;Name:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Object &amp;nbsp;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div style="display: inline-block"&gt;&lt;/div&gt;&lt;span style="background-color: #ffff00" &gt;&amp;nbsp;//红色部分是Dll被加载到虚拟内存空间的地址&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;mdToken: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style="background-color: #ff0000"&gt;f5dcf17a&lt;/span&gt;&lt;span style="background-color: #ffff00"&gt;02000002 //注意TypeRef的Token，并不是Type的真实Token，这里是Object在MSCorlib.dll中的真实标记。&lt;/span&gt; &#xD;
&lt;p&gt;&lt;span style="color: #000000"&gt;Parent&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;&lt;span style="color: #000000"&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;00000000&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;没有父类&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0000ff"&gt;Method&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;Table:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6c4bf5e8&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;方法表&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000"&gt;Vtable&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;Slots:&lt;/span&gt;&lt;span style="color: #800080"&gt;4&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;4个虚方法&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000"&gt;Total&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Method&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;Slots:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;a&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;总计10个方法&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;Attributes:&lt;/span&gt;&lt;span style="color: #800080"&gt;102001&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff"&gt;NumInstanceFields:&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;无任何字段&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff"&gt;NumStaticFields:&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;注意TypeRef的Token（01000001），并不是Type的真实Token，这里是Object在MSCorlib.dll中的真实标记。Object是顶级类，所以他没有父类，也没有任何字段，但是它有虚方法。注意看一下，TestObjectType1没有任何成员，他完全继承了Object，但是他们的方法表地址却不同。关于方法表将在后续的文章中介绍。&lt;/div&gt;&lt;div&gt;那么值类型会是什么样呢?我们继续调试&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="background-color: #ffffff; color: #000000"&gt;TestValueType1&amp;nbsp;val&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: #ffffff; color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="background-color: #ffffff"&gt;&amp;nbsp;TestValueType1();&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: #ffff00"&gt;Console.Read();&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff"&gt;LOCALS:&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;当前线程栈地址&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;span style="color: #800080"&gt;0x002cf1c4&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0x00000000&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;由于结构没有定义任何字段所以默认为0&lt;/span&gt; &lt;/div&gt;&#xD;
&lt;p&gt;&lt;span style="white-space: pre" &gt;&lt;/span&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;在这里我们没有定义任何字段,上面的元数据中我们看到了值类型不定义任何字段,它的大小也为1,因为值类型不可能为Null,所以它不可能没有大小,也就是说值类型在栈上只要分配了,就一定要有值.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="white-space: pre" &gt;&lt;/span&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;关于值类型和引用类型在栈上的状态,我们以后会继续分析,这里为了简化仅仅是点到为止.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;这里为了可以看到值类型实例的类型在内存中的状态,笔者只有将它装箱后才能根据它栈中指向GC堆的地址来拿到它类型的地址,具体原因我们在以后介绍.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="white-space: pre" &gt;&lt;/span&gt;&lt;span style="line-height: 16px; background-color: #f5f5f5; font-family: 'Courier New'; font-size: 13px; " &gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;TestValueType1&amp;nbsp;val&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;TestValueType1();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;obj&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;val; //将值类型装箱&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: #ffff00" &gt;&amp;nbsp; Console.Read(); &amp;nbsp;//调试当前点&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;!dumpobj 0x023cb928&lt;/div&gt;&#xD;
&lt;div&gt;Name: &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="background-color: yellow"&gt;&amp;nbsp;TestDemo1.Type.TestValueType1&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div&gt;MethodTable: 00313894&lt;/div&gt;&#xD;
&lt;div&gt;EEClass: &amp;nbsp; &amp;nbsp; 003114e0&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;Fields: &amp;nbsp; &amp;nbsp; &amp;nbsp;None&amp;nbsp;&lt;/p&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;这里可以看到装箱后我们找到了实例(这时候是一个引用了)的地址,并且跟踪到了类型.我们来看看它的EEClass是怎样的?&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #000000"&gt;!dumpclass&amp;nbsp;003114e0&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;Name:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TestDemo1.Type.TestValueType1&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;mdToken:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d6f0251&lt;/span&gt;&lt;span style="background-color: yellow; color: #000000"&gt;02000004 //与元数据中的类型标识码一样&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;Parent&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;&lt;span style="color: #000000"&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6b908a10&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;Module:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;00312e9c&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Method&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;Table:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;00313894&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;Vtable&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;Slots:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;4&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;Total&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Method&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;Slots:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;4&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;Attributes:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;100109&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp; //代表是值类型的布局方式&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;NumInstanceFields:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;NumStaticFields:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;font  size="2" face="'Courier New'"&gt;&lt;span style="line-height: 16px" &gt;&lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="white-space: pre" &gt;&lt;/span&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;与引用类型相比只有类型布局不一样,而且方法表的总数不一样,这是因为值类型编译器不会生成默认构造函数,而我们上面可以用new完全是c#给我们的一种语法糖而已。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="white-space: pre" &gt;&lt;/span&gt;我们来看看它的基类吧。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #000000"&gt;!dumpclass&amp;nbsp;6b908a10&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;Name:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: yellow; color: #000000"&gt;System.ValueType&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;mdToken:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;9590d7902000009&lt;br /&gt;Parent&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;&lt;span style="background-color: yellow; color: #000000"&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: yellow"&gt;6c1a3ef8 //都是Object&lt;/span&gt;&lt;font  color="#ff00ff"&gt;&lt;br /&gt;&lt;/font&gt;&lt;span style="color: #0000ff"&gt;Method&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;Table:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6bbcf730&lt;br /&gt;Vtable&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;Slots:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;4&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;Total&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Method&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;Slots:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;5&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;Attributes:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;102081&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: yellow; color: #000000"&gt;Abstract, &amp;nbsp;不可被实例化&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;NumInstanceFields:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;NumStaticFields:&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;font  size="2" face="'Courier New'"&gt;&lt;span style="line-height: 16px" &gt;&lt;span style="white-space: pre" &gt;&lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;它的父类是ValueType，那么Valuetype的父类呢， 和上面TestObjectType1的ParentClass地址一样。说明了什么呢？ 仔细看这里你会发现，他总共有5个方法，其中4个是虚的，那是从Object继承下来的，但是它的子类TestValueType1却只有4个方法。为什么？因为ValueType有一个受保护的构造函数，而构造函数是不继承的，那么为什么是受保护的？因为当你定义抽象类后，会在编译时默认的生成受保护的构造函数，&lt;span style="color: #000000; "&gt;&lt;/span&gt;自ValueType以后，它的所有子类都表现为了值类型的特性，没有默认构造函数，在声明的地方初始化，即可能在栈中，也可能在GC堆中。&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;span style="color: #ff0000; "&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000; "&gt;总结:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #993300; background-color: #ffffff; "&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;当代码编译为dll时,每一个类型在&lt;/span&gt;&lt;span style="color: #993300; background-color: #ffffff; "&gt;元数据的Typedef表中,会分配一个MdToken(类型标记),&lt;/span&gt;&lt;span style="color: #993300; background-color: #ffffff; "&gt;当你写的方法需要访问这个类型时,也是&lt;/span&gt;&lt;span style="color: #993300; background-color: #ffffff; "&gt;使用MdToken到相关Dll的元数据表去加载它到Load Heap,LoadHeap是用来存放类型的空间,它并不保存类型的实例&lt;/span&gt;&lt;span style="color: #993300; background-color: #ffffff; "&gt;.当clr加载完类型后,就会根据你的代码初始化值类型或者引用类型,&lt;/span&gt;&lt;span style="color: #993300; background-color: #ffffff; "&gt;clr会&lt;/span&gt;&lt;span style="color: #993300; background-color: #ffffff; "&gt;根据元数据表中父类类型object,valuetype来区分是引用类型,值类型&lt;/span&gt;&lt;span style="color: #993300; background-color: #ffffff; "&gt;到相应的地址空间(GC堆或线程栈)&amp;nbsp;,实例化这部分内容,我们在后续的文章中继续讨论.在C#的类型中,我们可以定义字段,属性,方法,事件和嵌套类,但&lt;/span&gt;&lt;span style="color: #993300; background-color: #ffffff; "&gt;我们跟踪类型的EEclass&lt;/span&gt;&lt;span style="color: #993300; background-color: #ffffff; "&gt;,发现类型中只有两类成员,字段(事件就是一个委托,而委托只是一个类型,所以事件就是一个字段而已,但表现有些特殊后续介绍)和方法(属性实际就是方法).&lt;/span&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000; "&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;在后续的文章中&lt;/span&gt;&lt;span style="color: #000000; "&gt;我们将陆续的研究字段,方法,然后再回过头来谈论类型和类型的实例(Gc堆和栈),反射以及垃圾回收器,异常管理等内容.&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="white-space: pre" &gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/xugao918/aggbug/2179622.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/xugao918/archive/2011/09/19/2179622.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/xugao918/archive/2008/08/25/1275601.html</id><title type="text">如何使用设计模式来构造系统(索引贴)</title><summary type="text">一直很想写关于设计模式的具体使用的文章,可是一直没想好怎么去写,才可以通俗易懂,真正的让设计模式,应用到系统设计中.今天终于想到了,这个系列准备用实例去讲解如何使用(GOF)设计模式.</summary><published>2008-08-25T03:13:00Z</published><updated>2008-08-25T03:13:00Z</updated><author><name>徐 磊</name><uri>http://www.cnblogs.com/xugao918/</uri></author><link rel="alternate" href="http://www.cnblogs.com/xugao918/archive/2008/08/25/1275601.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/xugao918/archive/2008/08/25/1275601.html"/></entry><entry><id>http://www.cnblogs.com/xugao918/archive/2008/08/22/1273360.html</id><title type="text">如何使用设计模式来构造系统--(9) </title><summary type="text">前面的客户端程序中,遍历部门时,有个对部门还是人员的判断,然后按照不同的类型输出不同的结果,这样增加了客户端的复杂度,如果出现另一种情况,那么就要修改客户端,因为客户端程序大部分都不是出现在一个调用中,所以这样的修改十分可怕,如果输出有所变化,比如多加几个字,或者显示员工福利工资,那么就不得不修改客户代码所有出现的输出的地方.那么我们如何来封装这个变化呢?</summary><published>2008-08-22T01:39:00Z</published><updated>2008-08-22T01:39:00Z</updated><author><name>徐 磊</name><uri>http://www.cnblogs.com/xugao918/</uri></author><link rel="alternate" href="http://www.cnblogs.com/xugao918/archive/2008/08/22/1273360.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/xugao918/archive/2008/08/22/1273360.html"/></entry><entry><id>http://www.cnblogs.com/xugao918/archive/2008/08/21/1272406.html</id><title type="text">如何使用设计模式来构造系统--(8) </title><summary type="text">前面我们完成了复杂的Composite的创建的封装,但是那里面还有缺点:前面我们说了一个人可能身兼二职,尤其管理层的,更有这个可能,那么他就要出现在不同部门里,而我们现在的创建是一个节点一个对象,这样我们就要浪费内存了...怎么解决?</summary><published>2008-08-21T01:03:00Z</published><updated>2008-08-21T01:03:00Z</updated><author><name>徐 磊</name><uri>http://www.cnblogs.com/xugao918/</uri></author><link rel="alternate" href="http://www.cnblogs.com/xugao918/archive/2008/08/21/1272406.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/xugao918/archive/2008/08/21/1272406.html"/></entry><entry><id>http://www.cnblogs.com/xugao918/archive/2008/08/20/1272228.html</id><title type="text">如何使用设计模式来构造系统--(7) </title><summary type="text">在前面的文章中,我们设计完成了员工工资,福利以及按照部门来区分员工,以及遍历统计部门人员成本等业务逻辑,这些设计基本上可以满足我们所设定的场景的变化,可是创建部门及人员树的时候太复杂了,而且这种创建很容易发生变化,比如加入分公司,或者部门层级变动添加了层级的时候,创建的代码一定就要修改.那么如何避免,封装这个创建时的变化呢?</summary><published>2008-08-20T06:52:00Z</published><updated>2008-08-20T06:52:00Z</updated><author><name>徐 磊</name><uri>http://www.cnblogs.com/xugao918/</uri></author><link rel="alternate" href="http://www.cnblogs.com/xugao918/archive/2008/08/20/1272228.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/xugao918/archive/2008/08/20/1272228.html"/></entry><entry><id>http://www.cnblogs.com/xugao918/archive/2008/08/19/1271030.html</id><title type="text">如何使用设计模式来构造系统--(6) </title><summary type="text">前面我们设计完成了统计部门工资,这样的一个需求,但是在我们设计遍历员工信息的方法是固定不变的,也就是说是硬编码在PersonComposite类中的,由于Composite设计模式相当于一个树或者图的数据结构,那么他的遍历就会出现变化,比如在遍历部门和小组的时候采取不同的方法,以减少遍历的时间,那么如何去解决这个问题呢?</summary><published>2008-08-19T04:10:00Z</published><updated>2008-08-19T04:10:00Z</updated><author><name>徐 磊</name><uri>http://www.cnblogs.com/xugao918/</uri></author><link rel="alternate" href="http://www.cnblogs.com/xugao918/archive/2008/08/19/1271030.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/xugao918/archive/2008/08/19/1271030.html"/></entry><entry><id>http://www.cnblogs.com/xugao918/archive/2008/08/15/1268546.html</id><title type="text">如何使用设计模式来构造系统--(5) </title><summary type="text">前面我们设计了员工的工资，奖金，福利系统。今天客户又来增加需求了:"我们需要统计公司，部门，或者小组的薪资成本。"得到了需求，我们还是按照老套路来完成我们的设计。</summary><published>2008-08-15T06:47:00Z</published><updated>2008-08-15T06:47:00Z</updated><author><name>徐 磊</name><uri>http://www.cnblogs.com/xugao918/</uri></author><link rel="alternate" href="http://www.cnblogs.com/xugao918/archive/2008/08/15/1268546.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/xugao918/archive/2008/08/15/1268546.html"/></entry></feed>
