<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_慕容星空小站</title><subtitle type="text">知我者为我心忧，不知我者谓我何求.</subtitle><id>http://feed.cnblogs.com/blog/u/20126/rss</id><updated>2011-08-13T12:21:07Z</updated><author><name>ustbwuyi</name><uri>http://www.cnblogs.com/ustbwuyi/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ustbwuyi/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/20126/rss"/><entry><id>http://www.cnblogs.com/ustbwuyi/archive/2011/03/30/1999369.html</id><title type="text">谈谈C#中的内存分配</title><summary type="text">稍微有过C#基础的程序员都知道，值类型和引用类型在内存中的分配方式是不一样的。下面我们就来谈谈他们的具体分配过程。</summary><published>2011-03-29T17:57:00Z</published><updated>2011-03-29T17:57:00Z</updated><author><name>ustbwuyi</name><uri>http://www.cnblogs.com/ustbwuyi/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ustbwuyi/archive/2011/03/30/1999369.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ustbwuyi/archive/2011/03/30/1999369.html"/><content type="html">&lt;p&gt;&lt;span style="font-size: 8pt; "&gt;稍微有过C#基础的程序员都知道，值类型和引用类型在内存中的分配方式是不一样的。下面我们就来谈谈他们的具体分配过程。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 8pt; "&gt;1. 对值类型的分配。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 8pt; "&gt;虚拟内存中存在一个叫堆栈的区域，我们并不知道它到底在地址空间的什么地方，在一般开发过程中也没有必要知道，我们知道的是值类型就分配于此。值类型在堆栈上分配的时候，是自上而下填充的，也就是从高内存地址开始填充。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 8pt; "&gt;比如当前的堆栈指针为100000，这表明它的下一个自由存储空间从99999开始，当我们在C#中声明一个int类型的变量A，因为int类型是四个字节，所以它将分配在99996到99999这个存储单元中。如果我们接着声明double变量B(8字节),该变量将分配在99988到99995这个存储单元。 如果代码运行到他们的作用域之外，这时候A和B两个变量都将被删除，此时的顺序正好相反，先删除变量B，同时堆栈指针会递增8，也就是重新指向到99996这个位置；接下来删除变量A，堆栈指针重新指向10000。如果两个变量是同时声明的。如int A,B，此时我们并不知道A和B的分配顺序，但是编译器会确保他们的删除顺序正好和分配顺序相反。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 8pt; "&gt;由此可见，对于单纯的值类型来说，他们的分配方式是很好理解的。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 8pt; "&gt;2. 对引用类型的分配。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 8pt; "&gt;&amp;nbsp;了解堆栈上的分配方式之后，很明显，它的性能相当高，同时我们也发现了它的一个缺点：变量的生存期必须嵌套。这对于某些情况来说是无法接受的，有时候我们需要存储一些数据并且在方法退出后仍然能保证这部分数据是可以使用的。为此，虚拟内存另外分配了一部分区域，我们称之为托管堆。托管堆和传统的堆很大的一个不同点在于，托管堆在垃圾收集器的控制下进行工作。引用类型就分配在托管堆上，下面我们来看看引用类型的分配过程。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 8pt; "&gt;假设我们需要声明一个Person类并对它进行实例化。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span  style="font-family: 'Courier New'; font-size: 13px; "&gt;&lt;span style="color: #000000; font-size: 8pt; "&gt;Person&amp;nbsp;p&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000; font-size: 8pt; "&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff; font-size: 8pt; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; font-size: 8pt; "&gt;&amp;nbsp;Person();&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 8pt; "&gt;首先， 系统会在堆栈上给p这个变量在堆栈上分配存储空间，当然它只是一个引用而已，用来存放Person实例在托管堆上的位置，并没有存放真正的Person实例。因为它仅仅是存放一个地址(一个整数值)，所以它将在堆栈上占据4个字节的空间。接下来Person实例将会被存放在托管堆上。和堆栈不同，托管堆是由下往上分配的，假设这个实例需要占据10个字节，假设托管堆上的地址为200000，那么它将分配在200000到200009这个存储单元。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 8pt; "&gt;需要注意的是，这个分配和实例的大小有关，如果实例小于85000字节，它会被分配在托管堆。如果超过了85000字节，它将被分配在LOH上 。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 8pt; "&gt;由此可见，这个分配过程比值类型的分配方式更为复杂，因此也就不可避免的有性能方面的损耗。这也是为什么对于小数据量的数据结构我们更愿意使用结构而不是类。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 8pt; "&gt;当然这些是比较单纯的分配方式，实际情况可能比这个复杂。比如Struct里定义一个类实例。该类实例会被分配在托管堆，而它的地址分配在堆栈上。如果类中定义了一个值类型int变量，那么该变量的值会被分配在托管堆上而不是堆栈。&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/ustbwuyi/aggbug/1999369.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/ustbwuyi/archive/2011/03/30/1999369.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/ustbwuyi/archive/2011/03/25/1994989.html</id><title type="text">谈谈C#中类成员的执行顺序.</title><summary type="text">今天我们来谈谈C#中子类和父类中静态成员以及构造函数的执行顺序，这个地方向来是初学C#的人比较迷惑的地方，也是各大公司最喜欢拿来出面试题的地方。下面我们分情况来分析。</summary><published>2011-03-24T18:18:00Z</published><updated>2011-03-24T18:18:00Z</updated><author><name>ustbwuyi</name><uri>http://www.cnblogs.com/ustbwuyi/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ustbwuyi/archive/2011/03/25/1994989.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ustbwuyi/archive/2011/03/25/1994989.html"/><content type="html">&lt;p&gt;今天我们来谈谈C#中子类和父类中静态成员以及构造函数的执行顺序，这个地方向来是初学C#的人比较迷惑的地方，也是各大公司最喜欢拿来出面试题的地方。&lt;/p&gt;&#xD;
&lt;p&gt;下面我们分情况来分析。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1. 普通构造函数和静态构造函数的执行顺序。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;对于单个的类，它的静态构造函数将先于普通构造函数执行，因为普通构造函数需要在实例化该类的时候执行，而静态构造函数访问该类的同时就开始执行。&lt;/p&gt;&#xD;
&lt;p&gt;而对于有继承关系的父类和子类来说，父类的普通构造函数先于子类的普通构造函数执行，简而言之就是被依赖的先构造，依赖于人的后构造。&lt;/p&gt;&#xD;
&lt;p&gt;我们来看实例。&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;&#xD;
&lt;div&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;Parent&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Parent()&lt;br /&gt;&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;Console.WriteLine(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Parent&amp;nbsp;Static&amp;nbsp;Constructor&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&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;Parent()&lt;br /&gt;&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;Console.WriteLine(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Parent&amp;nbsp;Constructor&lt;span style="color: #000000" &gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;}&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&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;&#xD;
&lt;div&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;Child&amp;nbsp;:&amp;nbsp;Parent&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Child()&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;Console.WriteLine(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Child&amp;nbsp;Static&amp;nbsp;Constructor&lt;span style="color: #000000" &gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000" &gt;&lt;span style="color: #000000"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&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;Child()&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;Console.WriteLine(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Child&amp;nbsp;Constructor&lt;span style="color: #000000" &gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;那么当我们实例化Child类的时候会如何输出呢？&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font  size="3" face="'Courier New'"&gt;&lt;/font&gt;&lt;/p&gt;&lt;font  size="3" face="'Courier New'"&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: #0000ff"&gt;static&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;Main(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt;[]&amp;nbsp;args)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Child&amp;nbsp;child&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;Child();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.Read();&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/font&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;结果如下&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/ustbwuyi/64203/o_2.jpg" width="557" height="241" alt="" /&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这个结果很好解释，我们实例化子类，所以静态构造函数在访问类的时候同时访问，所以先执行子类的静态构造函数，而Child类依赖于Parent类，所以接下来执行Parent类的普通构造函数。&lt;/p&gt;&#xD;
&lt;p&gt;两个类的静态构造函数执行完毕后分别执行父类的普通构造函数和子类的普通构造函数。&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;2. 静态变量，静态构造函数以及普通构造函数的情况。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;从上面分析的第一种情况我们知道静态构造函数是先于普通构造函数执行的， 而静态变量是先于静态构造函数执行的。&lt;/p&gt;&#xD;
&lt;p&gt;那如果该静态变量定义的是该类的一个实例执行顺序如何呢？&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;&#xD;
&lt;div&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;Child&amp;nbsp;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Child&amp;nbsp;instance&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;Child();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Child()&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;Console.WriteLine(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Child&amp;nbsp;Static&amp;nbsp;Constructor&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&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;Child()&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;Console.WriteLine(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Child&amp;nbsp;Constructor&lt;/span&gt;&lt;span style="color: #800000"&gt;"&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;/div&gt;&#xD;
&lt;p&gt;} &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;实例化该类，显示结果如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/ustbwuyi/64203/o_3.jpg" width="535" height="229" alt="" /&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;对于这个执行结果，首先执行的是静态变量，而该静态变量是对Child类的实例化，此时先调用它的普通构造函数，为什么不会调用它的静态构造函数呢？因为静态构造函数的执行在静态变量之后，&lt;/p&gt;&#xD;
&lt;p&gt;所以第一步，初始化静态变量，打印 "Child Constructor" ;&lt;/p&gt;&#xD;
&lt;p&gt;第二步，执行静态构造函数，打印 "Child Static Constructor" ;&lt;/p&gt;&#xD;
&lt;p&gt;第三步，执行普通构造函数， 打印 "Child Constructor".&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;3. 存在继承关系的静态变量，静态构造函数，普通构造函数的执行顺序.&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;下面我们把第二种情况复杂化一点，加入父类。&amp;nbsp;&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: #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;Parent&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Parent()&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;Console.WriteLine(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Parent&amp;nbsp;Static&amp;nbsp;Constructor&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&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;Parent()&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;Console.WriteLine(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Parent&amp;nbsp;Constructor&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;p&gt;}&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;font  size="3" face="'Courier New'"&gt;&lt;span style="font-size: 13px" &gt;&lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&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;&#xD;
&lt;div&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;Child&amp;nbsp;:Parent&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Child&amp;nbsp;instance&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;Child();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Child()&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Child&amp;nbsp;Static&amp;nbsp;Constructor&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&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;Child()&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;Console.WriteLine(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Child&amp;nbsp;Constructor&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;p&gt;}&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;font  size="3" face="'Courier New'"&gt;&lt;span style="font-size: 13px" &gt;&lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;如果我们实例化Child类，会产生什么结果呢？在我给出答案之前，大家不妨先分析一下这个结果。&lt;/p&gt;&#xD;
&lt;p&gt;1. 先初始化Child类的静态变量instance。&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;显然最开始执行的是Child类中的静态变量instance，instance要实例化一个Child类，那么首先要访问Child类的普通构造函数，而Child类又是依赖于Parent类的，所以在执行Child类的&lt;/p&gt;&#xD;
&lt;p&gt;构造函数之前，先执行的是它父类的静态构造函数和普通构造函数（注意此时Child类的静态构造函数不会执行）。它将打印出"Parent Static Constructor"和"Parent Constructor".&lt;/p&gt;&#xD;
&lt;p&gt;其次执行这个普通构造函数，（此时Child类的静态构造函数仍然不会执行）。打印出"Child Constructor".&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;2. 执行Child类的静态构造函数&lt;/p&gt;&#xD;
&lt;p&gt;这次将打印出"Child Static Constructor"。&lt;/p&gt;&#xD;
&lt;p&gt;3. 执行Child类的普通构造函数&lt;/p&gt;&#xD;
&lt;p&gt;执行Child类的普通构造函数，这里会产生两个结果。首先，会执行它父类的普通构造函数，注意此时父类的静态构造函数不会执行了，它只会执行一次。其次才是执行Child类自己的普通构造函数。&lt;/p&gt;&#xD;
&lt;p&gt;因此此时应该打印出"Parent Constructor"和"Child Constructor".&lt;/p&gt;&#xD;
&lt;p&gt;实际运行的结果也证明刚才分析的正确性。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/ustbwuyi/64203/r_1.jpg" width="569" height="231" /&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;通过上面三个例子的分析，相信大家应该知道了如何去分析这个执行顺序，那就给大家留一个作业自己思考吧。&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;&#xD;
&lt;div&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;Parent&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Parent&amp;nbsp;instance&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;Parent();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Parent()&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;Console.WriteLine(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Parent&amp;nbsp;Static&amp;nbsp;Constructor&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&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;Parent()&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;Console.WriteLine(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Parent&amp;nbsp;Constructor&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;p&gt;}&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;font  size="3" face="'Courier New'"&gt;&lt;span style="font-size: 13px" &gt;子类：&lt;/span&gt;&lt;/font&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: #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;Child&amp;nbsp;:Parent&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Child&amp;nbsp;instance&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;Child();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Child()&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;Console.WriteLine(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Child&amp;nbsp;Static&amp;nbsp;Constructor&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&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;Child()&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;Console.WriteLine(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Child&amp;nbsp;Constructor&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;p&gt;}&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 'Courier New'; font-size: 13px" &gt;}&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/ustbwuyi/aggbug/1994989.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/ustbwuyi/archive/2011/03/25/1994989.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/ustbwuyi/archive/2011/03/22/1990913.html</id><title type="text">谈谈C#中的预处理指令</title><summary type="text">简而言之，C#中的预处理器指令并非虾米高级的玩意儿，它并非可执行代码的一部分，只是对编译过程有所影响而已，它的作用并不如其在C和C++中那么重要，C#中的其它一些特性分担了许多C++中指令的功能，如定制特性。C#中仅保留一些简单常用的预处理器指令。#define和 #undef#define用来定义一个符号， 当然这个符号并不存在真正意义上的所谓的值，仅仅是表示一个符号的存在而已。</summary><published>2011-03-21T18:23:00Z</published><updated>2011-03-21T18:23:00Z</updated><author><name>ustbwuyi</name><uri>http://www.cnblogs.com/ustbwuyi/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ustbwuyi/archive/2011/03/22/1990913.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ustbwuyi/archive/2011/03/22/1990913.html"/><content type="html">&lt;p&gt;简而言之，C#中的预处理器指令并非虾米高级的玩意儿，它并非可执行代码的一部分，只是对编译过程有所影响而已，它的作用并不如其在C和C++中那么重要，C#中的其它一些特性分担了许多C++中指令的功能，如定制特性。&lt;/p&gt;&lt;p&gt;C#中仅保留一些简单常用的预处理器指令。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;#define&lt;/strong&gt;&amp;nbsp;&lt;strong&gt;&amp;nbsp;和 #undef&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;#define&lt;/strong&gt;用来定义一个符号， 当然这个符号并不存在真正意义上的所谓的值，仅仅是表示一个符号的存在而已。相反，&lt;strong&gt;#undef&lt;/strong&gt;用来删除该符号。他们必须定义在源文件的开始部分(using之前)，一般情况下他们与&lt;strong&gt;#if&lt;/strong&gt;结合起来使用&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;例如：&lt;/p&gt;&lt;p&gt;&lt;font  face="'Courier New'" size="3"&gt;&lt;span  style="font-size: 13px; "&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;font  face="'Courier New'" size="3"&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;#define&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;DEBUG&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System.Collections.Generic;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System.Linq;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System.Text;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;ConsoleApplication1&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Program&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&gt;&lt;span style="color: #0000FF;"&gt;static&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;Main(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;[]&amp;nbsp;args)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;#if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;DEBUG&lt;/span&gt;&lt;span style="color: #000000;"&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;Console.WriteLine(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;ustbwuyi&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;#endif&lt;/span&gt;&lt;span style="color: #000000;"&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;Console.Read();&amp;nbsp;&amp;nbsp;&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;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;F5一下，该字符将被打印出来。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;如果我们在&lt;strong&gt;#define DEBUG&lt;/strong&gt;之后加上一行&lt;strong&gt; #undef DEBUG&lt;/strong&gt;，处在&lt;strong&gt;#if #endif&lt;/strong&gt;之间的代码会变成灰色。重新运行该程序，字符将不会被打印。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;#warning 和 #error&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;顾名思义，这两个指令用来产生警告和错误。如果我们定义了DEBUG这个符号。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;font  face="'Courier New'" size="3"&gt;&lt;span  style="font-size: 13px;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;font  face="'Courier New'" size="3"&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;static&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;Main(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;[]&amp;nbsp;args)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;#if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;DEBUG&lt;/span&gt;&lt;span style="color: #000000;"&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;Console.WriteLine(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;ustbwuyi&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;#warning&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;"Don't&amp;nbsp;forget&amp;nbsp;to&amp;nbsp;remove&amp;nbsp;the&amp;nbsp;code&amp;nbsp;before&amp;nbsp;delivery"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;#endif&lt;/span&gt;&lt;span style="color: #000000;"&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;Console.Read();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;编译的时候将产生一条警告信息，如果把&lt;strong&gt;#warning&lt;/strong&gt;换成&lt;strong&gt;#error&lt;/strong&gt;,编译将无法通过，除非你用&lt;strong&gt;#undef&lt;/strong&gt;删除该符号。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;#line&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&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;&lt;span style="color: #0000FF;"&gt;static&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;Main(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;[]&amp;nbsp;args)&lt;br /&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;#if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;DEBUG&lt;/span&gt;&lt;span style="color: #000000;"&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;Console.WriteLine(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;ustbwuyi&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;#line&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;9999&amp;nbsp;"myfile.cs"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;#warning&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;"Don't&amp;nbsp;forget&amp;nbsp;to&amp;nbsp;remove&amp;nbsp;the&amp;nbsp;code&amp;nbsp;before&amp;nbsp;delivery"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;#endif&lt;/span&gt;&lt;span style="color: #000000;"&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;Console.Read();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;span  style="font-family: 'Courier New'; font-size: 13px; "&gt;}&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;设置之后发现警告信息的文件和行号都改变了。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/ustbwuyi/64203/r_warning.jpg" width="640" height="54" alt="" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;当然你也可以用&lt;strong&gt;#line default&lt;/strong&gt;来恢复匹配。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;#pragma&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;该指令用来禁用编译时产生的警告，它可以附加在类或者方法之上。 如：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;font  face="'Courier New'" size="3"&gt;&lt;span  style="font-size: 13px;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;font  face="'Courier New'" size="3"&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;#pragma&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;warning&amp;nbsp;disable&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;static&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;Main(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;[]&amp;nbsp;args)&lt;br /&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;#if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;DEBUG&lt;/span&gt;&lt;span style="color: #000000;"&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;Console.WriteLine(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;ustbwuyi&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;#warning&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;"Don't&amp;nbsp;forget&amp;nbsp;to&amp;nbsp;remove&amp;nbsp;the&amp;nbsp;code&amp;nbsp;before&amp;nbsp;delivery"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;#endif&lt;/span&gt;&lt;span style="color: #000000;"&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;Console.Read();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;这种情况下警告就不会产生了。当然你也可以用&lt;strong&gt;#pragma&amp;nbsp;warning restore&lt;/strong&gt;来恢复该警告。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;至于&lt;strong&gt;#if/#endif &lt;/strong&gt;以及 &lt;strong&gt;#region/#endregion&lt;/strong&gt;就不说了。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/ustbwuyi/aggbug/1990913.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/ustbwuyi/archive/2011/03/22/1990913.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/ustbwuyi/archive/2009/05/14/1456396.html</id><title type="text">JQuery实现的纯JS列表控件</title><summary type="text">老婆睡了，随手写点代码，貌似明天要用到。&amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt; function DeleteCurrentRow(obj) { $(&amp;quot;#gridTable a&amp;quot;).click(function() { if ($(this).attr(&amp;quot;id&amp;quot;) == obj.id) { if (confirm(&amp;quot;are you sure to delete this one?&amp;quot;)) { $(this).paren</summary><published>2009-05-13T16:44:00Z</published><updated>2009-05-13T16:44:00Z</updated><author><name>ustbwuyi</name><uri>http://www.cnblogs.com/ustbwuyi/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ustbwuyi/archive/2009/05/14/1456396.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ustbwuyi/archive/2009/05/14/1456396.html"/></entry><entry><id>http://www.cnblogs.com/ustbwuyi/archive/2007/05/28/762581.html</id><title type="text">关于.NET邮件的收发问题总结(带附件)</title><summary type="text">最近因为项目需要，研究了一下邮件的发送和接收，发现现在这方面的问题很多.虽然网上这方面的资料很多，但是真正应用起来仍然会发现不少问题，而且很多人都抱怨书上或者网上的一些代码应用起来是失败的，并且针对附件方面的处理不太完善，针对这种情况我把最近研究所得做一个小小的总结，希望能对大家有所帮助。 首先来谈谈发送邮件的问题。 发送邮件现在应用得最多的两种情况就是利用.NET自带的发送邮件和利用jmail组...</summary><published>2007-05-28T07:29:00Z</published><updated>2007-05-28T07:29:00Z</updated><author><name>ustbwuyi</name><uri>http://www.cnblogs.com/ustbwuyi/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ustbwuyi/archive/2007/05/28/762581.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ustbwuyi/archive/2007/05/28/762581.html"/></entry><entry><id>http://www.cnblogs.com/ustbwuyi/archive/2007/04/12/711015.html</id><title type="text"> C#2.0新特性之泛型与迭代器</title><summary type="text">泛型1、 什么是泛型？　泛型允许你在编译时间实现类型安全。它们允许你创建一个数据结构而不限于特定的数据类型。即通过参数化类型来实现在同一份代码上操作多种数据类型。泛型编程是一种编程范式，它利用“参数化类型”将类型抽象化，从而实现更为灵活的复用。之所以我们称它为泛型，是因为我们在定义的时候，只为它所包含的对象指派了一个类型占位符，而不是将它定义为确定的类型，只有在创建该集合的实例时，才会给它指派一个...</summary><published>2007-04-12T09:43:00Z</published><updated>2007-04-12T09:43:00Z</updated><author><name>ustbwuyi</name><uri>http://www.cnblogs.com/ustbwuyi/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ustbwuyi/archive/2007/04/12/711015.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ustbwuyi/archive/2007/04/12/711015.html"/></entry><entry><id>http://www.cnblogs.com/ustbwuyi/archive/2007/03/19/679586.html</id><title type="text">ajax完美解决的一个麻烦问题</title><summary type="text">最近老总提了一个小功能，在搜索网吧列表的时候加上网吧所属代理商这个条件，原有的搜索条件是一个地区二级联动，现在需要根据不同的地区显示不同的代理商集合。即在触发地区下拉框的onchange事件时，代理商的下拉框选项也相应的改变，比如选择地区 湖南—〉长沙，那么代理商下拉框只显示长沙的代理商。 本来认为这个很好实现，但实际改起来的时候发现问题多多，主要问题是原有的地区联动是用js实现的，它的数据源是一...</summary><published>2007-03-19T03:26:00Z</published><updated>2007-03-19T03:26:00Z</updated><author><name>ustbwuyi</name><uri>http://www.cnblogs.com/ustbwuyi/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ustbwuyi/archive/2007/03/19/679586.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ustbwuyi/archive/2007/03/19/679586.html"/></entry><entry><id>http://www.cnblogs.com/ustbwuyi/archive/2007/02/08/645061.html</id><title type="text">Ajax的原理和应用(给公司做所的培训)</title><summary type="text">在写这篇文章之前，曾经写过一篇关于AJAX技术的随笔，不过涉及到的方面很窄，对AJAX技术的背景、原理、优缺点等各个方面都很少涉及null。这次写这篇文章的背景是因为公司需要对内部程序员做一个培训。项目经理找到了我，并且征询我培训的主题，考虑到之前Javascript、CSS等WEB开发技术都已经讲解过了，所以决定针对AJAX这一块做一个比较系统的培训，所以这篇文章实际上是一个培训的材料。 在这篇...</summary><published>2007-02-08T08:31:00Z</published><updated>2007-02-08T08:31:00Z</updated><author><name>ustbwuyi</name><uri>http://www.cnblogs.com/ustbwuyi/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ustbwuyi/archive/2007/02/08/645061.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ustbwuyi/archive/2007/02/08/645061.html"/></entry><entry><id>http://www.cnblogs.com/ustbwuyi/archive/2006/10/23/537313.html</id><title type="text">javascript中事件的理解</title><summary type="text">在javascript中，event事件是一个必不可少的讨论话题，它在和用户的交互中起到了很重要的作用。今天我们就来讨论一下JavaScript中的事件处理，并且结合它来阐叙Ajax框架实现拖动效果的原理了。一、 Event对象 1Event对象的主要属性和方法　　event代表事件的状态，专门负责对事件的处理，它的属性和方法能帮助我们完成很多和用户交互的操作，下面我们就来看看它的一些属性和方法。...</summary><published>2006-10-23T07:22:00Z</published><updated>2006-10-23T07:22:00Z</updated><author><name>ustbwuyi</name><uri>http://www.cnblogs.com/ustbwuyi/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ustbwuyi/archive/2006/10/23/537313.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ustbwuyi/archive/2006/10/23/537313.html"/></entry><entry><id>http://www.cnblogs.com/ustbwuyi/archive/2006/09/28/517233.html</id><title type="text">ajax的原理和运行机制</title><summary type="text">关于ajax，是最近炒得非常火的一种技术，并且时下它也是非常流行。当然，它并不是什么新技术，而是在各种已有的技术和支持机制下的一个统一。在我的项目中，偶尔也会用到ajax，用来给用户一些无刷新的体验。用过几次之后，我个人决定对它的原理和运行机制做一个总结。 ajax这个名字据说是Asynchronous JavaScript + XML的简写，实际上，它由下列几种技术组合而成。 1.使用CSS和X...</summary><published>2006-09-28T06:42:00Z</published><updated>2006-09-28T06:42:00Z</updated><author><name>ustbwuyi</name><uri>http://www.cnblogs.com/ustbwuyi/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ustbwuyi/archive/2006/09/28/517233.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ustbwuyi/archive/2006/09/28/517233.html"/></entry></feed>
