<?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/14279/rss</id><updated>2012-02-12T10:47:36Z</updated><author><name>独孤伤</name><uri>http://www.cnblogs.com/zhangchenliang/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhangchenliang/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/14279/rss"/><entry><id>http://www.cnblogs.com/zhangchenliang/archive/2012/02/12/2348167.html</id><title type="text">浅谈C#中标准Dispose模式的实现</title><summary type="text">C#程序中的Dispose方法，一旦被调用了该方法的对象，虽然还没有垃圾回收，但实际上已经不能再使用了。所以使用上要仔细考虑细节。AD：需要明确一下C#程序（或者说.NET）中的资源。简单的说来，C#中的每一个类型都代表一种资源，而资源又分为两类：托管资源：由CLR管理分配和释放的资源，即由CLR里new出来的对象；非托管资源：不受CLR管理的对象，windows内核对象，如文件、数据库连接、套接字、COM对象等；毫无例外地，如果我们的类型使用到了非托管资源，或者需要显式释放的托管资源，那么，就需要让类型继承接口IDisposable。这相当于是告诉调用者，该类型是需要显式释放资源的，你需要调</summary><published>2012-02-12T10:48:00Z</published><updated>2012-02-12T10:48:00Z</updated><author><name>独孤伤</name><uri>http://www.cnblogs.com/zhangchenliang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhangchenliang/archive/2012/02/12/2348167.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhangchenliang/archive/2012/02/12/2348167.html"/><content type="html">&lt;div &gt;&#xD;
&lt;p &gt;C#程序中的Dispose方法，一旦被调用了该方法的对象，虽然还没有垃圾回收，但实际上已经不能再使用了。所以使用上要仔细考虑细节。&lt;/p&gt;&#xD;
&lt;p &gt;AD：&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div id="content"&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;需要明确一下C#程序（或者说.NET）中的资源。简单的说来，C#中的每一个类型都代表一种资源，而资源又分为两类：&lt;/p&gt;&#xD;
&lt;p&gt;托管资源：由CLR管理分配和释放的资源，即由CLR里new出来的对象；&lt;/p&gt;&#xD;
&lt;p&gt;非托管资源：不受CLR管理的对象，windows内核对象，如文件、数据库连接、套接字、COM对象等；&lt;/p&gt;&#xD;
&lt;p&gt;毫无例外地，如果我们的类型使用到了非托管资源，或者需要显式释放的托管资源，那么，就需要让类型继承接口IDisposable。这相当于是告诉调用者，该类型是需要显式释放资源的，你需要调用我的Dispose方法。&lt;/p&gt;&#xD;
&lt;p&gt;不过，这一切并不这么简单，一个标准的继承了IDisposable接口的类型应该像下面这样去实现。这种实现我们称之为Dispose模式：&lt;/p&gt;&#xD;
&lt;ol &gt;&#xD;
&lt;li &gt;&lt;span&gt;&lt;span &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;class&lt;/span&gt;&lt;span&gt;&amp;nbsp;SampleClass&amp;nbsp;:&amp;nbsp;IDisposable&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;//演示创建一个非托管资源&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span &gt;private&lt;/span&gt;&lt;span&gt;&amp;nbsp;IntPtr&amp;nbsp;nativeResource&amp;nbsp;=&amp;nbsp;Marshal.AllocHGlobal(100);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span &gt;//演示创建一个托管资源&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span &gt;private&lt;/span&gt;&lt;span&gt;&amp;nbsp;AnotherResource&amp;nbsp;managedResource&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;AnotherResource();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span &gt;private&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;bool&lt;/span&gt;&lt;span&gt;&amp;nbsp;disposed&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;false&lt;/span&gt;&lt;span&gt;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;///&amp;nbsp;&amp;lt;summary&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span &gt;///&amp;nbsp;实现IDisposable中的Dispose方法&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;///&amp;nbsp;&amp;lt;/summary&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;Dispose()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&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;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;//必须为true&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&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;Dispose(&lt;/span&gt;&lt;span &gt;true&lt;/span&gt;&lt;span&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;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;//通知垃圾回收机制不再调用终结器（析构器）&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;GC.SuppressFinalize(this);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&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;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;///&amp;nbsp;&amp;lt;summary&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;///&amp;nbsp;不是必要的，提供一个Close方法仅仅是为了更符合其他语言（如C++）的规范&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span &gt;///&amp;nbsp;&amp;lt;/summary&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;Close()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&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;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;Dispose();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;///&amp;nbsp;&amp;lt;summary&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;///&amp;nbsp;必须，以备程序员忘记了显式调用Dispose方法&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;///&amp;nbsp;&amp;lt;/summary&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;~SampleClass()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&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;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;//必须为false&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dispose(&lt;/span&gt;&lt;span &gt;false&lt;/span&gt;&lt;span&gt;);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&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;/li&gt;&#xD;
&lt;li&gt;&lt;span &gt;///&amp;nbsp;&amp;lt;summary&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span &gt;///&amp;nbsp;非密封类修饰用protected&amp;nbsp;virtual&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;///&amp;nbsp;密封类修饰用private&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;///&amp;nbsp;&amp;lt;/summary&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;///&amp;nbsp;&amp;lt;param&amp;nbsp;name="disposing"&amp;gt;&amp;lt;/param&amp;gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;protected&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;virtual&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;Dispose(&lt;/span&gt;&lt;span &gt;bool&lt;/span&gt;&lt;span&gt;&amp;nbsp;disposing)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&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;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(disposed)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&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;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;return&lt;/span&gt;&lt;span&gt;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&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;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(disposing)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&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;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &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&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(managedResource&amp;nbsp;!=&amp;nbsp;&lt;/span&gt;&lt;span &gt;null&lt;/span&gt;&lt;span&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;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&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;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;managedResource.Dispose();&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&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;managedResource&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;null&lt;/span&gt;&lt;span&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;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&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;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;//&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&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(nativeResource&amp;nbsp;!=&amp;nbsp;IntPtr.Zero)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&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;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Marshal.FreeHGlobal(nativeResource);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nativeResource&amp;nbsp;=&amp;nbsp;IntPtr.Zero;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&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;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;//让类型知道自己已经被释放&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;disposed&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;true&lt;/span&gt;&lt;span&gt;;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;SamplePublicMethod()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&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;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(disposed)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&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;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;throw&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;ObjectDisposedException(&lt;/span&gt;&lt;span &gt;"SampleClass"&lt;/span&gt;&lt;span&gt;,&amp;nbsp;&lt;/span&gt;&lt;span &gt;"SampleClass&amp;nbsp;is&amp;nbsp;disposed"&lt;/span&gt;&lt;span&gt;);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&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;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;//省略&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;在Dispose模式中，几乎每一行都有特殊的含义。&lt;/p&gt;&#xD;
&lt;p&gt;在标准的Dispose模式中，我们注意到一个以~开头的方法：&lt;/p&gt;&#xD;
&lt;ol &gt;&#xD;
&lt;li &gt;&lt;span&gt;&lt;span &gt;///&amp;nbsp;&amp;lt;summary&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;///&amp;nbsp;必须，以备程序员忘记了显式调用Dispose方法&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;///&amp;nbsp;&amp;lt;/summary&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;~SampleClass()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&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;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span &gt;//必须为false&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;Dispose(&lt;/span&gt;&lt;span &gt;false&lt;/span&gt;&lt;span&gt;);&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;这个方法叫做类型的终结器。提供终结器的全部意义在于：我们不能奢望类型的调用者肯定会主动调用Dispose方法，基于终结器会被垃圾回收器调用这个特点，终结器被用做资源释放的补救措施。&lt;/p&gt;&#xD;
&lt;p&gt;一个类型的Dispose方法应该允许被多次调用而不抛异常。鉴于这个原因，类型内部维护了一个私有的布尔型变量disposed：&lt;/p&gt;&#xD;
&lt;ol &gt;&#xD;
&lt;li &gt;&lt;span&gt;&lt;span &gt;private&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;bool&lt;/span&gt;&lt;span&gt;&amp;nbsp;disposed&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;false&lt;/span&gt;&lt;span&gt;;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;在实际处理代码清理的方法中，加入了如下的判断语句：&lt;/p&gt;&#xD;
&lt;ol &gt;&#xD;
&lt;li &gt;&lt;span&gt;&lt;span &gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(disposed)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&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;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;return&lt;/span&gt;&lt;span&gt;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&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;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;//省略清理部分的代码，并在方法的最后为disposed赋值为true&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&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;disposed&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;true&lt;/span&gt;&lt;span&gt;;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;这意味着类型如果被清理过一次，则清理工作将不再进行。&lt;/p&gt;&#xD;
&lt;p&gt;应该注意到：在标准的Dispose模式中，真正实现IDisposable接口的Dispose方法，并没有实际的清理工作，它实际调用的是下面这个带布尔参数的受保护的虚方法：&lt;/p&gt;&#xD;
&lt;ol &gt;&#xD;
&lt;li &gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;///&amp;nbsp;&amp;lt;summary&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;///&amp;nbsp;非密封类修饰用protected&amp;nbsp;virtual&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span &gt;///&amp;nbsp;密封类修饰用private&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;///&amp;nbsp;&amp;lt;/summary&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span &gt;///&amp;nbsp;&amp;lt;param&amp;nbsp;name="disposing"&amp;gt;&amp;lt;/param&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;protected&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;virtual&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;Dispose(&lt;/span&gt;&lt;span &gt;bool&lt;/span&gt;&lt;span&gt;&amp;nbsp;disposing)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&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;/li&gt;&#xD;
&lt;li &gt;&lt;span &gt;//省略代码&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;之所以提供这样一个受保护的虚方法，是为了考虑到这个类型会被其他类继承的情况。如果类型存在一个子类，子类也许会实现自己的Dispose模式。受保护的虚方法用来提醒子类必须在实现自己的清理方法的时候注意到父类的清理工作，即子类需要在自己的释放方法中调用base.Dispose方法。&amp;nbsp;&lt;br /&gt;还有，我们应该已经注意到了真正撰写资源释放代码的那个虚方法是带有一个布尔参数的。之所以提供这个参数，是因为我们在资源释放时要区别对待托管资源和非托管资源。&lt;/p&gt;&#xD;
&lt;p&gt;在供调用者调用的显式释放资源的无参Dispose方法中，调用参数是true：&lt;/p&gt;&#xD;
&lt;ol &gt;&#xD;
&lt;li &gt;&lt;span&gt;&lt;span &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;Dispose()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&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;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;//必须为true&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dispose(&lt;/span&gt;&lt;span &gt;true&lt;/span&gt;&lt;span&gt;);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;//其他省略&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;这表明，这个时候代码要同时处理托管资源和非托管资源。&lt;/p&gt;&#xD;
&lt;p&gt;在供垃圾回收器调用的隐式清理资源的终结器中，调用参数是false：&lt;/p&gt;&#xD;
&lt;ol &gt;&#xD;
&lt;li &gt;&lt;span&gt;&lt;span&gt;~SampleClass()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;//必须为false&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dispose(&lt;/span&gt;&lt;span &gt;false&lt;/span&gt;&lt;span&gt;);&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;这表明，隐式清理时，只要处理非托管资源就可以了。&lt;/p&gt;&#xD;
&lt;p&gt;那么，为什么要区别对待托管资源和非托管资源。在认真阐述这个问题之前，我们需要首先弄明白：托管资源需要手动清理吗？不妨先将C#中的类型分为两类，一类继承了IDisposable接口，一类则没有继承。前者，我们暂时称之为非普通类型，后者我们称之为普通类型。非普通类型因为包含非托管资源，所以它需要继承IDisposable接口，但是，这个包含非托管资源的类型本身，它是一个托管资源。所以说，托管资源需要手动清理吗？这个问题的答案是：托管资源中的普通类型，不需要手动清理，而非普通类型，是需要手动清理的（即调用Dispose方法）。&lt;/p&gt;&#xD;
&lt;p&gt;Dispose模式设计的思路基于：如果调用者显式调用了Dispose方法，那么类型就该按部就班为自己的所以资源全部释放掉。如果调用者忘记调用Dispose方法，那么类型就假定自己的所有托管资源（哪怕是那些上段中阐述的非普通类型）全部交给垃圾回收器去回收，而不进行手工清理。理解了这一点，我们就理解了为什么Dispose方法中，虚方法传入的参数是true，而终结器中，虚方法传入的参数是true。&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;注意：我们提到了需要及时释放资源，却并没有进一步细说是否需要及时让引用等于null这一点。有一些人认为等于null可以帮助垃圾回收机制早点发现并标识对象是垃圾。其他人则认为这没有任何帮助。下一篇我们再细说这一点。&lt;/p&gt;&#xD;
&lt;p&gt;原文链接：&lt;span&gt;http://www.cnblogs.com/luminji/archive/2011/03/29/1997812.html&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;【编辑推荐】&lt;/p&gt;&#xD;
&lt;ol&gt;&#xD;
&lt;li&gt;&lt;a href="http://developer.51cto.com/art/200909/148732.htm" target="_blank"&gt;&lt;span style="color: #0000ff;"&gt;C#取整函数实例应用详解&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://developer.51cto.com/art/200909/148736.htm" target="_blank"&gt;&lt;span style="color: #0000ff;"&gt;C#单元测试的一个小故事&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://developer.51cto.com/art/200909/148750.htm" target="_blank"&gt;&lt;span style="color: #0000ff;"&gt;C#单元测试使用的必要性的浅析&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://developer.51cto.com/art/200909/148739.htm" target="_blank"&gt;&lt;span style="color: #0000ff;"&gt;C#单元测试概念及作用的浅析&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://developer.51cto.com/art/200909/148760.htm" target="_blank"&gt;C#单元测试的运行浅析&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/zhangchenliang/aggbug/2348167.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhangchenliang/archive/2012/02/12/2348167.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhangchenliang/archive/2012/02/12/2347977.html</id><title type="text">.NET 中的委托</title><summary type="text">1.1.1定义 委托是一种引用方法的类型。一旦为委托分配了方法，委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样，具有参数和返回值，如下面的示例所示： //Code in C# public delegate int PerformCalculation(int x, int y); 与委托的签名（由返回类型和参数组成）匹配的任何方法都可以分配给该委托。 简单理解Delegate委托（或代理）是一种数据类型：它的变量可以引用到某一个符合要求的方法上，通过委托可以间接地调用该方法。 其实.NET的委托类似于C语言的函数指针，区别在于.NET委托是类型安全的，这说...</summary><published>2012-02-12T07:00:00Z</published><updated>2012-02-12T07:00:00Z</updated><author><name>独孤伤</name><uri>http://www.cnblogs.com/zhangchenliang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhangchenliang/archive/2012/02/12/2347977.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhangchenliang/archive/2012/02/12/2347977.html"/><content type="html">&lt;div id="cnblogs_post_body"&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/183411/2011042318385286.jpg" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1.1.1&amp;nbsp;定义&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/900fyy8e(v=vs.80).aspx"&gt;　　委托&lt;/a&gt;是一种引用方法的类型。一旦为委托分配了方法，委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样，具有参数和返回值，如下面的示例所示：&lt;/p&gt;&#xD;
&lt;p&gt;//Code in C#&lt;/p&gt;&#xD;
&lt;p&gt;public delegate int PerformCalculation(int x, int y);&lt;/p&gt;&#xD;
&lt;p&gt;与委托的签名（由返回类型和参数组成）匹配的任何方法都可以分配给该委托。&lt;/p&gt;&#xD;
&lt;p&gt;简单理解Delegate委托（或代理）是一种数据类型：它的变量可以引用到某一个符合要求的方法上，通过委托可以间接地调用该方法。&lt;/p&gt;&#xD;
&lt;p&gt;其实.NET的委托类似于C语言的函数指针，区别在于.NET委托是类型安全的，这说明，C中的函数指针只不过是一个指向存储单元的指针，我们无法说出这个指针实际指向什么。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1.1.2&amp;nbsp;委托使用&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;使用委托的四部曲：&lt;/li&gt;&#xD;
&lt;li&gt;&#xD;
&lt;div &gt;定义一种委托类型&lt;/div&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;&#xD;
&lt;div &gt;委托执行时要调用方法&lt;/div&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;&#xD;
&lt;div &gt;定义一个委托实例&lt;/div&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;&#xD;
&lt;div &gt;委托实例的调用&lt;/div&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;/ul&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&gt;//&lt;/span&gt;&lt;span&gt;自定义一种委托类型&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt;delegate&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; StringProcessor(&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt; input);&lt;br /&gt;&lt;br /&gt;然后我们再定义5中候选的委托方法如下：&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; PrintString(&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt; x) &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; PrintInteger(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; x) &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; PrintTwoStrings(&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt; x, &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt; y) &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; GetStringLength(&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt; x) &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; PrintObject(&lt;/span&gt;&lt;span&gt;object&lt;/span&gt;&lt;span&gt; x)&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;span &gt;&lt;a href="http://www.cnblogs.com/rush/archive/2011/04/23/Delegate_Event.html"&gt;复制代码&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;大家猜猜看哪个和上面提供的委托类型签名匹配（签名匹配：参数类型，参数个数和返回类型匹配）。激动时刻到了马上公布答案，和委托类型匹配的方法是PrintString和PrintObject，如果有不明白的请细细考虑一下委托匹配的条件&amp;mdash;签名匹配。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/183411/2011042318435565.jpg" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p align="center"&gt;图1委托成功输出&lt;/p&gt;&#xD;
&lt;p align="center"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;现在对委托有了一定的认识，接下来我们将介绍委托最经常使用的地方&amp;mdash;事件。&lt;/p&gt;&#xD;
&lt;p&gt;我们将从发送器和接受器的角度讨论事件，例如在UI编程中，鼠标单击或键盘按键，发送器就是.NET的CLR，注意事件发送器并不知道接收器是谁，这符合面向对象的原则，而且某个事件接收器有个方法处理该事件，这个时候就要委托，如前面所讲事件发送器对事件接收器一无所知，通过委托作为一个中介，接收器把事件处理方法注册到事件中，这样就实现了由发送器-&amp;gt;委托-&amp;gt;接收器的过程了。&lt;/p&gt;&#xD;
&lt;p&gt;我们可以这样认为：&lt;span&gt;&lt;strong&gt;委托是一个类，它定义了方法的类型，使得可以将方法当作另一个方法的参数来进行传递，这种将方法动态地赋给参数的做法，可以避免在程序中大量使用&lt;/strong&gt;&lt;strong&gt;If-Else(Switch)&lt;/strong&gt;&lt;strong&gt;语句，同时使得程序具有更好的可扩展性。&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1.1.3&amp;nbsp;自定义委托&lt;/strong&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&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt; the English speaker.&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;param name="name"&amp;gt;&lt;/span&gt;&lt;span&gt;The name.&lt;/span&gt;&lt;span&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; EnglishSpeaker(&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt; name)&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine(&lt;br /&gt;                &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;.Format(&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;Hello my name is {0} and I am English speaker.\n&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;, name));&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt; the Chineses speaker.&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; ChineseSpeaker(&lt;span&gt;string&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine(&lt;br /&gt;                &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;.Format(&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;您好我的名字叫{0},我是讲普通话的。\n&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;, name));&lt;br /&gt;        }&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;span &gt;&lt;a href="http://www.cnblogs.com/rush/archive/2011/04/23/Delegate_Event.html"&gt;复制代码&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;好啦现在我们有两个方法分别是说普通话和英语，现在我们的程序会说普通话和英语啦。现在我们考虑究竟什么时候讲普通话什么时候讲英语，那不简单我们加个判断就OK啦，是的我们可以通过switch或者if else就可以实现啦。&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&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt; 根据上下文调用不同的方法&lt;br /&gt;          &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;param name="name"&amp;gt;&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;param name="lang"&amp;gt;&lt;/span&gt;&lt;span&gt;enum&lt;/span&gt;&lt;span&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; Say(&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt; name, Language lang)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span&gt;switch&lt;/span&gt;&lt;span&gt; (lang)&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span&gt;case&lt;/span&gt;&lt;span&gt; Language.Chinese:&lt;br /&gt;                    Program.ChineseSpeaker(name);&lt;br /&gt;                    &lt;/span&gt;&lt;span&gt;break&lt;/span&gt;&lt;span&gt;;&lt;br /&gt;                &lt;/span&gt;&lt;span&gt;case&lt;/span&gt;&lt;span&gt; Language.English:&lt;br /&gt;                    Program.EnglishSpeaker(name);&lt;br /&gt;                    &lt;/span&gt;&lt;span&gt;break&lt;/span&gt;&lt;span&gt;;&lt;br /&gt;                &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; :&lt;br /&gt;                    &lt;/span&gt;&lt;span&gt;break&lt;/span&gt;&lt;span&gt;;&lt;br /&gt;            }&lt;br /&gt;        }&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;span &gt;&lt;a href="http://www.cnblogs.com/rush/archive/2011/04/23/Delegate_Event.html"&gt;复制代码&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;但假设我们现在又要增加新的语言西班牙语，同样我们可以增加西班牙语，但我们必须修改switch语句增加判断，这不符合OOP中的OCP(对扩展开放，对修改关闭原则),这时候委托该登场。&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&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt; Define speak delegate.&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;param name="name"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt;delegate&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; SpeakDelegate(&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt; name);&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;span &gt;&lt;a href="http://www.cnblogs.com/rush/archive/2011/04/23/Delegate_Event.html"&gt;复制代码&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;首先我们定义了一种委托类型SpeakDelegate，然后我们通过修改Say方法看看该如何使用委托变量。&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&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt; The base say function.&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;param name="name"&amp;gt;&lt;/span&gt;&lt;span&gt;The name.&lt;/span&gt;&lt;span&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;param name="speaker"&amp;gt;&lt;/span&gt;&lt;span&gt;The speaker.&lt;/span&gt;&lt;span&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; Say(&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt; name, SpeakDelegate speaker)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt;Inoke the speaker function.&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;            speaker(name);&lt;br /&gt;        }&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;span &gt;&lt;a href="http://www.cnblogs.com/rush/archive/2011/04/23/Delegate_Event.html"&gt;复制代码&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;现在我们的参数已经不是枚举类型了，而是一个委托类型变量，而且实现的具体代码也没有了switch语句了，比之前简单了许多。现在大家知道如何去调用Say方法吧！没错我们只需传递一个name和一个具体实现函数名就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&gt;///&lt;/span&gt;&lt;span&gt;传递函数名进行委托方法绑定&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;                       Program.Say(&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;钧航&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;, ChineseSpeaker);&lt;br /&gt;           Program.Say(&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;JK.Rush&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;, EnglishSpeaker);&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;span &gt;&lt;a href="http://www.cnblogs.com/rush/archive/2011/04/23/Delegate_Event.html"&gt;复制代码&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;自定义委托相信大家都会了，接下来我将介绍一下.NET中委托实现，由于许多使用委托的例子都是事件，所以下面的例子也采用事件。但请大家要注意&amp;ldquo;可以使用委托，但却没有定义事件&amp;rdquo;的情况(例如：回调函数)。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1.1.4&amp;nbsp;.NET中的事件委托&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;举一个简单的例子，.NET中经常使用的控件Button，当我们把Button 控件 drap and drop到界面，然后双击界面的Button我们发现程序中自动生成了一个响应Button的事件方法，然后我们给事件方法添加Code之后，当我们点击该Button就响应该方法了，但我们没有看到代码中有任何的委托和事件之类的定义，其实这些.NET都已经做好了。我们可以查看如下文件。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/183411/2011042318510376.jpg" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/183411/2011042318512233.jpg" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;图2事件委托实现&lt;/p&gt;&#xD;
&lt;p&gt;如上图所示我们打开Designer文件，事件委托的实现都在这里实现了。&lt;/p&gt;&#xD;
&lt;p&gt;其中，EventHandler就是一个代理类型，可以认为它是一个&amp;ldquo;类&amp;rdquo;，是所有返回类型为void，具备两个参数分别是&lt;a title="System.Object" href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Object"&gt;object&lt;/a&gt;&amp;nbsp;sender和&lt;a title="System.EventArgs" href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.EventArgs"&gt;EventArgs&lt;/a&gt;&amp;nbsp;e，第一个参数表示引发事件的控件，或者说它表示点击的那个按钮。通过以下的代码我们细细解析一下。&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&gt;private&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; button1_Click(&lt;/span&gt;&lt;span&gt;object&lt;/span&gt;&lt;span&gt; sender, EventArgs e)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span&gt;//&lt;/span&gt;&lt;span&gt;获取被点击Button的实例&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;            Button objBotton &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; sender &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; Button;&lt;br /&gt;            &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (objBotton &lt;/span&gt;&lt;span&gt;!=&lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;)&lt;br /&gt;            {&lt;br /&gt;                objBotton.Text &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;Hello you click me.&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;;&lt;br /&gt;                objBotton.AutoSize &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;;&lt;br /&gt;            }&lt;br /&gt;            &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt;&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span&gt;//&lt;/span&gt;&lt;span&gt;Exception Handle.&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;            }&lt;br /&gt;        }&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;span &gt;&lt;a href="http://www.cnblogs.com/rush/archive/2011/04/23/Delegate_Event.html"&gt;复制代码&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/183411/2011042318421541.jpg" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/183411/2011042318530265.jpg" alt="" /&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;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;图3点击产生效果&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;OK现在明白了sender就是传递一个被点击对象的实例，第二个参数名叫e的EventArgs参数，用于&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 表示附加的事件关联的事件信息。当点击按钮时，没有附加任何关联的事件信息，如上的点击事件，第二参数并不表示任何有用的信息。但什么时候会用到呢？&lt;/p&gt;&#xD;
&lt;p&gt;我们先介绍一下EventArgs这个的类型。其实这个类并没有太多的功能，它主要是作为一个基类让其他类去实现具体的功能和定义，当我们搜索EventArgs发现很多类是继承于它的。&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&gt;public&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; EventArgs&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;//&lt;/span&gt;&lt;span&gt; Fields&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt;readonly&lt;/span&gt;&lt;span&gt; EventArgs Empty;&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;//&lt;/span&gt;&lt;span&gt; Methods&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt; EventArgs();&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; EventArgs();&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;span &gt;&lt;a href="http://www.cnblogs.com/rush/archive/2011/04/23/Delegate_Event.html"&gt;复制代码&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;举其中的ImageClickEventArgs为例，它继承于EventArgs，而且还添加了自己的字段用来基类X和Y的坐标值（这是一个ImageButton被点击时候响应的），然后获取该按钮的X和Y坐标。&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&gt;public&lt;/span&gt;&lt;span&gt;sealed&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; ImageClickEventArgs : EventArgs&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;//&lt;/span&gt;&lt;span&gt; Fields&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; X;&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; Y;&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;//&lt;/span&gt;&lt;span&gt; Methods&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; ImageClickEventArgs(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; x, &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; y)&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.X &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; x;&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.Y &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; y;&lt;br /&gt;    }&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;span &gt;&lt;a href="http://www.cnblogs.com/rush/archive/2011/04/23/Delegate_Event.html"&gt;复制代码&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&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;&lt;span&gt;//&lt;/span&gt;&lt;span&gt;ImageButton点击响应时间&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;protected&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; ibtnTest_Click(&lt;/span&gt;&lt;span&gt;object&lt;/span&gt;&lt;span&gt; sender, ImageClickEventArgs e)&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.lblCX.Text &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; e.X.ToString();&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.lblCY.Text &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; e.Y.ToString();&lt;br /&gt;    }&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;span &gt;&lt;a href="http://www.cnblogs.com/rush/archive/2011/04/23/Delegate_Event.html"&gt;复制代码&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/183411/2011042318554048.jpg" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p align="center"&gt;&lt;/p&gt;&#xD;
&lt;p align="center"&gt;图4获取ImageClickEventArgs关联点击坐标&lt;/p&gt;&#xD;
&lt;p align="center"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;前面提到其他事件关联信息类型都是通过继承EventArgs实现的，所以说我们自己也可以自定义一个事件关联信息类型，如下我们只需继承EventArgs就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&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt; 自定义事件关联类&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; ColorChangedEventArgs : EventArgs&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; Color color;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt; Initializes a new instance of the &lt;/span&gt;&lt;span&gt;&amp;lt;see cref="ColorChangedEventArgs"/&amp;gt;&lt;/span&gt;&lt;span&gt; class.&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;param name="c"&amp;gt;&lt;/span&gt;&lt;span&gt;The c.&lt;/span&gt;&lt;span&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; ColorChangedEventArgs(Color c)&lt;br /&gt;        {&lt;br /&gt;            color &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; c;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt; Gets the color of the get.&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;value&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt; The color of the get.&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;/value&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; Color GetColor&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; color; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;span &gt;&lt;a href="http://www.cnblogs.com/rush/archive/2011/04/23/Delegate_Event.html"&gt;复制代码&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1.1.5自定义事件委托&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;多播委托&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;前面使用的每个委托都只包含一个方法调用。调用一个委托就调用一个方法调用。如果要通过一个委托调用多个方法，那就需要使用委托的多播特性。如果调用多播委托，就可以按委托添加次序连续调用多个方法。为此，委托的签名就必须返回void；否则，就只能得到委托调用的最后一个方法的结果，接下来看看多播实现。&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&gt;namespace&lt;/span&gt;&lt;span&gt; Multi_Delegate&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;delegate&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; StringProcessor();&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; Person&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt; _Name;&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; Person(&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt; name)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;._Name &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; name;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; Say()&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine(&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;Hello my name is {0}, what's your name.\n&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;._Name);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; Reply()&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine(&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;Hello my name is {0} and nice to meet you.\n&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;._Name);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; Program&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; Main(&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;[] args)&lt;br /&gt;        {&lt;br /&gt;            Person Jack &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; Person(&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;Jack&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;);&lt;br /&gt;            Person Oliver &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; Person(&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;Oliver&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;);&lt;br /&gt;            StringProcessor sp &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;//&lt;/span&gt;&lt;span&gt;绑定多播方法调用&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;            sp &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; Jack.Say;&lt;br /&gt;            sp &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; Oliver.Reply;&lt;br /&gt;            sp();&lt;br /&gt;            Console.ReadKey();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;span &gt;&lt;a href="http://www.cnblogs.com/rush/archive/2011/04/23/Delegate_Event.html"&gt;复制代码&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;也许有人觉得很简单，实现的确简单明了，就是通过&amp;ldquo;+&amp;rdquo;把方法调用绑定到委托变量中，如果我们用&amp;ldquo;-&amp;rdquo;就可以移除绑定到委托变量方法了。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;&amp;nbsp;事件&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;前面一直没有解释什么是事件，现在让我用一句话解释事件和委托的关系吧！&lt;/p&gt;&#xD;
&lt;p&gt;事件和委托关系就像是属性和字段的关系，为了刚好的实现OOP的编程原则，事件对委托进行了封装。&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&gt;///&lt;/span&gt;&lt;span&gt; 使用事件对委托进行封装&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; Say&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt; 封装委托字段&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt; SpeakDelegate speakDelegate;&lt;br /&gt;        &lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt; 调用委托具体实现方法&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;param name="name"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; SayManager(&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt; name)&lt;br /&gt;        {&lt;br /&gt;            speakDelegate(name);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt; 客户端调用委托&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;param name="args"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; Main(&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;[] args)&lt;br /&gt;        {&lt;br /&gt;            Say.speakDelegate &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; Program.ChineseSpeaker;&lt;br /&gt;            Say.speakDelegate &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; Program.EnglishSpeaker;&lt;br /&gt;            Say.SayManager(&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;Jackson&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;);&lt;br /&gt;            Console.ReadKey();&lt;br /&gt;        }&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;span &gt;&lt;a href="http://www.cnblogs.com/rush/archive/2011/04/23/Delegate_Event.html"&gt;复制代码&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/183411/2011042318425487.jpg" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p align="center"&gt;图5自定义委托&lt;/p&gt;&#xD;
&lt;p align="center"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;现在让我们看看编译后Say类就可以充分证明我们的结论：事件是对委托封装。&lt;/p&gt;&#xD;
&lt;p align="center"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/183411/2011042319004467.jpg" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p align="center"&gt;图6自定义事件编译后的代码&lt;/p&gt;&#xD;
&lt;p align="center"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;大家看到在编译后的代码中出现了一个私有的委托变量，然后接下是一个公用事件委托变量，这进一步说明了事件是对委托的封装。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/183411/2011042319014222.jpg" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p align="center"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;图7自定义事件编译后MSIL代码&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1.1.6事件委托实现观察者模式&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;前面我们介绍按钮事件响应是从发送者和接收者的角度出发的，现在我们以设计模式中的观察者模式为例。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/183411/2011042319031032.gif" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p align="center"&gt;图8GoF观察者架构&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&gt;namespace&lt;/span&gt;&lt;span&gt; GoFObserver&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt; 充当Subject角色&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; GofTelecom&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt;delegate&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; GofNews();&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt; GofNews NewEvent;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt; 发布通知方法&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt;bool&lt;/span&gt;&lt;span&gt; Notify()&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (NewEvent &lt;/span&gt;&lt;span&gt;!=&lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;)&lt;br /&gt;            {&lt;br /&gt;                NewEvent();&lt;br /&gt;                &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;;&lt;br /&gt;            }&lt;br /&gt;            &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt;interface&lt;/span&gt;&lt;span&gt; IObserver&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; Update();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt; 观察者&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; Programmer : IObserver&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;#region&lt;/span&gt;&lt;span&gt; IObserver 成员&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; Update()&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine(&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;I am a greenhand programmer.\n&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;#endregion&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt; 观察者&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; Architect : IObserver&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;#region&lt;/span&gt;&lt;span&gt; IObserver 成员&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; Update()&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine(&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;OH...I am a top banana.\n&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;#endregion&lt;/span&gt;&lt;span&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; Program&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; Main(&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;[] args)&lt;br /&gt;        {&lt;br /&gt;            IList&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;IObserver&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; objObserver &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; List&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;IObserver&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;();&lt;br /&gt;            objObserver.Add(&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; Programmer());&lt;br /&gt;            objObserver.Add(&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; Architect());&lt;br /&gt;            &lt;/span&gt;&lt;span&gt;foreach&lt;/span&gt;&lt;span&gt; (IObserver ob &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; objObserver)&lt;br /&gt;            {&lt;br /&gt;                 GofTelecom.NewEvent &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; ob.Update;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;GofTelecom.Notify())&lt;br /&gt;            {&lt;br /&gt;                Console.WriteLine(&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;Notify successful.\n&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;);&lt;br /&gt;            }&lt;br /&gt;            &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt;&lt;br /&gt;            {&lt;br /&gt;                Console.WriteLine(&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;Notify failed.\n&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span&gt;);&lt;br /&gt;            }&lt;br /&gt;            Console.ReadKey();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;span &gt;&lt;a href="http://www.cnblogs.com/rush/archive/2011/04/23/Delegate_Event.html"&gt;复制代码&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div id="MySignature"&gt;&#xD;
&lt;div id="MyBlogSignture"&gt;&lt;a href="http://creativecommons.org/licenses/by-nc/3.0/deed.zh" rel="license" target="_blank"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/rush/268781/r_cc.png" alt="Creative Commons License" align="left" /&gt;&lt;/a&gt;&#xD;
&lt;p&gt;[作者]：&lt;a href="http://www.cnblogs.com/rush/" target="_blank"&gt;JK_Rush&lt;/a&gt;&lt;br /&gt;[出处]：&lt;a href="http://www.cnblogs.com/rush/" target="_blank"&gt;http://www.cnblogs.com/rush/&lt;/a&gt;&lt;br /&gt;[本文基于]:&amp;nbsp;&lt;a title="Attribution-NonCommercial 3.0 Unported" href="http://creativecommons.org/licenses/by-nc/3.0/deed.zh" target="_blank"&gt;署名-非商业性使用 3.0&lt;/a&gt;&amp;nbsp;许可协议发布，欢迎转载，演绎，但是必须保留本文的署名&amp;nbsp;&lt;a href="http://www.cnblogs.com/rush/" target="_blank"&gt;JK_Rush&lt;/a&gt;&amp;nbsp;（包含链接），且不得用于商业目的。如您有任何疑问或者授权方面的协商，请与我联系 。&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/zhangchenliang/aggbug/2347977.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhangchenliang/archive/2012/02/12/2347977.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhangchenliang/archive/2012/02/11/2347238.html</id><title type="text">.NET 中的泛型 101</title><summary type="text">1.1.1 摘要图1 C# 泛型介绍 在接触泛型之前，我们编程一般都是使用具体类型（char, int, string等）或自定义类型来定义我们变量，如果我们有一个功能很强的接口，而且我们想把它提取或重构成一个通用的接口，使得该接口不仅仅适用于已定义数据类型，而是适用于更多数据类型，从而方便以后的扩展。 泛型提供上述功能的实现，泛型其实就是提供一个数据类型的抽象层，因为它泛所以抽象，方便了我们代码的重构和提取，我们无需hard-code接口中的数据类型，而是通过一个抽象泛型类型来指定数据类型，所以泛型可以提取出一个通用的接口。接下来让我们通过具体的例子说明什么是泛型。1.1.2 正文1.1.1</summary><published>2012-02-11T15:09:00Z</published><updated>2012-02-11T15:09:00Z</updated><author><name>独孤伤</name><uri>http://www.cnblogs.com/zhangchenliang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhangchenliang/archive/2012/02/11/2347238.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhangchenliang/archive/2012/02/11/2347238.html"/><content type="html">&lt;div id="cnblogs_post_body"&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1.1.1 摘要&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/rush/201106/201106111759249554.jpg"&gt;&lt;img title="generic0" src="http://images.cnblogs.com/cnblogs_com/rush/201106/201106111759251048.jpg" alt="generic0" width="590" height="181" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p align="center"&gt;图1 C# 泛型介绍&lt;/p&gt;&#xD;
&lt;p&gt;在接触泛型之前，我们编程一般都是使用具体类型（char, int, string等）或自定义类型来定义我们变量，如果我们有一个功能很强的接口，而且我们想把它提取或重构成一个通用的接口，使得该接口不仅仅适用于已定义数据类型，而是适用于更多数据类型，从而方便以后的扩展。&lt;/p&gt;&#xD;
&lt;p&gt;泛型提供上述功能的实现，&lt;span&gt;泛型其实就是提供一个数据类型的抽象层&lt;/span&gt;，因为它泛所以抽象，方便了我们代码的重构和提取，我们无需hard-code接口中的数据类型，而是通过一个抽象泛型类型来指定数据类型，所以泛型可以提取出一个通用的接口。接下来让我们通过具体的例子说明什么是泛型。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1.1.2 正文&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1.1.1.1 没有泛型的C# 1.0&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;相信许多人都使用过栈或者其他经典数据结构，而且对于栈的FILO都是娴熟于心了。假设现在要我们定义一个栈，用来存放具体数据类型，例如：int 数据，OK让我们来实现自定义栈。&lt;/p&gt;&#xD;
&lt;pre &gt;&lt;span&gt;/// &amp;lt;summary&amp;gt;&#xD;
/// &lt;/span&gt;&lt;span&gt;A custom stack1.&#xD;
&lt;/span&gt;&lt;span&gt;/// &amp;lt;/summary&amp;gt;&#xD;
&lt;/span&gt;&lt;span&gt;public class &lt;/span&gt;&lt;span&gt;CustomStack1&#xD;
&lt;/span&gt;{&#xD;
    &lt;span&gt;private int &lt;/span&gt;_stackPointer = 0;&#xD;
    &lt;span&gt;private int&lt;/span&gt;[] _stackArray;&#xD;
&#xD;
    &lt;span&gt;public void &lt;/span&gt;Push(&lt;span&gt;int &lt;/span&gt;item)&#xD;
    {&#xD;
        &lt;span&gt;////Concrete implemention.&#xD;
    &lt;/span&gt;}&#xD;
&#xD;
    &lt;span&gt;public int &lt;/span&gt;Pop()&#xD;
    {&#xD;
        &lt;span&gt;////Concrete implemention.&#xD;
    &lt;/span&gt;}&#xD;
}&lt;/pre&gt;&#xD;
&lt;p&gt;为了简洁没有完全遵守OOP的原则，这里没有使用属性和给出方法的具体实现，现在我们有了第一版可以存放int数据类型的栈。但如果需求改变保存数据类型增加string。那么我们可以怎样实现呢？没错我们只要增加一个类型为string的栈就OK了。&lt;/p&gt;&#xD;
&lt;pre &gt;&lt;span&gt;/// &amp;lt;summary&amp;gt;&#xD;
/// &lt;/span&gt;&lt;span&gt;A custom stack2.&#xD;
&lt;/span&gt;&lt;span&gt;/// &amp;lt;/summary&amp;gt;&#xD;
&lt;/span&gt;&lt;span&gt;public class &lt;/span&gt;&lt;span&gt;CustomStack2&#xD;
&lt;/span&gt;{&#xD;
    &lt;span&gt;private int &lt;/span&gt;_stackPointer = 0;&#xD;
    &lt;span&gt;private string&lt;/span&gt;[] _stackArray;&#xD;
&#xD;
    &lt;span&gt;public void &lt;/span&gt;Push(&lt;span&gt;int &lt;/span&gt;item)&#xD;
    {&#xD;
        &lt;span&gt;////Concrete implemention.&#xD;
    &lt;/span&gt;}&#xD;
&#xD;
    &lt;span&gt;public string &lt;/span&gt;Pop()&#xD;
    {&#xD;
        &lt;span&gt;////Concrete implemention.&#xD;
    &lt;/span&gt;}&#xD;
}&lt;/pre&gt;&#xD;
&lt;p&gt;很快我们就完成了第二版本的栈了，这看上去的确很简单而且实现起来很快只不过是ctrl + c和ctrl + v，但我们的代码真的那么简单好维护吗？想想其实危机四伏。我们能不能一开始就把保存的数据类型定义成为一个通用的类型呢（抽象数据类型）？----邪恶的object。&lt;/p&gt;&#xD;
&lt;pre &gt;&lt;span&gt;/// &amp;lt;summary&amp;gt;&#xD;
/// &lt;/span&gt;&lt;span&gt;A custom stack.&#xD;
&lt;/span&gt;&lt;span&gt;/// &amp;lt;/summary&amp;gt;&#xD;
&lt;/span&gt;&lt;span&gt;public class &lt;/span&gt;&lt;span&gt;CustomStack&#xD;
&lt;/span&gt;{&#xD;
    &lt;span&gt;private int &lt;/span&gt;_stackPointer = 0;&#xD;
    &lt;span&gt;private object&lt;/span&gt;[] _stackArray;&#xD;
&#xD;
    &lt;span&gt;public void &lt;/span&gt;Push(&lt;span&gt;object &lt;/span&gt;item)&#xD;
    {&#xD;
        &lt;span&gt;////Concrete implemention.&#xD;
    &lt;/span&gt;}&#xD;
&#xD;
    &lt;span&gt;public object &lt;/span&gt;Pop()&#xD;
    {&#xD;
        &lt;span&gt;////Concrete implemention.&#xD;
    &lt;/span&gt;}&#xD;
}&lt;/pre&gt;&#xD;
&lt;p&gt;现在我们实现了第三版的栈了，看上去我们好像找到了通用的解决方法，想想我们要注意一点是如果我们保存和取出数据类型为值类型时，值类型要进行boxing和unboxing操作（&lt;a href="http://www.cnblogs.com/rush/archive/2011/05/29/2062294.html" target="_blank"&gt;《.NET值类型和引用类型101》&lt;/a&gt;），而且还有进行数据类型检测。如果数据量不大我们可能察觉不到性能变化，但数据量大hehehe&amp;hellip;。这就是为什么我们要使用泛型的原因之一，但更重要的原因是在进行boxing和unboxing时，我们需要提供更多信息给编译器，编译时再根据我们提供的信息进行类型检测。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1.1.1.2 C#中的泛型&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;现在我们知道了.NET为什么要提供泛型，现在让我们学习什么是泛型和怎样实现吧！在C# 2.0中提供了泛型这一机制，但这可不是什么新奇的技术，因为早在C++和Java都提供泛型机制。&lt;/p&gt;&#xD;
&lt;p&gt;C#中提供五种泛型分别是：&lt;span&gt;classes, structs, interfaces, delegates, and methods&lt;/span&gt;。&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;泛型类&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;也许有人说没有使用过C++的模板或Java的泛型，而且不了解C#中的泛型，真的是这样吗？其实我们经常都在使用泛型，相信很多人都使用过Dictionary&amp;lt;TKey,TValue&amp;gt;，没错这就是C#中提供的泛型字典，接下来我们将介绍自定义泛型类CustomStack。&lt;/p&gt;&#xD;
&lt;p align="center"&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/rush/201106/201106111815049649.jpg"&gt;&lt;img title="generic2" src="http://images.cnblogs.com/cnblogs_com/rush/201106/201106111815065910.jpg" alt="generic2" width="540" height="410" border="0" /&gt;&lt;/a&gt;图2泛型类&amp;nbsp;&lt;/p&gt;&#xD;
&lt;pre &gt;&lt;span&gt;/// &amp;lt;summary&amp;gt;&#xD;
/// &lt;/span&gt;&lt;span&gt;A custom generic stack.&#xD;
&lt;/span&gt;&lt;span&gt;/// &amp;lt;/summary&amp;gt;&#xD;
&lt;/span&gt;&lt;span&gt;public class &lt;/span&gt;&lt;span&gt;CustomStack&lt;/span&gt;&amp;lt;T&amp;gt;&#xD;
{&#xD;
    &lt;span&gt;private int &lt;/span&gt;_stackPointer = 0;&#xD;
    &lt;span&gt;private &lt;/span&gt;T[] _stackArray;&#xD;
&#xD;
    &lt;span&gt;public void &lt;/span&gt;Push(T item)&#xD;
    {&#xD;
        &lt;span&gt;////Concrete implemention.&#xD;
    &lt;/span&gt;}&#xD;
&#xD;
    &lt;span&gt;public &lt;/span&gt;T Pop()&#xD;
    {&#xD;
        &lt;span&gt;////Concrete implemention.&#xD;
    &lt;/span&gt;}&#xD;
}&lt;/pre&gt;&#xD;
&lt;p&gt;前面给出了泛型类CustomStack实现，我们发现只需在类名后添加&amp;lt;T&amp;gt;，并且把具体数据类型改为抽象的泛型类型T，现在我们就定义了一个简单泛型类，我们可以通过以下对比一下非泛型和泛型实现的区别。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/rush/201106/201106111759318262.jpg"&gt;&lt;img title="generic1" src="http://images.cnblogs.com/cnblogs_com/rush/201106/20110611175932379.jpg" alt="generic1" width="588" height="350" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p align="center"&gt;图3非泛型和泛型类定义&lt;/p&gt;&#xD;
&lt;p&gt;通过上图我们发现泛型类CustomStack和非泛型类CustomStack在实现上没有太大的区别，我们只需把具体类型换成T就OK了，接下来我们将进入泛型的进阶学习。&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;泛型委托&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;关于委托大家可以阅读《&lt;strong&gt;&lt;a href="http://www.cnblogs.com/rush/archive/2011/04/23/Delegate_Event.html" target="_blank"&gt;.NET 中的委托&lt;/a&gt;&lt;/strong&gt;》和《&lt;strong&gt;&lt;a href="http://www.cnblogs.com/rush/archive/2011/05/01/Delegate_Event_EventHandle.html" target="_blank"&gt;.NET中的委托和事件(续)&lt;/a&gt;&lt;/strong&gt;》，现在让我们学习一下泛型委托。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/rush/201106/201106111815072944.jpg"&gt;&lt;img title="generic4" src="http://images.cnblogs.com/cnblogs_com/rush/201106/201106111815084439.jpg" alt="generic4" width="454" height="206" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p align="center"&gt;图4泛型委托的定义&lt;/p&gt;&#xD;
&lt;p&gt;上图给出了泛型委托的定义，我们要注意Type parameters包括泛型参数和返回类型。随着C#3.0 Linq特性的引用，泛型委托的使用得到了极大地扩展，让我们通过具体代码讲讲如何使用泛型委托。&lt;/p&gt;&#xD;
&lt;p&gt;首先我们定义一个泛型委托，然后再定义一个Calc类，接着在Calc里定义两个方法分别是Add() 和Divide() 如下：&lt;/p&gt;&#xD;
&lt;pre &gt;&lt;span&gt;/// &amp;lt;summary&amp;gt;&#xD;
/// &lt;/span&gt;&lt;span&gt;Define generic delegate.&#xD;
&lt;/span&gt;&lt;span&gt;/// &amp;lt;/summary&amp;gt;&#xD;
&lt;/span&gt;&lt;span&gt;public delegate &lt;/span&gt;TR &lt;span&gt;CalcMethod&lt;/span&gt;&amp;lt;T1, T2, TR&amp;gt;(T1 x, T2 y);&#xD;
&#xD;
&#xD;
&lt;span&gt;public class &lt;/span&gt;&lt;span&gt;Calc&#xD;
&lt;/span&gt;{&#xD;
    &lt;span&gt;static private double &lt;/span&gt;sum;&#xD;
&#xD;
    &lt;span&gt;/// &amp;lt;summary&amp;gt;&#xD;
    /// &lt;/span&gt;&lt;span&gt;Gets or sets the sum.&#xD;
    &lt;/span&gt;&lt;span&gt;/// &amp;lt;/summary&amp;gt;&#xD;
    /// &amp;lt;value&amp;gt;&#xD;
    /// &lt;/span&gt;&lt;span&gt;The sum.&#xD;
    &lt;/span&gt;&lt;span&gt;/// &amp;lt;/value&amp;gt;&#xD;
    &lt;/span&gt;&lt;span&gt;static public double &lt;/span&gt;Sum&#xD;
    {&#xD;
        &lt;span&gt;get &lt;/span&gt;{ &lt;span&gt;return &lt;/span&gt;sum; }&#xD;
        &lt;span&gt;set &lt;/span&gt;{ sum = &lt;span&gt;value&lt;/span&gt;; }&#xD;
    }&#xD;
&#xD;
    &lt;span&gt;/// &amp;lt;summary&amp;gt;&#xD;
    /// &lt;/span&gt;&lt;span&gt;Adds the specified x.&#xD;
    &lt;/span&gt;&lt;span&gt;/// &amp;lt;/summary&amp;gt;&#xD;
    /// &amp;lt;param name="x"&amp;gt;&lt;/span&gt;&lt;span&gt;The x.&lt;/span&gt;&lt;span&gt;&amp;lt;/param&amp;gt;&#xD;
    /// &amp;lt;param name="y"&amp;gt;&lt;/span&gt;&lt;span&gt;The y.&lt;/span&gt;&lt;span&gt;&amp;lt;/param&amp;gt;&#xD;
    /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&#xD;
    &lt;/span&gt;&lt;span&gt;static public string &lt;/span&gt;Add(&lt;span&gt;int &lt;/span&gt;x , &lt;span&gt;int &lt;/span&gt;y)&#xD;
    {&#xD;
        Sum = x + y;&#xD;
        &lt;span&gt;return &lt;/span&gt;Sum.ToString();&#xD;
    }&#xD;
&#xD;
    &lt;span&gt;/// &amp;lt;summary&amp;gt;&#xD;
    /// &lt;/span&gt;&lt;span&gt;Divides the specified x.&#xD;
    &lt;/span&gt;&lt;span&gt;/// &amp;lt;/summary&amp;gt;&#xD;
    /// &amp;lt;param name="x"&amp;gt;&lt;/span&gt;&lt;span&gt;The x.&lt;/span&gt;&lt;span&gt;&amp;lt;/param&amp;gt;&#xD;
    /// &amp;lt;param name="y"&amp;gt;&lt;/span&gt;&lt;span&gt;The y.&lt;/span&gt;&lt;span&gt;&amp;lt;/param&amp;gt;&#xD;
    /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&#xD;
    &lt;/span&gt;&lt;span&gt;static public string &lt;/span&gt;Divide(&lt;span&gt;int &lt;/span&gt;x, &lt;span&gt;int &lt;/span&gt;y)&#xD;
    {&#xD;
        &lt;span&gt;if &lt;/span&gt;(y == 0)&#xD;
        {&#xD;
            &lt;span&gt;return &lt;/span&gt;&lt;span&gt;"除数不能为零"&lt;/span&gt;;&#xD;
        }&#xD;
        Sum = x * 1.0 / y;&#xD;
        &lt;span&gt;return &lt;/span&gt;Sum.ToString();&#xD;
    }&#xD;
&#xD;
} &lt;/pre&gt;&#xD;
&lt;p&gt;接下来我们需要定义一个委托变量，而后将委托变量和具体调用方法绑定就OK了。&lt;/p&gt;&#xD;
&lt;pre &gt;&lt;span&gt;////Initialize engeric delegate instance to Add method.&#xD;
&lt;/span&gt;&lt;span&gt;CalcMethod&lt;/span&gt;&amp;lt;&lt;span&gt;int&lt;/span&gt;, &lt;span&gt;int&lt;/span&gt;, &lt;span&gt;string&lt;/span&gt;&amp;gt; calcMethod =&#xD;
    &lt;span&gt;new &lt;/span&gt;&lt;span&gt;CalcMethod&lt;/span&gt;&amp;lt;&lt;span&gt;int&lt;/span&gt;, &lt;span&gt;int&lt;/span&gt;, &lt;span&gt;string&lt;/span&gt;&amp;gt;(&lt;span&gt;Calc&lt;/span&gt;.Add);&lt;/pre&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;类型约束&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;前面例子我们并没有对泛型类型进行限制，由于T是一个抽象类型，有时我们必须限制T是哪种类型，例如我们可以定义CustomStack&amp;lt;int&amp;gt;，CustomStack&amp;lt;double&amp;gt;或CustomStack&amp;lt;string&amp;gt;类型的栈，但有时我们必须限制泛型类型。这时我们需要使用类型约束，&lt;span&gt;引入关键字----where&lt;/span&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;C#中提供五种类型约束（&lt;span&gt;类名，接口名，引用类型，值类型和构造函数&lt;/span&gt;），我们可以通过使用不同的类型约束来限定泛型类型。&lt;/p&gt;&#xD;
&lt;div align="center"&gt;&#xD;
&lt;table style="width: 450px;" border="3" cellspacing="0" cellpadding="0" align="center"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="bottom" width="237"&gt;&#xD;
&lt;p&gt;&lt;strong&gt;类型约束&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="bottom" width="207"&gt;&#xD;
&lt;p&gt;&lt;strong&gt;约束描述&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="237"&gt;&#xD;
&lt;p&gt;ClassName&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="207"&gt;&#xD;
&lt;p&gt;T只能是该类或继承该类的子类&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="237"&gt;&#xD;
&lt;p&gt;InterfaceName&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="207"&gt;&#xD;
&lt;p&gt;T只能是该接口或实行该接口的类型&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="237"&gt;&#xD;
&lt;p&gt;struct&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="207"&gt;&#xD;
&lt;p&gt;T是任意值类型&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="237"&gt;&#xD;
&lt;p&gt;class&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="207"&gt;&#xD;
&lt;p&gt;T是任意引用类型（如classes, arrays, delegates, and interfaces等）&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="237"&gt;&#xD;
&lt;p&gt;new()&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="207"&gt;&#xD;
&lt;p&gt;T是包含公有无参构成函数的任意类型&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p align="center"&gt;表1类型约束&lt;/p&gt;&#xD;
&lt;p align="center"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;通过表1我们初步地了解不同类型约束之间的区别，现在让我们通过具体的例子来看看它们使用范围和区别。&lt;/p&gt;&#xD;
&lt;p&gt;假设我们定义了一个泛型结构体struct RefSample&amp;lt;T&amp;gt; where T : class，现在考考大家以下例子符合类约束的有（提示值类型和引用类型区别）：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;A．  RefSample&amp;lt;IDisposable&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;B．  RefSample&amp;lt;string&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;C． RefSample&amp;lt;int[]&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;D． RefSample&amp;lt;Guid&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;E．  RefSample&amp;lt;int&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;激动人心的时刻又到了现在让我们快快公布答案吧！答案是ABC，因为该泛型的约束是引用类型约束，如果大家还不清楚请看一下引用类型约束的定义。&lt;/p&gt;&#xD;
&lt;p&gt;通过类约束例子，我们举一反三值类型约束就是约束类型为值类型。&lt;/p&gt;&#xD;
&lt;p&gt;OK接下来让我们介绍构造函数约束。在介绍构造函数约束之前，让我们回顾一下符合构造函数约束的条件：任意值类型，任意非静态非抽象无明确定义构造函数的类和任意非抽象有明确定义无参构造函数的类。这句话很别扭，让我们通过具体例子讲解一下。&lt;/p&gt;&#xD;
&lt;pre &gt;&lt;span&gt;//// Define generic method&#xD;
//// Which has constructor type constraints&#xD;
&lt;/span&gt;&lt;span&gt;public &lt;/span&gt;T CreateInstance&amp;lt;T&amp;gt;() &lt;span&gt;where &lt;/span&gt;T : &lt;span&gt;new&lt;/span&gt;() &#xD;
{&#xD;
&lt;span&gt;return new &lt;/span&gt;T(); &#xD;
}&#xD;
&#xD;
CreateInstance&amp;lt;&lt;span&gt;int&lt;/span&gt;&amp;gt;();&#xD;
CreateInstance&amp;lt;&lt;span&gt;object&lt;/span&gt;&amp;gt;();&#xD;
CreateInstance&amp;lt;&lt;span&gt;string&lt;/span&gt;&amp;gt;();&lt;/pre&gt;&#xD;
&lt;p&gt;现在我们定义了一个泛型方法并且添加构造函数约束，调用CreateInstance&amp;lt;int&amp;gt;() 和 CreateInstance&amp;lt;object&amp;gt;() 成功，但调用CreateInstance&amp;lt;string&amp;gt;() 失败，这由于String类没有提供无参构造函数。也许有人会问：&amp;ldquo;我们很难判断每种类型是否包含默认构无参造函数&amp;rdquo;，确确是这样但我们可以记住的是&lt;span&gt;C#规定值类型提供默认无参构造函数&lt;/span&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;组合约束&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;前面的泛型例子都是只使用一种类型约束，但有时候我们要使用多种类型约束，这时我们就可以使用组合约束，在使用约束的时我们要注意约束的先后次序，约束次序如下：&lt;/p&gt;&#xD;
&lt;img title="generic3" src="http://images.cnblogs.com/cnblogs_com/rush/201106/20110611175935710.jpg" alt="generic3" width="499" height="158" border="0" /&gt;&#xD;
&lt;p align="center"&gt;图5约束次序&lt;/p&gt;&#xD;
&lt;p&gt;通过上图我们发现ClassName，class和struct是主要约束，接口名是第二约束，最后是构造函数约束。OK现在我们对组合约束有了初步地了解，那么让我们通过以下例子加深理解。&lt;/p&gt;&#xD;
&lt;p&gt;A. class Sample&amp;lt;T&amp;gt; where T : class, struct&lt;/p&gt;&#xD;
&lt;p&gt;B. class Sample&amp;lt;T&amp;gt; where T : Stream, class&lt;/p&gt;&#xD;
&lt;p&gt;C. class Sample&amp;lt;T&amp;gt; where T : new(), Stream&lt;/p&gt;&#xD;
&lt;p&gt;D. class Sample&amp;lt;T&amp;gt; where T : IDisposable, Stream&lt;/p&gt;&#xD;
&lt;p&gt;E. class Sample&amp;lt;T&amp;gt; where T : XmlReader, IComparable, IComparable&lt;/p&gt;&#xD;
&lt;p&gt;F. class Sample&amp;lt;T,U&amp;gt; where T : struct where U : class, T&lt;/p&gt;&#xD;
&lt;p&gt;G. class Sample&amp;lt;T,U&amp;gt; where T : Stream, U : IDisposable&lt;/p&gt;&#xD;
&lt;p&gt;上面给出错误使用组合约束的例子（注：A~E单类型组合约束，FG多类型组合约束），请大家指出约束错误的原因，如果不清楚错误的原因大家回忆一下约束定义。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1.1.3 总结&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;本文注意介绍了C# 中泛型的基础知识给出自己的总结，而且这不是C# 泛型的全部，如果大家在看完本文之后希望进一步学习泛型这才是我的目的。&lt;/p&gt;&#xD;
&lt;p&gt;泛型的优点：&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;编译时进行类型检测，减少运行时异常InvalidCastException。&lt;/li&gt;&#xD;
&lt;li&gt;泛型使用强数据类型。如我们实例一个CustomStack&amp;lt;CustomStruct&amp;gt;对象objStack，通过调用Push()方法成功把CustomStruct压入栈中，而objStack.Push(&amp;ldquo;Stack&amp;rdquo;)失败。&lt;/li&gt;&#xD;
&lt;li&gt;值类型无需进行boxing和unboxing操作。例如前面的泛型Push()和Pop()方法存放和取出值类型时无需进行boxing和unboxing操作。&lt;/li&gt;&#xD;
&lt;li&gt;减少代码量。如：我们定义一个泛型栈，就不用像前面例子那样分别定义int和string类型的栈。&lt;/li&gt;&#xD;
&lt;li&gt;程序性能提高，因为无需类型转换，从而减少类型检测。&lt;/li&gt;&#xD;
&lt;li&gt;使用泛型减少内存消耗。因为无需进行boxing操作，不用重新分配堆空间。&lt;/li&gt;&#xD;
&lt;li&gt;代码可读性更强。&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;很多人喜欢将C# ，C++ 和Java中的泛型进行对比，而且也有很多相关的讨论，在这里我也给出自己的想法，我觉得C++ 的泛型功能的确比C# 和Java都要强大。&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div id="MySignature"&gt;&#xD;
&lt;div id="MyBlogSignture"&gt;&lt;a href="http://creativecommons.org/licenses/by-nc/3.0/deed.zh" rel="license" target="_blank"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/rush/268781/r_cc.png" alt="Creative Commons License" align="left" /&gt;&lt;/a&gt;&#xD;
&lt;p&gt;[作者]：&lt;a href="http://www.cnblogs.com/rush/" target="_blank"&gt;JK_Rush&lt;/a&gt;&lt;br /&gt;[出处]：&lt;a href="http://www.cnblogs.com/rush/" target="_blank"&gt;http://www.cnblogs.com/rush/&lt;/a&gt;&lt;br /&gt;[本文基于]:&amp;nbsp;&lt;a title="Attribution-NonCommercial 3.0 Unported" href="http://creativecommons.org/licenses/by-nc/3.0/deed.zh" target="_blank"&gt;署名-非商业性使用 3.0&lt;/a&gt;&amp;nbsp;许可协议发布，欢迎转载，演绎，但是必须保留本文的署名&amp;nbsp;&lt;a href="http://www.cnblogs.com/rush/" target="_blank"&gt;JK_Rush&lt;/a&gt;&amp;nbsp;（包含链接），且不得用于商业目的。如您有任何疑问或者授权方面的协商，请与我联系 。&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/zhangchenliang/aggbug/2347238.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhangchenliang/archive/2012/02/11/2347238.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhangchenliang/archive/2012/02/11/2346782.html</id><title type="text">走进单元测试三：实战单元测试</title><summary type="text">前两篇文章讲解了一些关于单元测试的基本理论知识，接下来我们应该理论联系实践，在实践中体会单元测试带给我们的便利！ 环境：VS2008,2010版本！ 关于怎么在VS中创建单元测试，园子里已经有很多这样的文章了，请参考以下链接： http://www.cnblogs.com/heqichang/archive/2011/09/30/2196779.html http://www.cnblogs.com/TerryFeng/archive/2009/05/24/1488333.html http://www.cnblogs.com/zhijianliutang/archi...</summary><published>2012-02-11T08:08:00Z</published><updated>2012-02-11T08:08:00Z</updated><author><name>独孤伤</name><uri>http://www.cnblogs.com/zhangchenliang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhangchenliang/archive/2012/02/11/2346782.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhangchenliang/archive/2012/02/11/2346782.html"/><content type="html">&lt;p&gt;&lt;span&gt;前两篇文章讲解了一些关于单元测试的基本理论知识，接下来我们应该理论联系实践，在实践中体会单元测试带给我们的便利！&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;　　 环境：VS2008,2010版本！&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;　　 关于怎么在VS中创建单元测试，园子里已经有很多这样的文章了，请参考以下链接：　　&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;　　&amp;nbsp;&lt;a href="http://www.cnblogs.com/heqichang/archive/2011/09/30/2196779.html"&gt;http://www.cnblogs.com/heqichang/archive/2011/09/30/2196779.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href="http://www.cnblogs.com/TerryFeng/archive/2009/05/24/1488333.html"&gt;http://www.cnblogs.com/TerryFeng/archive/2009/05/24/1488333.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href="http://www.cnblogs.com/zhijianliutang/archive/2011/12/15/2288423.html"&gt;http://www.cnblogs.com/zhijianliutang/archive/2011/12/15/2288423.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;strong&gt;目录：&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;ol&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;a href="http://www.cnblogs.com/yangcaogui/archive/2012/02/10/2344364.html#a"&gt;&lt;span&gt;前言&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;a href="http://www.cnblogs.com/yangcaogui/archive/2012/02/10/2344364.html#b"&gt;&lt;span&gt;单元测试框架&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;a href="http://www.cnblogs.com/yangcaogui/archive/2012/02/10/2344364.html#c"&gt;&lt;span&gt;断言(Assert)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;a href="http://www.cnblogs.com/yangcaogui/archive/2012/02/10/2344364.html#d"&gt;&lt;span&gt;测试异常&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;a href="http://www.cnblogs.com/yangcaogui/archive/2012/02/10/2344364.html#e"&gt;&lt;span&gt;忽视测试&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;a href="http://www.cnblogs.com/yangcaogui/archive/2012/02/10/2344364.html#f"&gt;&lt;span&gt;数据驱动测试&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;a href="http://www.cnblogs.com/yangcaogui/archive/2012/02/10/2344364.html#g"&gt;&lt;span&gt;单元测试的利器 &amp;rarr; Moles技术&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span id="a"&gt;　　1.前言&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;　　　　一个完整的测试必须符合以下几点：　　　　&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;strong&gt;A)&amp;nbsp;&amp;nbsp;&lt;/strong&gt;&lt;strong&gt;考虑到各种情况，准备测试所需要的各种数据，这一步是测试的关键所在！&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;B) &amp;nbsp;调用要测试的方法！&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;C) &amp;nbsp;验证被测试方法的行为跟预期的是否一致！&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;D) &amp;nbsp;完成验证测试之后清理各种资源！&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span id="b"&gt;2.单元测试框架&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;　　测试框架的DLL文件名为： Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;在VS自动创建单元测试项目就会自动引用这个DLL了！&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;　　　　测试类的基本结构如图：　　　　&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;　　　　&lt;img src="http://pic002.cnblogs.com/images/2012/322864/2012020918293191.jpg" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;　　　　基本的测试类结构就是这样的！&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span id="c"&gt;　　3.断言(Assert)&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;　　　　在单元测试代码里断言是无处不在的，我们应该合理的使用断言来验证数据！&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;　　　　它是一个静态类，主要有下面几种方法用来验证函数的结果跟我的预期是否一致！&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;　　　　①&amp;nbsp;Assert.AreEqual&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;　　　　　　主要是验证函数产生的影响值或返回的值跟预期是否一致，这个方法不适合验证返回的数据集以及集合之类的数据，主要针对字符串，数字等等的单一类型，它还有个泛型重载，这个是比较好的，建议多使用，它还有第三个参数，是一个string型的message，基本上不会用到！&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;　　　　　　&amp;nbsp;☆&amp;nbsp;&lt;strong&gt;Note&lt;/strong&gt;&lt;strong&gt;：&lt;/strong&gt;不要把参数的含义搞混，第一个参数是你的期望值(Except)，第二个参数是函数返回或影响程序产生的实际值(Actual)，不要把两个颠倒过来，因为如果运行正确没有什么大碍，如果运行产生错误，有的时候就会看错掉，造成判断失误，要注意了，这是一个规范！&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　　　 例子：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&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;Assert.AreEqual&amp;lt;string&amp;gt;("a", "a", "cheng xu yuan");&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　②&amp;nbsp;Assert.AreNotEqual　　　　&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　　　没什么要讲的，情况跟上面相反，主要是验证实际值跟期望值不相等的情况！&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　③&amp;nbsp;Assert.AreSame&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　　　判断实际值跟预期值的类型是否一致！&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　④&amp;nbsp;Assert.AreNotSame&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　　　跟上面正好相反，测试类型不一致！&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　⑤&amp;nbsp;Assert.IsNotNull，Assert.IsNull，Assert.IsTrue，Assert.IsFalse&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　　　看这些方法名就知道什么意思了！&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　⑥&amp;nbsp;Assert.IsInstanceOfType，Assert.IsNotInstanceOfType&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　　　判断指定的对象是否是指定的类型！&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　⑦&amp;nbsp;Assert.Fail&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　　　迫使断言失败，不管前面的断言是否都成功了，但测试结果是错误的，因为我强制断言失败了！&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp;　　　　总结&lt;/span&gt;&lt;/strong&gt;：一个好的测试案例，里面的断言至少是大于一个的，这样才能验证数据的准确性，保证验证数据的严谨性！&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;&lt;strong&gt;&lt;span&gt;　　　　 例：&lt;/span&gt;&lt;/strong&gt;如果实际值是个DataSet一般测试流程为：①判断是否为&amp;ldquo;null&amp;rdquo; &amp;rarr; ②判断是否为&amp;ldquo;Empty&amp;rdquo;(验证是否有数据) &amp;rarr;③ 接下来再验证数据的一致性，所以验证DataSet的基本流程就是这样的！　　　&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;pre&gt;&lt;span&gt;&lt;span&gt; 1&lt;/span&gt; 　　　　&lt;span&gt;///&lt;/span&gt; &lt;span&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt; 2&lt;/span&gt; 　　　　 &lt;span&gt;///&lt;/span&gt;&lt;span&gt; Modify.&lt;br /&gt;&lt;/span&gt;&lt;span&gt; 3　　　　&lt;/span&gt;  &lt;span&gt;///&lt;/span&gt; &lt;span&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt; 4&lt;/span&gt;         [TestMethod()]&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; 5&lt;/span&gt;         [RollBack()]&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; 6&lt;/span&gt;         &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; UpdateBondAssessApplicationConfiguration_ModifyData_DataUpdated() //注意命名规范，下一篇会着重讲解！&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; 7&lt;/span&gt;         {&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; 8&lt;/span&gt;             AssessApplicationConfigurationDataSet assessConfigurationDataSet = target.GetBondAssessApplicationConfiguration();&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; 9&lt;/span&gt;             assessConfigurationDataSet.CM_LookupConfiguration[&lt;span&gt;0&lt;/span&gt;].Description = &lt;span&gt;"&lt;/span&gt;&lt;span&gt;This is my modify&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;10&lt;/span&gt;             AssessApplicationConfigurationDataSet actual = target.UpdateBondAssessApplicationConfiguration(assessConfigurationDataSet);&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;11&lt;/span&gt;             AssessApplicationConfigurationDataSet newAssessAppDataSet = target.GetBondAssessApplicationConfiguration();&lt;/span&gt;&lt;br /&gt;&lt;span&gt;12 &lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;13&lt;/span&gt;             Assert.IsNotNull(actual);                                                                       &lt;span&gt;//&lt;/span&gt;&lt;span&gt;第一步 验证是否为Null&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;14&lt;/span&gt;             Assert.IsTrue(actual.CM_LookupConfiguration.Rows.Count &amp;gt; &lt;span&gt;0&lt;/span&gt;);                                    &lt;span&gt;//&lt;/span&gt;&lt;span&gt;第二步 验证是否为Empty&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;15&lt;/span&gt;             Assert.IsTrue(newAssessAppDataSet.CM_LookupConfiguration[&lt;span&gt;0&lt;/span&gt;].Description == &lt;span&gt;"&lt;/span&gt;&lt;span&gt;This is my modify&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;br /&gt;&lt;/span&gt;&lt;span&gt;16&lt;/span&gt;             Assert.IsTrue(CompareToTable(newAssessAppDataSet.CM_LookupConfiguration, actual.CM_LookupConfiguration));&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;17&lt;/span&gt;         }&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;div &gt;&lt;span &gt;&lt;a href="http://www.cnblogs.com/yangcaogui/archive/2012/02/10/2344364.html"&gt;复制代码&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p align="left"&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;strong&gt;&lt;span id="d"&gt;　　4.测试异常 &amp;rarr; ExpectedException(异常属性)&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　当代码中有抛出异常的情况时，我们应该对这个异常的准确性进行测试，首先要捕获这个异常，然后再跟我预期定义的异常进行比较就行了！&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　在VS自带的测试框架中提供了处理异常的测试！&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;这个异常属性有两个构造函数重载：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　第一个参数：函数中出现异常的类型 &amp;rarr; &amp;nbsp;[ExpectedException(typeof(NullReferenceException))]&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　第二个参数：异常所提示的信息(Message) &amp;rarr;&amp;nbsp;[ExpectedException(typeof(NullReferenceException),"Don't is null.")]&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&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;pre&gt;&lt;span&gt;&lt;span&gt; 1&lt;/span&gt; 　　　　 &lt;span&gt;///&lt;/span&gt; &lt;span&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt; 2&lt;/span&gt; 　　　　 &lt;span&gt;///&lt;/span&gt;&lt;span&gt; Is null.&lt;br /&gt;&lt;/span&gt;&lt;span&gt; 3&lt;/span&gt; 　　　　 &lt;span&gt;///&lt;/span&gt; &lt;span&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt; 4&lt;/span&gt;         [TestMethod()]&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; 5&lt;/span&gt;         [RollBack()]&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; 6&lt;/span&gt;         [ExpectedException(&lt;span&gt;typeof&lt;/span&gt;(NullReferenceException))]  //第一种只定义了异常类型！&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; 7&lt;/span&gt;         &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; UpdateLookupChequeNumberRegion_UpdateChequeNumberRegionAndDataSetIsNull_ThrowException()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; 8&lt;/span&gt;         {&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; 9&lt;/span&gt;             LookupChequeNumberRegionDataSet actual = target.UpdateLookupChequeNumberRegion(&lt;span&gt;null&lt;/span&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;10&lt;/span&gt;         }&lt;/span&gt;&lt;br /&gt;&lt;span&gt;11 &lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;12&lt;/span&gt;         &lt;span&gt;///&lt;/span&gt; &lt;span&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;13&lt;/span&gt; 　　　　 &lt;span&gt;///&lt;/span&gt;&lt;span&gt; Add.&lt;br /&gt;&lt;/span&gt;&lt;span&gt;14&lt;/span&gt; 　　　　 &lt;span&gt;///&lt;/span&gt; &lt;span&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;15&lt;/span&gt;         [TestMethod()]&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;16&lt;/span&gt;         [RollBack()]　　　　　　　　　　　　//第二种定义了预期的异常类型还定义了异常信息！&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;17&lt;/span&gt;         [ExpectedException(&lt;span&gt;typeof&lt;/span&gt;(BusinessException), &lt;span&gt;"&lt;/span&gt;&lt;span&gt;The category and code combination you have entered already exist. Please enter a different category and code combination.&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;)]&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;18&lt;/span&gt;         &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; UpdatePolicyConsideration_AddPolicyTheCODEIsSame_ThrowException()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;19&lt;/span&gt;         {&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;20&lt;/span&gt;             &lt;span&gt;string&lt;/span&gt; newGUID = Guid.NewGuid().ToString();&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;21&lt;/span&gt;             CodeTableDataSet expectedDataSet = target.GetPolicyConsideration();&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;22&lt;/span&gt;             expectedDataSet.T_IC_CODE.AddT_IC_CODERow(GetNewRow(expectedDataSet, &lt;span&gt;null&lt;/span&gt;, &lt;span&gt;ref&lt;/span&gt; newGUID));&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;23&lt;/span&gt;             CodeTableDataSet actual = target.UpdatePolicyConsideration(expectedDataSet);&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;31&lt;/span&gt;         }&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;div &gt;&lt;span &gt;&lt;a href="http://www.cnblogs.com/yangcaogui/archive/2012/02/10/2344364.html"&gt;复制代码&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p align="left"&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;strong&gt;&lt;span id="e"&gt;　　5.忽视测试 &amp;rarr; Ignore属性&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&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;pre&gt;&lt;span&gt;&lt;span&gt; 1&lt;/span&gt; 　　　　 [TestMethod()]&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; 2&lt;/span&gt;         [Ignore()]        &lt;span&gt;//&lt;/span&gt;&lt;span&gt;运行单元测试时将忽视这个测试案例&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt; 3&lt;/span&gt;         &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; GetBondDebt_InputValidClientID_RecordFound()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; 4&lt;/span&gt;         {&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; 5&lt;/span&gt;             &lt;span&gt;int&lt;/span&gt; clientCoreID = GetClientIDForSomeCondition();&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; 6&lt;/span&gt;             DebtDataSet actual = target.GetBondDebt(clientCoreID);&lt;/span&gt;&lt;br /&gt;&lt;span&gt; 7 &lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; 8&lt;/span&gt;             Assert.IsNotNull(actual);&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; 9&lt;/span&gt;             Assert.IsTrue(actual.Debt.Rows.Count &amp;gt; &lt;span&gt;0&lt;/span&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;10&lt;/span&gt;             Assert.IsTrue(CompareToDataSetAndList(actual, clientCoreID));&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;11&lt;/span&gt;         }&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;div &gt;&lt;span &gt;&lt;a href="http://www.cnblogs.com/yangcaogui/archive/2012/02/10/2344364.html"&gt;复制代码&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p align="left"&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;strong&gt;&lt;span id="f"&gt;　　6.数据驱动测试&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　在上一篇提到过当你的数据量很大的时候，有一种解决方案是采用数据驱动测试，把我们需要用来测试的数据放在文件中，然后运行测试，让测试代码去读取文件中的数据！&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　其实它也有一定的局限性，所以在合理的场合中合理的使用将减轻我们的工作量，这个判断只能给为看官去判断了！&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　当前支持Sql Server ，Oracle，CSV，XML等等文件，下面我就介绍下CSV和XML文件的使用方法！&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　也可以参照园子里面的博文：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　&lt;a href="http://www.cnblogs.com/zhijianliutang/archive/2011/12/15/2289398.html"&gt;http://www.cnblogs.com/zhijianliutang/archive/2011/12/15/2289398.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　&lt;a href="http://www.cnblogs.com/heqichang/archive/2011/10/08/2202441.html"&gt;http://www.cnblogs.com/heqichang/archive/2011/10/08/2202441.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　①CSV作为数据文件&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&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;pre&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt; 　　　　 &lt;span&gt;&lt;span&gt;public&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; Add(&lt;span&gt;int&lt;/span&gt; numberOne, &lt;span&gt;int&lt;/span&gt; numberTwo)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;           {&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;             &lt;span&gt;int&lt;/span&gt; one = numberOne;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;             &lt;span&gt;int&lt;/span&gt; two = numberTwo;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;             &lt;span&gt;int&lt;/span&gt; three = numberOne + numberTwo;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;6&lt;/span&gt;             &lt;span&gt;return&lt;/span&gt; three;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;7&lt;/span&gt;           }&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;div &gt;&lt;span &gt;&lt;a href="http://www.cnblogs.com/yangcaogui/archive/2012/02/10/2344364.html"&gt;复制代码&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;&amp;nbsp;　　　　　　a) 首先要创建连接字符串，具体步骤如下：　　　　　　　　&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;　　　　　　　　I，&lt;img src="http://pic002.cnblogs.com/images/2012/322864/2012021017483772.jpg" alt="" /&gt;　　&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;　　　　　　　　II，&lt;img src="http://pic002.cnblogs.com/images/2012/322864/2012021017503237.jpg" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;　　　　　　　　III，&lt;img src="http://pic002.cnblogs.com/images/2012/322864/2012021017505665.jpg" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&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;pre&gt;&lt;span&gt;&lt;span&gt; 1&lt;/span&gt; 　　　 &lt;span&gt;&lt;span&gt;///&lt;/span&gt; &lt;span&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt; 2&lt;/span&gt; 　　　　 &lt;span&gt;///&lt;/span&gt;&lt;span&gt;Add 的测试&lt;br /&gt;&lt;/span&gt;&lt;span&gt; 3&lt;/span&gt; 　　　　 &lt;span&gt;///&lt;/span&gt;&lt;span&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt; 4&lt;/span&gt;         [DataSource(&lt;span&gt;"&lt;/span&gt;&lt;span&gt;Microsoft.VisualStudio.TestTools.DataSource.CSV&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; 5&lt;/span&gt;                     &lt;span&gt;"&lt;/span&gt;&lt;span&gt;|DataDirectory|\\number.csv&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; 6&lt;/span&gt;                     &lt;span&gt;"&lt;/span&gt;&lt;span&gt;number#csv&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; 7&lt;/span&gt;                     DataAccessMethod.Sequential),  //这个是连接字符串，你也可以手动写，不要按照上面步骤操作，当然要写对单词和&amp;ldquo;注意文件的路径&amp;rdquo;！&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; 8&lt;/span&gt;         DeploymentItem(&lt;span&gt;"&lt;/span&gt;&lt;span&gt;MyTest\\number.csv&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;),&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; 9&lt;/span&gt;         TestMethod()]&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;10&lt;/span&gt;         &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; AddTest1()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;11&lt;/span&gt;         {&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;12&lt;/span&gt;             Program target = &lt;span&gt;new&lt;/span&gt; Program();&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;13&lt;/span&gt;             &lt;span&gt;int&lt;/span&gt; numberOne = Convert.ToInt32(&lt;span&gt;this&lt;/span&gt;.testContextInstance.DataRow[&lt;span&gt;"&lt;/span&gt;&lt;span&gt;One&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;]);　　//获取数据！&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;14&lt;/span&gt;             &lt;span&gt;int&lt;/span&gt; numberTwo = Convert.ToInt32(&lt;span&gt;this&lt;/span&gt;.testContextInstance.DataRow[&lt;span&gt;"&lt;/span&gt;&lt;span&gt;Two&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;]); ;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;15&lt;/span&gt;             &lt;span&gt;int&lt;/span&gt; expected = Convert.ToInt32(&lt;span&gt;this&lt;/span&gt;.testContextInstance.DataRow[&lt;span&gt;"&lt;/span&gt;&lt;span&gt;Except&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;]);&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;16&lt;/span&gt;             &lt;span&gt;int&lt;/span&gt; actual = target.Add(numberOne, numberTwo);&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;17&lt;/span&gt;             Assert.AreEqual(expected, actual);&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;18&lt;/span&gt;         }&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;div &gt;&lt;span &gt;&lt;a href="http://www.cnblogs.com/yangcaogui/archive/2012/02/10/2344364.html"&gt;复制代码&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span&gt;&amp;nbsp;　　　　　　点击运行你的测试，程序会通过你设置的路径去文件里面一行一行的读取数据，然后验证数据，如果其中有一行数据报错，那么整个测试也就是失败了，所以保证数据的正确性很重要！&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;&lt;strong&gt;&lt;span&gt;　　　　 　　注意&lt;/span&gt;&lt;/strong&gt;：CSV默认会以Excel的方式打开，但是它里面的数据摆放有一个规则，就是以逗号的形式呈现，所以我还是建议大家使用记事本来添加数据！&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　②使用XML作为数据文件&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　　　其实使用方法跟上面的一样，尤其注意的是你XML文件里面数据的格式！　　　　　　&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;pre&gt;&lt;span&gt;&lt;span&gt; 1&lt;/span&gt; 　　　&lt;span&gt;　&amp;lt;table&amp;gt;　//一定要设置根节点，如果不设置在文件选择的时候会报错！　　　&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; 2&lt;/span&gt;             &amp;lt;my&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; 3&lt;/span&gt;                 &amp;lt;price&amp;gt;&lt;span&gt;1&lt;/span&gt;&amp;lt;/price&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; 4&lt;/span&gt;                 &amp;lt;number&amp;gt;&lt;span&gt;1&lt;/span&gt;&amp;lt;/number&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; 5&lt;/span&gt;                 &amp;lt;total&amp;gt;&lt;span&gt;1&lt;/span&gt;&amp;lt;/total&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; 6&lt;/span&gt;             &amp;lt;/my&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; 7&lt;/span&gt;             &amp;lt;my&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; 8&lt;/span&gt;                 &amp;lt;price&amp;gt;&lt;span&gt;2&lt;/span&gt;&amp;lt;/price&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt; 9&lt;/span&gt;                 &amp;lt;number&amp;gt;&lt;span&gt;2&lt;/span&gt;&amp;lt;/number&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;10&lt;/span&gt;                 &amp;lt;total&amp;gt;&lt;span&gt;4&lt;/span&gt;&amp;lt;/total&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;11&lt;/span&gt;             &amp;lt;/my&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;12&lt;/span&gt;         &amp;lt;/table&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;div &gt;&lt;span &gt;&lt;a href="http://www.cnblogs.com/yangcaogui/archive/2012/02/10/2344364.html"&gt;复制代码&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　　　注意：怎么来获取数据呢？Convert.ToInt32(&lt;span data-mce-=""&gt;this&lt;/span&gt;.testContextInstance.DataRow[&lt;span data-mce-=""&gt;"price&lt;/span&gt;&lt;span data-mce-=""&gt;"&lt;/span&gt;]) 通过这样的方式来获取数据，还有在选择文件时，要确认是否选中了一个数据源文件，这个不要疏忽了！&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　③使用数据库作为数据文件很简单，配置一下连接字符串，设置一下路径就好了，在此就不讲解了！&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;strong&gt;&lt;span id="g"&gt;　　7.单元测试的利器 &amp;rarr; &amp;ldquo;Mole&amp;rdquo;技术&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　首先想感谢下项目组的Tian Mi大哥是他把这项技术带给我们的，谢谢他的无私奉献！&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　园子里面也有一篇精华文章，讲解了基本用法，链接为：&lt;a href="http://www.cnblogs.com/hwade/archive/2010/11/26/Moles.html"&gt;http://www.cnblogs.com/hwade/archive/2010/11/26/Moles.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　&amp;ldquo;Mole&amp;rdquo;文件的下载地址：&lt;a href="http://www.kuaipan.cn/index.php?ac=file&amp;amp;oid=29568238492847207"&gt;http://www.kuaipan.cn/index.php?ac=file&amp;amp;oid=29568238492847207&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　①应用环境：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　　　所属模块依赖于系统的其它模块，依赖于系统的一些配置环境，还有就是调用第三方接口或服务等等的场景！&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　　　在这样的场景下我们的测试是不能直接调用第三方接口或服务的，所以我们要制造一个虚拟的环境，当我们去调用接口时，Mole技术会拦截我们调用的方法，从而转向我们自己制造的虚拟环境，那么就不会直接调用第三方接口和服务了！&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　②基本的操作流程不讲解了，如果你看了&lt;a href="http://www.cnblogs.com/hwade/archive/2010/11/26/Moles.html"&gt;http://www.cnblogs.com/hwade/archive/2010/11/26/Moles.html&lt;/a&gt;这篇文章就明白了，我就将一些在写测试时遇到的几个小问题！&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　③如果&amp;ldquo;Moles&amp;rdquo;结束后，项目编译的时候报错，具体的错误我也不怎么知道了，但是我在网上搜了很久才找到答案的！&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　　　步骤：点击你的Moles文件，你会发现他是个XML配置文件，修改它的属性就好了，如：　　　　　　&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;pre&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt; 　　　　　　&amp;lt;Moles  xmlns=&lt;span&gt;"&lt;/span&gt;&lt;span&gt;http://schemas.microsoft.com/moles/2010/&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;  DisableCache=&lt;span&gt;"&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;"&lt;/span&gt; &amp;gt;  //增加一个DisableCache = "true"这个属性，如果遇到问题，基本都是这个问题，这样解决就Ok了！&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;   　　　　　　&amp;lt;Assembly Name=&lt;span&gt;"&lt;/span&gt;&lt;span&gt;Foundation.FinanceManagement.BusinessService&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;  /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt; 　　　　　　&amp;lt;/Moles&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;div &gt;&lt;span &gt;&lt;a href="http://www.cnblogs.com/yangcaogui/archive/2012/02/10/2344364.html"&gt;复制代码&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　③有&amp;ldquo;Ref&amp;rdquo;参数的方法应该怎么写？&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span&gt;　　　　　　如果参数中ref参数，那么就不能按一般的方式写了，应该这样写：　　&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/322864/2012021018380164.jpg" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;　　　　④Moles的基本语法&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;　　　　　　Moles的内部原理没有明白，只懂的怎么去用它，基本的语法可以模仿上面的写法！&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;　　　　　　因为你把一个DLL Moles之后并编译之后会生成一个新的DLL，这里面就是虚拟环境场所，而且类名称都是以&amp;ldquo;M&amp;rdquo;开头的！&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;　　　　　　语法：命名空间 + Moles + M + 你Moles掉的类名 + Allinstance + 选择你要拦截的方法名 = (instance(必填参数，如果方法没参数，也必要添个)) &amp;nbsp;=&amp;gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;　　　　　　　　　{&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;　　　　　　　　　　　　//里面写你的逻辑，制造你自己的虚拟环境，如果方法有返回值，可以自己指定返回值的！&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;　　　　　　　　　};&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;　　好了，关于在实践中的单元测试就这么多了，其实最重要的还是你考虑测试的角度要多样化，就是考虑问题要全面，还有代码的简洁性，重构，封装等等，下一篇将是对这方面的着重讨论！&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;　　下一篇：走进单元测试四：测试背后的思考和总结！&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;　　链接：&lt;a id="cb_post_title_url"  href="http://www.cnblogs.com/yangcaogui/archive/2012/02/06/2337483.html"&gt;走进单元测试一：初认Unit Test&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;　　　　 &amp;nbsp;&amp;nbsp;&lt;a id="cb_post_title_url"  href="http://www.cnblogs.com/yangcaogui/archive/2012/02/08/2336123.html"&gt;走进单元测试二：测试需要从哪些方面着手&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/zhangchenliang/aggbug/2346782.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhangchenliang/archive/2012/02/11/2346782.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhangchenliang/archive/2012/02/10/2345138.html</id><title type="text">在.NET环境中实现每日构建(Daily Build)--NAnt篇</title><summary type="text">前言关于每日构建这个话题，也已经有很多很好的文章讨论了。本文的写作过程中也参考了这些文章。本文之所以继续这个题目，是因为在查阅了网上的资源后，发现没有一个比较通用的过程。所以本文就主要讨论了利用NAnt构建一个通用日编译的方案。利用这个方案，日编译的维护者可以不需要对每个要编译的方案都要做很多维护。只要定义一个属性文件就可以了。关键词： Daily Build, NAnt1.简介1.1.每日构建的优点：每日构建（Daily Build）也可称为持续集成（Continuous Integration），强调完全自动化的、可重复的创建过程，其中包括每天运行多次的自动化测试。每日构建的作用日益显得重</summary><published>2012-02-10T04:03:00Z</published><updated>2012-02-10T04:03:00Z</updated><author><name>独孤伤</name><uri>http://www.cnblogs.com/zhangchenliang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhangchenliang/archive/2012/02/10/2345138.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhangchenliang/archive/2012/02/10/2345138.html"/><content type="html">&lt;p&gt;&lt;strong&gt;前言&lt;/strong&gt;&lt;strong&gt;&amp;nbsp;&lt;br /&gt;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;关于每日构建这个话题，也已经有很多很好的文章讨论了。本文的写作过程中也参考了这些文章。本文之所以继续这个题目，是因为在查阅了网上的资源后，发现没有一个比较通用的过程。所以本文就主要讨论了利用NAnt构建一个通用日编译的方案。利用这个方案，日编译的维护者可以不需要对每个要编译的方案都要做很多维护。只要定义一个属性文件就可以了。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;&lt;span style="font-size: small;"&gt;关键词： Daily Build, NAnt&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;简介&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1.1.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/strong&gt;&lt;strong&gt;每日构建的优点：&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;每日构建（Daily Build）也可称为持续集成（Continuous Integration），强调完全自动化的、可重复的创建过程，其中包括每天运行多次的自动化测试。每日构建的作用日益显得重要。它让开发者可以每天进行系统集成，从而减少了开发过程中的集成问题。&lt;/p&gt;&#xD;
&lt;p&gt;持续集成可以减少集成阶段"捉虫"消耗的时间，从而最终提高生产力。它使得绝大多数bug在引入的同一天就可以被发现。而且，由于一天之中发生变动的部分并不多，所以可以很快找到出错的位置。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1.2.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/strong&gt;&lt;strong&gt;每日构建完成的任务&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;实现自动化每日构建需要做以下几部分的工作：&lt;/p&gt;&#xD;
&lt;p&gt;l&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;使创建过程完全自动化，让任何人都可以只输入一条命令就完成系统的创建。&lt;/p&gt;&#xD;
&lt;p&gt;l&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;使测试完全自动化，让任何人都可以只输入一条命令就运行一套完整的系统测试。&lt;/p&gt;&#xD;
&lt;p&gt;l&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;确保所有人都可以得到最新、最好的可执行文件。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;2.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/strong&gt;&lt;strong&gt;每日构建所使用的工具&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在.NET环境下建立每日构建可以使用一系列开源工具：&lt;/p&gt;&#xD;
&lt;p&gt;Nant:&amp;nbsp;完成代码的自动编译，自动运行测试工具。&lt;a href="http://nant.sourceforge.net/builds/"&gt;http://nant.sourceforge.net/builds/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;NantContrib：自动从源码库中获取源代码。&lt;a href="http://nantcontrib.sourceforge.net/nightly/builds/"&gt;http://nantcontrib.sourceforge.net/nightly/builds/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;NUnit2Report:将NUnit测试工具产生的XML报告转换为HTML报告形式。http://NUnit2Report.sourceforge.net&lt;/p&gt;&#xD;
&lt;p align="left"&gt;VSS：Visual Source Safe，微软源码管理工具&lt;/p&gt;&#xD;
&lt;p align="left"&gt;Draco.NET:&amp;nbsp;用于自动检测VSS中源代码变动情况，调用Nant完成自动编译&lt;/p&gt;&#xD;
&lt;p align="left"&gt;http://sourceforge.net/projects/draconet/&lt;/p&gt;&#xD;
&lt;p&gt;下载所需的工具后，按照如下步骤进行安装：&lt;/p&gt;&#xD;
&lt;p&gt;在服务器上安装VSS源码管理工具&lt;/p&gt;&#xD;
&lt;p&gt;安装下载的Draco Server&amp;nbsp;和&amp;nbsp;Draco Web,修改安装后的Draco Web目录下的web.config文件，设置正确的Draco Server安装路径&lt;/p&gt;&#xD;
&lt;p&gt;将NAnt、NAntContrib、NUnit2Report压缩包解压，将三个Bin目录中的内容复制到一个公用目录，比如D:\DailyBuildTools，然后将该路径加入系统的Path路径列表中，具体为&amp;ldquo;控制面板-〉系统属性-〉环境变量-〉Path&amp;rdquo;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;3.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/strong&gt;&lt;strong&gt;NAnt自动脚本&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;NAnt脚本实现了每日构建的主体功能，它具体分为下面几部分&lt;/p&gt;&#xD;
&lt;p&gt;l&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;定义每日构建所需的一些环境变量，比如从VSS上下载的源码的保存目录，发布目录等&lt;/p&gt;&#xD;
&lt;p&gt;l&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;清除旧的代码并从VSS源码库中下载最新源代码&lt;/p&gt;&#xD;
&lt;p&gt;l&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;编译源代码并运行测试代码集&lt;/p&gt;&#xD;
&lt;p&gt;l&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;将编译后的目标代码拷贝到发布目录进行发布&lt;/p&gt;&#xD;
&lt;p&gt;为了尽可能少的改动NAnt的脚本文件，简化日常维护的工作量，我们把一些对所有项目都基本相同的过程抽取出来，如环境变量定义，清除旧代码获取新代码，编译源代码，对目标代码进行发布的过程都可以写成通用的脚本，而一个具体项目的每日构建脚本则调用通用过程完成&lt;/p&gt;&#xD;
&lt;p&gt;本文采取的目录体系如下所示：&lt;/p&gt;&#xD;
&lt;p&gt;D：\DailyBuild\&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;project1&amp;gt;\Source:存放&amp;lt;project1&amp;gt;源代码的目录&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;project1&amp;gt;\Build:存放&amp;lt;project1&amp;gt;编译后的目标代码的目录&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;project1&amp;gt;\Publish:存放&amp;lt;project1&amp;gt;的WEB发布文件的目录&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;project1&amp;gt;\log:存放&amp;lt;project1&amp;gt;的日志文件&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;3.1.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/strong&gt;&lt;strong&gt;Nant的基础知识&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;l&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Nant脚本代码文件的基本结构&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;?xml version="1.0" encoding="gb2312"?&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;project name="Projects" default="prebuild"&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;target name="prebuild" depends="namecheck,clean " description="&amp;hellip;"&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;hellip;&amp;hellip;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/target&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;target name="namecheck" &amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;hellip;&amp;hellip;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/target&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/project&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;说明：encoding="gb2312"使得脚本文件可以支持中文&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;project&amp;gt;标签定义了项目属性，一个脚本文件只能有一个项目定义&lt;/p&gt;&#xD;
&lt;p&gt;default="prebuild"说明该项目缺省从prebuild任务开始执行&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;target&amp;gt;标签定义了一项任务，任务是Nant脚本具体执行动作的最小单元&lt;/p&gt;&#xD;
&lt;p&gt;depends="namecheck,clean "说明该任务执行前需要namecheck和clean任务先执行&lt;/p&gt;&#xD;
&lt;p&gt;description描述了该任务的一些说明性信息&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;l&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;定义变量&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;property name="&amp;lt;变量名&amp;gt;" value="$&amp;lt;变量值&amp;gt;"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;如上所示，定义变量使用&amp;lt;property&amp;gt;标签，name属性定义了变量的名称,value属性定义变量的值，其中name属性可以使用字母、数字、点号、下划线等符号，而value属性可以使用字符串或是已经定义的变量，Nant内建的函数等，&lt;/p&gt;&#xD;
&lt;p&gt;要使用已经定义的变量，可以用${&amp;lt;变量名&amp;gt;}，要使用内建函数，可以使用${&amp;lt;函数名称&amp;gt;}&lt;/p&gt;&#xD;
&lt;p&gt;如: &amp;lt;property name="solution.basedir" value="${core.basedir}\${solution.name}"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;使用了已定义变量core.basedir和solution.name来定义变量solution.basedir;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;property name="curdir" value="${directory::get-current-directory()}"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;使用了NAnt内建函数directory::get-current-directory()来定义curdir变量&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;strong&gt;3.2.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/strong&gt;&lt;strong&gt;定义环境变量&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;定义环境变量的脚本代码写在Common。Config文件里&lt;/p&gt;&#xD;
&lt;p&gt;主要有以下几类信息的定义：&lt;/p&gt;&#xD;
&lt;p&gt;l&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;每日构建所在的根目录&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;property name="curdir" value="${directory::get-current-directory()}"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;property name="core.basedir" value="${curdir}"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;说明：${directory::get-current-directory()}内建函数获取当前文件所在路径信息&lt;/p&gt;&#xD;
&lt;p&gt;l&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;被编译的解决方案的目录结构，和前面提到的目录体系一致&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;property name="solution.basedir" value="${core.basedir}\${solution.name}"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;property name="solution.source" value="${solution.basedir}\source"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;property name="solution.build" value="${solution.basedir}\build"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;property name="solution.log" value="${solution.basedir}\log"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;说明：以上代码是定义了要编译的解决方案的目录结构信息，其中${solution.name}是由外部传入的解决方案的名称，后面的代码将根据该名称在日编译的根目录下生成和solution.name指定的名称同名的目录，并在该目录下生成source,buld,log等子目录&lt;/p&gt;&#xD;
&lt;p&gt;l&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VSS源代码管理系统的基本信息&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;!--vss数据库登录信息--&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;property name="vss.username" value="autobuild"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;property name="vss.password" value="autobuild"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;!--vss数据库所在的位置--&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;property name="vss.dbpath" value="\\10.136.238.231\vss\srcsafe.ini"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;!--vss中工程的根目录--&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;property name="vss.basepath" value="$/"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;说明：定义了和VSS源码管理系统相关的一些信息，其中VSS数据库所在位置可以是网络路径，也可以是本地路径&lt;/p&gt;&#xD;
&lt;p&gt;l&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;lt;编译时的一些参数&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;!--编译版本号--&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;property name="build.number" value="1.0"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;!--决定编译是Debug版本还是Release版本--&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;property name="build.configuration" value="Release"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;3.3.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/strong&gt;&lt;strong&gt;建立目录结构，获取源代码&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;脚本代码写在CheckSource.build.xml文件里&lt;/p&gt;&#xD;
&lt;p&gt;l&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;包含在Common.config文件里定义的公共变量&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;include buildfile="common.config"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;l&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;检查是否存在solution.name变量&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;target name="namecheck" description="检查solution.name变量是否设置"&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;!--检查解决方案名称是否已经定义--&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;ifnot test="${property::exists('solution.name')}"&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;fail message="未定义解决方案名称solution.name"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/ifnot&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;!--去掉可能的空格字符--&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;property name="solution.name" value="${string::trim(solution.name)}"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;!--检查solution.name变量是否为空字符--&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;if test="${string::get-length(solution.name)==0}"&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;fail message="未定义解决方案的名称solution.name"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/if&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/target&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;说明：${property::exists('&amp;lt;变量名&amp;gt;')}是NAnt内建函数，用于测试某变量是否存在&lt;/p&gt;&#xD;
&lt;p&gt;${string::get-length(&amp;lt;字符串变量&amp;gt;)==0}测试字符串的长度是否为0&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;ifnot test=&amp;lt;逻辑表达式&amp;gt; &amp;hellip; &amp;lt;/ifnot&amp;gt;:如果test表达式值为假，执行&amp;lt;ifnot&amp;gt;标签内的代码&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;if test=&amp;lt;逻辑表达式&amp;gt; &amp;hellip; &amp;lt;/if&amp;gt;:如果test表达式值为假，执行&amp;lt;if&amp;gt;标签内的代码&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;l&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;建立解决方案的目录结构&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;target name="clean" depends="namecheck" description="移除旧目录,建立新目录"&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;!--删除旧的解决方案代码所在目录--&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;delete dir="${solution.basedir}" failonerror="false"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;!--重新建立目录--&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;mkdir dir="${solution.basedir}\" failonerror="false"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;mkdir dir="${solution.source}" failonerror="false"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;mkdir dir="${solution.build}" failonerror="false"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;mkdir dir="${solution.log}" failonerror="false"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/target&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;说明:delete和mkdir标签内的failonerror属性表示即使操作文件夹的过程中出现了错误，也忽略错误向下执行&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;l&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;获取源代码：&lt;/p&gt;&#xD;
&lt;p&gt;从VSS上获取解决方案&amp;lt;solution.name&amp;gt;的源代码&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;target name="getsourcecode"&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;!--检查从VSS上下载解决方案的路径是否设定--&amp;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;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;!--&amp;nbsp;如果不定义vss.projectpath,则缺省为solution.name&amp;nbsp;&amp;nbsp;--&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;ifnot test="${property::exists('vss.projectpath')}"&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;property name="vss.projectpath" value="${solution.name}"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/ifnot&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;vssget&lt;/p&gt;&#xD;
&lt;p&gt;user="${vss.username}"&lt;/p&gt;&#xD;
&lt;p&gt;password="${vss.password}"&lt;/p&gt;&#xD;
&lt;p&gt;localpath="${solution.source}"&lt;/p&gt;&#xD;
&lt;p&gt;recursive="true"&lt;/p&gt;&#xD;
&lt;p&gt;replace="true"&lt;/p&gt;&#xD;
&lt;p&gt;dbpath="${vss.dbpath}"&lt;/p&gt;&#xD;
&lt;p&gt;path="${vss.basepath}${vss.projectpath}"&lt;/p&gt;&#xD;
&lt;p&gt;/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/target&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;说明：&amp;lt;vssget&amp;gt;标签是NAntContrib的语法，用来从VSS源码管理器上下载源代码，user和password属性表示登录VSS服务器的信息；Localpath属性是指下载的源代码存放的路径；recursive="true"表示递归获取代码；replace="true"表示如果本地有重复文件，则进行覆盖；dbpath定义VSS的srcsafe.ini文件的路径信息，包括srcsafe.ini文件名；path定义了要获取的源代码在VSS数据库中的路径，一般都是以$/为根目录。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;3.4.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/strong&gt;&lt;strong&gt;编译源代码&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;l&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;编译命令&lt;/p&gt;&#xD;
&lt;p&gt;编译解决方案的命令为&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;solution&amp;nbsp;&amp;nbsp;solutionfile="&amp;hellip;" configuration="&amp;hellip;" outputdir="&amp;hellip;"&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;webmap&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;map url="&amp;hellip; " path="&amp;hellip;"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;map url="&amp;hellip; " path="&amp;hellip;"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/webmap&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/solution&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;其中solutionfile属性表明了要编译的解决方案文件的路径信息，即以"sln"为扩展名的文件，&lt;/p&gt;&#xD;
&lt;p&gt;configuration属性表明要编译的是发行版还是调试版，取值为"Release"或"Debug"&lt;/p&gt;&#xD;
&lt;p&gt;outputdir表明了编译后的动态链接库或可执行文件存放的目录&lt;/p&gt;&#xD;
&lt;p&gt;solution中的嵌套标签&amp;lt;webmap&amp;gt;用于当解决方案含有WEB项目的情况，有几个WEB项目，就有几项&amp;lt;map&amp;gt;标签，map标签中的url属性为WEB项目的*.csproj文件的WEB路径，path则为该*.csproj文件所在磁盘上的物理路径，例如，解决方案中有WEB项目exam，则map标签为&amp;nbsp;&amp;lt;map url="http://localhost/exam/exam.csproj" path="c:\exam\exam.csproj"&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;l&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;根据解决方案名称获取解决方案文件的路径信息&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;target name="build" description="编译解决方案"&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;!--&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;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;foreach item="File" property="filename"&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;in&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;items&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;include name="**\${solution.name}.sln"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/items&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/in&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;do&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;!--根据文件名设置解决方案的名称--&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;property name="solution.file" value="${filename}"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/do&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/foreach&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;说明：&amp;lt;foreach&amp;gt;标签是NAnt中处理循环的命令,item="File"说明foreach进行循环处理的对象是文件，&amp;lt;include&amp;gt;中的name变量表示要查找的文件信息，"**\"表示查找路径包括子目录。Foreach的属性property="&amp;lt;变量名&amp;gt;"表示查找到的文件路径信息保存在该变量中，可以在&amp;lt;do&amp;gt;标签中引用.foreach每查找到一项符合条件的Item，都会执行&amp;lt;do&amp;gt;标签中的代码，以上代码执行的结果就是查找到指定名称的解决方案文件，供后面编译代码使用&lt;/p&gt;&#xD;
&lt;p&gt;l&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;获取解决方案中WEB项目的路径信息&lt;/p&gt;&#xD;
&lt;p&gt;如果解决方案中含有WEB项目，则其编译命令和不含WEB项目的解决方案编译有所区别，所以要区别对待。如果解决方案含有多个WEB项目，则可以让用户将多个WEB项目的名称放在一个变量中，如solution.webprojects，以逗号或分号或空格做分隔符。然后将项目名称分别提取出来，根据Web项目的个数决定solution命令的形式，代码如下&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;!--将solution.webprojects中用",",";"或" "分隔的Web工程名提取出来，&lt;/p&gt;&#xD;
&lt;p&gt;分别设为webproject1,webproject2&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;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;if test="${property::exists('solution.webprojects')}"&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;foreach item="String" in="${solution.webprojects}" delim=";, " property="project"&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;if test="${property::exists('webproject1')}"&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;property name="webproject2" value="${project}"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/if&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;ifnot test="${property::exists('webproject1')}"&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;property name="webproject1" value="${project}"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/ifnot&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/foreach&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/if&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;以上代码中foreach标签的属性item="String" in="${solution.webprojects}" delim=";, " property="project"表明循环对象是字符串，对in所代表的字符串&lt;/p&gt;&#xD;
&lt;p&gt;如果设定solution.webprojects="webprj1;webprj2&amp;rdquo;，则以上代码执行的结果是定义了两个变量webproject1 ="webproj1"和webproject2 ="webproj2"&lt;/p&gt;&#xD;
&lt;p&gt;l&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;查找WEB工程名&lt;/p&gt;&#xD;
&lt;p&gt;根据前面从solution.webprojects中提取出来的webproj1和webproj2变量，查找该WEB工程的文件名&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;!--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;查找WEB工程文件名&amp;nbsp;--&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;if test="${property::exists('webproject1')}"&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;echo message="test ${webproject1}" /&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;foreach item="File" property="filename"&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;in&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;items&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;include name="**\${webproject1}.csproj"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/items&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/in&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;do&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;!--根据Web项目的名称获取Web项目文件路径,可以处理两个Web项目的情况--&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;echo message="WebProject file=${filename}"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;property name="webproject1.file" value="${filename}"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/do&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/foreach&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/if&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;同理可以处理存在第二个WEB工程项目的情况，设置webproject2.file变量&lt;/p&gt;&#xD;
&lt;p&gt;l&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;编译解决方案&lt;/p&gt;&#xD;
&lt;p&gt;最后是编译解决方案，分别根据无WEB项目，有2个WEB项目，有一个WEB项目的三种情况处理&lt;/p&gt;&#xD;
&lt;p&gt;下面仅列出有两个WEB项目的情况&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;!--&amp;nbsp;存在2个Web工程&amp;nbsp;--&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;if test="${property::exists('webproject2')}"&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;solution&lt;/p&gt;&#xD;
&lt;p&gt;solutionfile="${solution.file}"&lt;/p&gt;&#xD;
&lt;p&gt;configuration="${build.configuration}"&lt;/p&gt;&#xD;
&lt;p&gt;outputdir="${solution.build}"&lt;/p&gt;&#xD;
&lt;p&gt;&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;webmap&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;map&lt;/p&gt;&#xD;
&lt;p&gt;url="http://localhost/${webproject1}/${webproject1}.csproj"&lt;/p&gt;&#xD;
&lt;p&gt;path="${webproject1.file}"&lt;/p&gt;&#xD;
&lt;p&gt;/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;map&lt;/p&gt;&#xD;
&lt;p&gt;url="http://localhost/${webproject2}/${webproject2}.csproj"&lt;/p&gt;&#xD;
&lt;p&gt;path="${webproject2.file}"&lt;/p&gt;&#xD;
&lt;p&gt;/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/webmap&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/solution&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/if&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;3.5.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/strong&gt;&lt;strong&gt;运行测试代码&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;l&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;测试命令&lt;/p&gt;&#xD;
&lt;p&gt;NAnt中关于测试的命令是&amp;lt;NUnit2&amp;gt;标签&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;nunit2&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;formatter type="Xml" usefile="true"&lt;/p&gt;&#xD;
&lt;p&gt;extension=".xml" outputdir="&amp;hellip;"&lt;/p&gt;&#xD;
&lt;p&gt;/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;test assemblyname="&amp;hellip;" haltonfailure="false" /&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/nunit2&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;说明：&amp;lt;formatter&amp;gt;标签中，type="Xml"表明了根据测试结果生成XML结构化信息，usefile="true"表明使用文件保存测试结果，extension=".xml"表明生成的文件扩展名为xml，outputdir指出了文件将被保存到哪个目录&lt;/p&gt;&#xD;
&lt;p&gt;Test标签中的assemblyname表明了被测试的dll程序集的路径信息，haltonfailure="false"表明即使测试没有通过仍然继续执行脚本文件&lt;/p&gt;&#xD;
&lt;p&gt;这样在测试命令完成后，会在outputdir指出的目录下生成一个XML形式的报告文件，为了增加测试结果的可读性，可以使用另一个工具NUnit2Report，将测试结果转换为直观的HTML文件。具体命令如下&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;nunit2report out="&amp;lt;文件名&amp;gt;" todir="&amp;lt;输出目录" &amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;fileset&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;includes name="&amp;lt;文件匹配符&amp;gt;" /&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/fileset&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/nunit2report&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;说明：includes标签用来搜索符合条件的XML文件，转换出来的HTML文件保存为out指出的文件名，todir指出了HTML文件将保存的目录信息&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;if test="${property::exists('solution.testprojects')}"&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;foreach item="String" in="${solution.testprojects}" delim=";, " property="project"&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;property name="testfile" value="${solution.build}\${project}.dll"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;nunit2&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;formatter type="Xml" usefile="true"&lt;/p&gt;&#xD;
&lt;p&gt;extension=".xml" outputdir="${solution.build}" /&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;test assemblyname="${testfile}" haltonfailure="false" /&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/nunit2&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;nunit2report out="${project}.html" todir="${solution.log}" &amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;fileset&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;includes name="${solution.build}\*.xml" /&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/fileset&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/nunit2report&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/foreach&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/if&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;3.6.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/strong&gt;&lt;strong&gt;进行&lt;/strong&gt;&lt;strong&gt;WEB发布&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;WEB发布主要针对有WEB工程项目的解决方案，其实现原理为利用NAnt的拷贝命令，将WEB工程下除了源代码，资源代码，VSS信息文件外的其他文件和编译后的程序集拷贝到发布目录，最后设置WEB虚拟路径以供WEB访问的过程。&lt;/p&gt;&#xD;
&lt;p&gt;设置WEB虚拟路径的命令为&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;mkiisdir dirpath="&amp;lt;物理路径&amp;gt;" vdirname="&amp;lt;虚拟路径&amp;gt;"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;说明:设WEB项目发布在C:\Intepub\wwwroot\Exam，访问该WEB项目用地址http://127.0.0.1/Example/default.aspx，则&amp;lt;物理路径&amp;gt;为"C:\Intepub\wwwroot\Exam"，虚拟路径为"Example"（此处略去详细代码）。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://files.cnblogs.com/dragon/DailyBuild.rar"&gt;下载示例代码&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;引用自 ：&lt;a href="http://dragon.cnblogs.com/archive/2005/07/29/203189.html"&gt;http://dragon.cnblogs.com/archive/2005/07/29/203189.html&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/zhangchenliang/aggbug/2345138.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhangchenliang/archive/2012/02/10/2345138.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhangchenliang/archive/2012/02/07/2341387.html</id><title type="text">Private Protect Partial Internal Public 区别</title><summary type="text">摘自：MSDNThe situation is similar to personal secrets (shared only with friends), family secrets (shared with friends and children), and nonsecrets (shared with anybody), respectively.A Partial:It is possible to split the definition of a class or a struct, or an interface over two or more source files</summary><published>2012-02-07T05:40:00Z</published><updated>2012-02-07T05:40:00Z</updated><author><name>独孤伤</name><uri>http://www.cnblogs.com/zhangchenliang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhangchenliang/archive/2012/02/07/2341387.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhangchenliang/archive/2012/02/07/2341387.html"/><content type="html">&lt;p&gt;摘自：MSDN&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;The situation is similar to personal secrets (shared only with friends), family secrets (shared with friends and children), and nonsecrets (shared with anybody), respectively.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;A Partial:It is possible to split the definition of a class or a struct, or an interface over two or more source files. Each source file contains a section of the class definition, and all parts are combined when the application is compiled.&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;please see the following example code:&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; public partial class CoOrds&lt;br /&gt;&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; private int x;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; private int y;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public CoOrds(int x, int y)&lt;br /&gt;&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;this.x = x;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.y = y;&lt;br /&gt;&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;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public partial class CoOrds&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; public void PrintCoOrds()&lt;br /&gt;&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;System.Console.WriteLine("CoOrds: {0},{1}", x, y);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;class TestCoOrds&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; static void Main()&lt;br /&gt;&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;CoOrds myCoOrds = new CoOrds(10, 15);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; myCoOrds.PrintCoOrds();&lt;br /&gt;&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;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;strong&gt;A private: member of a class is accessible only by members and friends of the class.&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;See the following example code:&lt;br /&gt;&lt;br /&gt;using System;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;class Employee&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; private string name = "FirstName, LastName";&lt;br /&gt;&amp;nbsp; &amp;nbsp; private double salary = 100.0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; public string GetName()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return name;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; public double Salary&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; get { return salary; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class MainClass&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; static void Main()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Employee e = new Employee();&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // The data members are inaccessible (private), so&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // then can't be accessed like this:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // &amp;nbsp; &amp;nbsp;string n = e.name;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // &amp;nbsp; &amp;nbsp;double s = e.salary;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 'name' is indirectly accessed via method:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; string n = e.GetName();&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 'salary' is indirectly accessed via property&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; double s = e.Salary;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;strong&gt;A protected: member of a class is accessible by members and friends of the class and by members and friends of derived classes, provided they access the base member via a pointer or a reference to their own derived class.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;please see the following example code:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;using System;&lt;br /&gt;class A&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; protected int x = 123;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class B : A&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; static void Main()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; A a = new A();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; B b = new B();&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Error CS1540, because x can only be accessed by&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // classes derived from A.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // a.x = 10;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // OK, because this class derives from A.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; b.x = 10; &amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&amp;nbsp;&lt;strong&gt;&amp;nbsp;A public: member of a class is accessible by everyone.&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;See the following example code:&lt;br /&gt;using System;&lt;br /&gt;class Point&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; public int x;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; public int y;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class MainClass&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; static void Main()&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Point p = new Point();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Direct access to public members:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; p.x = 10;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; p.y = 15;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Console.WriteLine("x = {0}, y = {1}", p.x, p.y);&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&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;strong&gt;A Property: Member is a generic term that refers to a field, property, or method of a class. A field is a variable, a property is a bit of data, and a method is a function/subroutine. For example:&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;public class BankAccount&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; private int _balance;&lt;br /&gt;&amp;nbsp; &amp;nbsp; public int Balance&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; get { return _balance; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; set { _balance = value; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; public void Deposit(int depositAmount)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // I can reference _balance here because I'm inside the class that defined it&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; _balance = _balance + depositAmount;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;The above C# code represents a class. _balance (field), Balance (property), and Deposit (method) are all "members" of the class.&lt;br /&gt;Think of a class as a blueprint. A blueprint isn't a house, it's the definition of what the house will look like when you build it. You "build" an object from a class by "new"ing it.&lt;br /&gt;&lt;br /&gt;public class Bank&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; public void Main()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // ba represents an object created from the class BankAccount&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; BankAccount ba = new BankAccount();&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // This won't compile because _balance is private so it is not accessible outside the class&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ba._balance = 10;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // This works fine because Balance is public, so it is accessible from this code that&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // exists outside of the class definition for BankAccount&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ba.Balance = 10;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;/p&gt;&lt;img src="http://www.cnblogs.com/zhangchenliang/aggbug/2341387.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhangchenliang/archive/2012/02/07/2341387.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhangchenliang/archive/2012/02/02/2335430.html</id><title type="text">asp.net夜话之十一：web.config详解</title><summary type="text">在开发中经常会遇到这样的情况，在部署程序时为了保密起见并不将源代码随项目一同发布，而我们开发时的环境与部署环境可能不一致（比如数据库不一样），如果在代码中保存这些配置这些信息部署时需要到用户那里更改代码再重新编译，这种部署方式非常麻烦。在.net中提供了一种便捷的保存项目配置信息的办法，那就是利用配置文件，配置文件的文件后缀一般是.config，在asp.net中配置文件名一般默认是web.config。每个web.config文件都是基于XML的文本文件，并且可以保存到Web应用程序中的任何目录中。在发布Web应用程序时web.config文件并不编译进dll文件中。如果将来客户端发生了变化</summary><published>2012-02-02T02:38:00Z</published><updated>2012-02-02T02:38:00Z</updated><author><name>独孤伤</name><uri>http://www.cnblogs.com/zhangchenliang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhangchenliang/archive/2012/02/02/2335430.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhangchenliang/archive/2012/02/02/2335430.html"/><content type="html">&lt;p&gt;在开发中经常会遇到这样的情况，在部署程序时为了保密起见并不将源代码随项目一同发布，而我们开发时的环境与部署环境可能不一致（比如数据库不一样），如果在代码中保存这些配置这些信息部署时需要到用户那里更改代码再重新编译，这种部署方式非常麻烦。&lt;br /&gt;在.net中提供了一种便捷的保存项目配置信息的办法，那就是利用配置文件，配置文件的文件后缀一般是.config，在asp.net中配置文件名一般默认是web.config。每个web.config文件都是基于XML的文本文件，并且可以保存到Web应用程序中的任何目录中。在发布Web应用程序时web.config文件并不编译进dll文件中。如果将来客户端发生了变化，仅仅需要用记事本打开web.config文件编辑相关设置就可以重新正常使用，非常方便。&lt;br /&gt;本篇要讲述的知识如下：&lt;br /&gt;配置文件的查找优先级&lt;/p&gt;&#xD;
&lt;p&gt;配置文件节点说明&lt;br /&gt;配置文件的操作&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;配置文件的查找优先级&lt;br /&gt;&lt;/strong&gt;在.net提供了一个针对当前机器的配置文件，这个文件是machine.config，它位于%windir%/Microsoft.NET/Framework/v2.0.50727/CONFIG/文件下（%windir%是系统分区下的系统目录，在命令行模式下输入%windir%然后回车就能查看当前机器的系统目录，在Windows2003及WindowsXP中%windir%是系统分区下的windows目录，在Windows2000中%windir%是系统分区下的WinNT目录，在笔者机器上这个系统目录是C:/WINDOWS）。这个文件里面定义了针对当前机器的WinForm程序和asp.net应用程序的配置。下面是machine.config文件的内容：&lt;br /&gt;&lt;img src="http://p.blog.csdn.net/images/p_blog_csdn_net/zhoufoxcn/EntryImages/20081110/asp.net_night1101.jpg" alt="" width="970" height="552" /&gt;&amp;nbsp;&lt;br /&gt;在这个文件夹下还有一个web.config文件，这个文件包含了asp.net网站的常用配置。下面是这个web.config文件的内容：&lt;br /&gt;&lt;img src="http://p.blog.csdn.net/images/p_blog_csdn_net/zhoufoxcn/EntryImages/20081110/asp.net_night1102.jpg" alt="" width="970" height="554" /&gt;&amp;nbsp;&lt;br /&gt;asp.net网站IIS启动的时候会加载配置文件中的配置信息，然后缓存这些信息，这样就不必每次去读取配置信息。在运行过程中asp.net应用程序会监视配置文件的变化情况，一旦编辑了这些配置信息，就会重新读取这些配置信息并缓存。&lt;br /&gt;当我们要读取某个节点或者节点组信息时，是按照如下方式搜索的：&lt;br /&gt;(1)如果在当前页面所在目录下存在web.config文件，查看是否存在所要查找的结点名称，如果存在返回结果并停止查找。&lt;br /&gt;(2)如果当前页面所在目录下不存在web.config文件或者web.config文件中不存在该结点名，则查找它的上级目录，直到网站的根目录。&lt;br /&gt;(3)如果网站根目录下不存在web.config文件或者web.config文件中不存在该节点名则在%windir%/Microsoft.NET/Framework/v2.0.50727/CONFIG/web.config文件中查找。&lt;br /&gt;(4)如果在%windir%/Microsoft.NET/Framework/v2.0.50727/CONFIG/web.config文件中不存在相应结点，则在%windir%/Microsoft.NET/Framework/v2.0.50727/CONFIG/machine.config文件中查找。&lt;br /&gt;(5)如果仍然没有找到则返回null。&lt;br /&gt;所以如果我们对某个网站或者某个文件夹有特定要求的配置，可以在相应的文件夹下创建一个web.config文件，覆盖掉上级文件夹中的web.config文件中的同名配置即可。这些配置信息的寻找只查找一次，以后便被缓存起来供后来的调用。在asp.net应用程序运行过程中，如果web.config文件发生更改就会导致相应的应用程序重新启动，这时存储在服务器内存中的用户会话信息就会丢失（如存储在内存中的Session）。一些软件（如杀毒软件）每次完成对web.config的访问时就会修改web.config的访问时间属性，也会导致asp.net应用程序的重启。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;配置文件节点说明&lt;/strong&gt;&lt;br /&gt;web.config文件是一个XML文件，它的根结点是&amp;lt;configuration&amp;gt;，在&amp;lt;configuration&amp;gt;节点下的常见子节点有：&amp;lt;configSections&amp;gt;、&amp;lt;appSettings&amp;gt;、&amp;lt;connectionStrings&amp;gt;和&amp;lt;system.web&amp;gt;。其中&amp;lt;appSettings&amp;gt;节点主要用于配置一些网站的应用配置信息，而&amp;lt;connectionStrings&amp;gt;节点主要用于配置网站的数据库连接字符串信息。&lt;br /&gt;&amp;lt;system.web&amp;gt;节点主要是网站运行时的一些配置，它的常见节点有如下：&lt;br /&gt;&lt;strong&gt;&amp;lt;appSettings&amp;gt;节点&lt;br /&gt;&lt;/strong&gt;&amp;lt;appSettings&amp;gt;节点主要用来存储asp.net应用程序的一些配置信息，比如上传文件的保存路径等，以下是一个例子：&lt;/p&gt;&#xD;
&lt;div &gt;&lt;ol &gt;&#xD;
&lt;li&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;appSettings&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;!--允许上传的图片格式类型--&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;key&lt;/span&gt;=&lt;span &gt;"ImageType"&lt;/span&gt;&amp;nbsp;&lt;span &gt;value&lt;/span&gt;=&lt;span &gt;".jpg;.bmp;.gif;.png;.jpeg"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;!--允许上传的文件类型--&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;key&lt;/span&gt;=&lt;span &gt;"FileType"&lt;/span&gt;&amp;nbsp;&lt;span &gt;value&lt;/span&gt;=&lt;span &gt;".jpg;.bmp;.gif;.png;.jpeg;.pdf;.zip;.rar;.xls;.doc"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;appSettings&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&lt;/div&gt;&#xD;
&lt;p&gt;对于&amp;lt;appSettings&amp;gt;节点中的值可以按照key来进行访问，以下就是一个读取key值为&amp;ldquo;FileType&amp;rdquo;节点值的例子：&lt;/p&gt;&#xD;
&lt;div &gt;&lt;ol &gt;&#xD;
&lt;li&gt;&lt;span &gt;string&lt;/span&gt;&amp;nbsp;fileType=ConfigurationManager.AppSettings[&lt;span &gt;"FileType&amp;nbsp;"&lt;/span&gt;];&lt;/li&gt;&#xD;
&lt;/ol&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;lt;connectionStrings&amp;gt;节点&lt;br /&gt;&lt;/strong&gt;&amp;lt;connectionStrings&amp;gt;节点主要用于配置数据库连接的，我们可以&amp;lt;connectionStrings&amp;gt;节点中增加任意个节点来保存数据库连接字符串，将来在代码中通过代码的方式动态获取节点的值来实例化数据库连接对象，这样一旦部署的时候数据库连接信息发生变化我们仅需要更改此处的配置即可，而不必因为数据库连接信息的变化而需要改动程序代码和重新部署。&lt;br /&gt;以下就是一个&amp;lt;connectionStrings&amp;gt;节点配置的例子：&lt;/p&gt;&#xD;
&lt;div &gt;&lt;ol &gt;&#xD;
&lt;li&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;connectionStrings&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;!--SQL&amp;nbsp;Server数据库配置--&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;name&lt;/span&gt;=&lt;span &gt;"AspNetStudyConnectionString1"&lt;/span&gt;&amp;nbsp;&lt;span &gt;connectionString&lt;/span&gt;=&lt;span &gt;"Data&amp;nbsp;Source=(local);Initial&amp;nbsp;Catalog=AspNetStudy;User&amp;nbsp;ID=sa;Password=sa"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;connectionStrings&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&lt;/div&gt;&#xD;
&lt;p&gt;在代码中我们可以这么实例化数据库连接对象：&lt;/p&gt;&#xD;
&lt;div &gt;&lt;ol &gt;&#xD;
&lt;li&gt;&lt;span &gt;//读取web.config节点配置&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span &gt;string&lt;/span&gt;&amp;nbsp;connectionString&amp;nbsp;=&amp;nbsp;ConfigurationManager.ConnectionStrings[&lt;span &gt;"AspNetStudyConnectionString1"&lt;/span&gt;].ConnectionString;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span &gt;//实例化SqlConnection对象&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;SqlConnection&amp;nbsp;connection&amp;nbsp;=&amp;nbsp;&lt;span &gt;new&lt;/span&gt;&amp;nbsp;SqlConnection(connectionString);&lt;/li&gt;&#xD;
&lt;/ol&gt;&lt;/div&gt;&#xD;
&lt;p&gt;这样做的好处是一旦开发时所用的数据库和部署时的数据库不一致，仅仅需要用记事本之类的文本编辑工具编辑connectionString属性的值就行了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;lt;compilation&amp;gt;节点&lt;/strong&gt;&lt;br /&gt;&amp;lt;compilation&amp;gt;节点配置 ASP.NET 使用的所有编译设置。默认的debug属性为&amp;ldquo;true&amp;rdquo;，即允许调试，在这种情况下会影响网站的性能，所以在程序编译完成交付使用之后应将其设为&amp;ldquo;false&amp;rdquo;。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;lt;authentication&amp;gt;节点&lt;/strong&gt;&lt;br /&gt;设置asp.net身份验证模式，有四种身份验证模式，它们的值分别如下：&lt;br /&gt;Mode&amp;nbsp;说明&lt;br /&gt;Windows&amp;nbsp;使用Windows身份验证，适用于域用户或者局域网用户。&lt;br /&gt;Forms&amp;nbsp;使用表单验证，依靠网站开发人员进行身份验证。&lt;br /&gt;Passport&amp;nbsp;使用微软提供的身份验证服务进行身份验证。&lt;br /&gt;None&amp;nbsp;不进行任何身份验证。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;lt;authentication&amp;gt;节点&lt;br /&gt;&lt;/strong&gt;&amp;lt;authentication&amp;gt;节点控制用户对网站、目录或者单独页的访问，必须配合&amp;lt;authentication&amp;gt;节点一起使用。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;lt;customErrors&amp;gt;节点&lt;br /&gt;&lt;/strong&gt;&amp;lt;customErrors&amp;gt;节点用于定义一些自定义错误信息的信息。此节点有Mode和defaultRedirect两个属性，其中defaultRedirect属性是一个可选属性，表示应用程序发生错误时重定向到的默认URL，如果没有指定该属性则显示一般性错误。Mode属性是一个必选属性，它有三个可能值，它们所代表的意义分别如下：&lt;br /&gt;Mode&amp;nbsp;说明&lt;br /&gt;On&amp;nbsp;表示在本地和远程用户都会看到自定义错误信息。&lt;br /&gt;Off&amp;nbsp;禁用自定义错误信息，本地和远程用户都会看到详细的错误信息。&lt;br /&gt;RemoteOnly&amp;nbsp;表示本地用户将看到详细错误信息，而远程用户将会看到自定义错误信息。&lt;br /&gt;这里有必要说明一下本地用户和远程用户的概念。当我们访问asp.net应用程时所使用的机器和发布asp.net应用程序所使用的机器为同一台机器时成为本地用户，反之则称之为远程用户。在开发调试阶段为了便于查找错误Mode属性建议设置为Off，而在部署阶段应将Mode属性设置为On或者RemoteOnly，以避免这些详细的错误信息暴露了程序代码细节从而引来黑客的入侵。&lt;br /&gt;下面我们添加一个页面CustomErrorsDemo.aspx，在它的Page_Load事件里抛出一个异常，代码如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;div &gt;&lt;ol &gt;&#xD;
&lt;li&gt;&lt;span &gt;using&lt;/span&gt;&amp;nbsp;System;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span &gt;using&lt;/span&gt;&amp;nbsp;System.Data;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span &gt;using&lt;/span&gt;&amp;nbsp;System.Configuration;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span &gt;using&lt;/span&gt;&amp;nbsp;System.Collections;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span &gt;using&lt;/span&gt;&amp;nbsp;System.Web;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span &gt;using&lt;/span&gt;&amp;nbsp;System.Web.Security;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span &gt;using&lt;/span&gt;&amp;nbsp;System.Web.UI;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span &gt;using&lt;/span&gt;&amp;nbsp;System.Web.UI.WebControls;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span &gt;using&lt;/span&gt;&amp;nbsp;System.Web.UI.WebControls.WebParts;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span &gt;using&lt;/span&gt;&amp;nbsp;System.Web.UI.HtmlControls;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span &gt;public&lt;/span&gt;&amp;nbsp;partial&amp;nbsp;&lt;span &gt;class&lt;/span&gt;&amp;nbsp;CustomErrorsDemo&amp;nbsp;:&amp;nbsp;System.Web.UI.Page&lt;/li&gt;&#xD;
&lt;li&gt;{&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;protected&lt;/span&gt;&amp;nbsp;&lt;span &gt;void&lt;/span&gt;&amp;nbsp;Page_Load(&lt;span &gt;object&lt;/span&gt;&amp;nbsp;sender,&amp;nbsp;EventArgs&amp;nbsp;e)&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;throw&lt;/span&gt;&amp;nbsp;&lt;span &gt;new&lt;/span&gt;&amp;nbsp;Exception(&lt;span &gt;"故意抛出的异常。"&lt;/span&gt;);&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&#xD;
&lt;li &gt;}&lt;/li&gt;&#xD;
&lt;/ol&gt;&lt;/div&gt;&#xD;
&lt;p&gt;我们先配置&amp;lt;customErrors&amp;gt;如下：&lt;/p&gt;&#xD;
&lt;div &gt;&lt;ol &gt;&#xD;
&lt;li&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;customErrors&lt;/span&gt;&amp;nbsp;&lt;span &gt;mode&lt;/span&gt;=&lt;span &gt;"RemoteOnly"&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;error&lt;/span&gt;&amp;nbsp;&lt;span &gt;statusCode&lt;/span&gt;=&lt;span &gt;"403"&lt;/span&gt;&amp;nbsp;&lt;span &gt;redirect&lt;/span&gt;=&lt;span &gt;"NoAccess.htm"&lt;/span&gt;&amp;nbsp;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;error&lt;/span&gt;&amp;nbsp;&lt;span &gt;statusCode&lt;/span&gt;=&lt;span &gt;"404"&lt;/span&gt;&amp;nbsp;&lt;span &gt;redirect&lt;/span&gt;=&lt;span &gt;"FileNotFound.htm"&lt;/span&gt;&amp;nbsp;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;customErrors&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&lt;/div&gt;&#xD;
&lt;p&gt;这时本地运行CustomErrorsDemo.aspx的效果如下：&lt;br /&gt;&lt;img src="http://p.blog.csdn.net/images/p_blog_csdn_net/zhoufoxcn/EntryImages/20081110/asp.net_night1103.jpg" alt="" width="731" height="464" /&gt;&amp;nbsp;&lt;br /&gt;远程访问时看到的效果：&lt;br /&gt;&lt;img src="http://p.blog.csdn.net/images/p_blog_csdn_net/zhoufoxcn/EntryImages/20081110/asp.net_night1104.jpg" alt="" width="605" height="451" /&gt;&amp;nbsp;&lt;br /&gt;如果我们将customErrors的Mode属性设置为&amp;ldquo;On&amp;rdquo;本地运行和远程访问都会看到如下效果：&lt;br /&gt;&lt;img src="http://p.blog.csdn.net/images/p_blog_csdn_net/zhoufoxcn/EntryImages/20081110/asp.net_night1105.jpg" alt="" width="722" height="462" /&gt;&amp;nbsp;&lt;br /&gt;如果将customErrors的Mode属性设置为&amp;ldquo;Off&amp;rdquo;本地运行和远程访问都会看到如下效果：&lt;br /&gt;&lt;img src="http://p.blog.csdn.net/images/p_blog_csdn_net/zhoufoxcn/EntryImages/20081110/asp.net_night1105.jpg" alt="" width="722" height="462" /&gt;&amp;nbsp;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;lt;error&amp;gt;子节点&lt;/strong&gt;&lt;br /&gt;在&amp;lt;customErrors&amp;gt;节点下还包含有&amp;lt;error&amp;gt;子节点，这个节点主要是根据服务器的HTTP错误状态代码而重定向到我们自定义的错误页面，注意要使&amp;lt;error&amp;gt;子节点下的配置生效，必须将&amp;lt;customErrors&amp;gt;节点节点的Mode属性设置为&amp;ldquo;On&amp;rdquo;。下面是一个例子：&lt;/p&gt;&#xD;
&lt;div &gt;&lt;ol &gt;&#xD;
&lt;li&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;customErrors&lt;/span&gt;&amp;nbsp;&lt;span &gt;mode&lt;/span&gt;=&lt;span &gt;"On"&lt;/span&gt;&amp;nbsp;&lt;span &gt;defaultRedirect&lt;/span&gt;=&lt;span &gt;"GenericErrorPage.htm"&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;error&lt;/span&gt;&amp;nbsp;&lt;span &gt;statusCode&lt;/span&gt;=&lt;span &gt;"403"&lt;/span&gt;&amp;nbsp;&lt;span &gt;redirect&lt;/span&gt;=&lt;span &gt;"403.htm"&lt;/span&gt;&amp;nbsp;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;error&lt;/span&gt;&amp;nbsp;&lt;span &gt;statusCode&lt;/span&gt;=&lt;span &gt;"404"&lt;/span&gt;&amp;nbsp;&lt;span &gt;redirect&lt;/span&gt;=&lt;span &gt;"404.htm"&lt;/span&gt;&amp;nbsp;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;customErrors&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;br /&gt;在上面的配置中如果用户访问的页面不存在就会跳转到404.htm页面，如果用户没有权限访问请求的页面则会跳转到403.htm页面，403.htm和404.htm页面都是我们自己添加的页面，我们可以在页面中给出友好的错误提示。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;lt;httpHandlers&amp;gt;节点&lt;br /&gt;&lt;/strong&gt;&amp;lt;httpHandlers&amp;gt;节点用于根据用户请求的URL和HTTP谓词将用户的请求交给相应的处理程序。可以在配置级别的任何层次配置此节点，也就是说可以针对某个特定目录下指定的特殊文件进行特殊处理。&lt;/p&gt;&#xD;
&lt;p&gt;下面是与machine.config文件同一目录下的web.config文件中的&amp;lt;httpHandlers&amp;gt;节点配置：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;div &gt;&lt;ol &gt;&#xD;
&lt;li&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;httpHandlers&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.rules"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.HttpForbiddenHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.xoml"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.ServiceModel.Activation.HttpHandler,&amp;nbsp;System.ServiceModel,&amp;nbsp;Version=3.0.0.0,&amp;nbsp;Culture=neutral,&amp;nbsp;PublicKeyToken=b77a5c561934e089"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"false"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"trace.axd"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.Handlers.TraceHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"WebResource.axd"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"GET"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.Handlers.AssemblyResourceLoader"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.axd"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.HttpNotFoundHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.aspx"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.UI.PageHandlerFactory"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.ashx"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.UI.SimpleHandlerFactory"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.asmx"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.Services.Protocols.WebServiceHandlerFactory,&amp;nbsp;System.Web.Services,&amp;nbsp;Version=2.0.0.0,&amp;nbsp;Culture=neutral,&amp;nbsp;PublicKeyToken=b03f5f7f11d50a3a"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"false"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.rem"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory,&amp;nbsp;System.Runtime.Remoting,&amp;nbsp;Version=2.0.0.0,&amp;nbsp;Culture=neutral,&amp;nbsp;PublicKeyToken=b77a5c561934e089"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"false"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.soap"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory,&amp;nbsp;System.Runtime.Remoting,&amp;nbsp;Version=2.0.0.0,&amp;nbsp;Culture=neutral,&amp;nbsp;PublicKeyToken=b77a5c561934e089"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"false"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.asax"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.HttpForbiddenHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.ascx"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.HttpForbiddenHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.master"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.HttpForbiddenHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.skin"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.HttpForbiddenHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.browser"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.HttpForbiddenHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.sitemap"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.HttpForbiddenHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.dll.config"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"GET,HEAD"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.StaticFileHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.exe.config"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"GET,HEAD"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.StaticFileHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.config"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.HttpForbiddenHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.cs"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.HttpForbiddenHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.csproj"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.HttpForbiddenHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.vb"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.HttpForbiddenHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.vbproj"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.HttpForbiddenHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.webinfo"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.HttpForbiddenHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.licx"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.HttpForbiddenHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.resx"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.HttpForbiddenHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.resources"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.HttpForbiddenHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.mdb"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.HttpForbiddenHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.vjsproj"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.HttpForbiddenHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.java"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.HttpForbiddenHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.jsl"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.HttpForbiddenHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.ldb"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.HttpForbiddenHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.ad"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.HttpForbiddenHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.dd"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.HttpForbiddenHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.ldd"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.HttpForbiddenHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.sd"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.HttpForbiddenHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.cd"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.HttpForbiddenHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.adprototype"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.HttpForbiddenHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.lddprototype"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.HttpForbiddenHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.sdm"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.HttpForbiddenHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.sdmDocument"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.HttpForbiddenHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.mdf"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.HttpForbiddenHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.ldf"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.HttpForbiddenHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.exclude"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.HttpForbiddenHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.refresh"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.HttpForbiddenHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*.svc"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.ServiceModel.Activation.HttpHandler,&amp;nbsp;System.ServiceModel,&amp;nbsp;Version=3.0.0.0,&amp;nbsp;Culture=neutral,&amp;nbsp;PublicKeyToken=b77a5c561934e089"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"false"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"GET,HEAD,POST"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.DefaultHttpHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&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;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;path&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;verb&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;type&lt;/span&gt;=&lt;span &gt;"System.Web.HttpMethodNotAllowedHandler"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validate&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;httpHandlers&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&lt;/div&gt;&#xD;
&lt;p&gt;从上面的配置中可以看出，针对*.mdf、*.ldf文件的Get或者Post请求都会交给System.Web.HttpForbiddenHandler来处理，处理的结果就是用户不能查看或者下载相关的文件。如果我们某个文件夹下的文件或者某个类型的文件不允许用户下载，可以在&amp;lt;/httpHandlers&amp;gt;节点中增加相应的子节点。&lt;br /&gt;下面我们以一个例子来说明&amp;lt;httpHandlers&amp;gt;节点的用法，在我们的asp.net应用程序中建立一个IPData目录，在IPData目录中创建一个IPData.txt文件，然后在Web.config中添加以下配置：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&lt;ol &gt;&#xD;
&lt;li&gt;&amp;lt;httpHandlers&amp;gt;&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;add&amp;nbsp;path=&lt;span &gt;"IPData/*.txt"&lt;/span&gt;&amp;nbsp;verb=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;type=&lt;span &gt;"System.Web.HttpForbiddenHandler"&lt;/span&gt;/&amp;gt;&lt;/li&gt;&#xD;
&lt;li&gt;&amp;lt;/httpHandlers&amp;gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&lt;/div&gt;&#xD;
&lt;p&gt;上面的代码的作用是禁止访问IPData目录下的任何txt文件。&lt;br /&gt;然后新建一个页面，在页面中添加一个超级链接，链接到该目录下IPData.txt文件，代码如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;div &gt;&lt;ol &gt;&#xD;
&lt;li&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;%@&amp;nbsp;Page&amp;nbsp;&lt;span &gt;Language&lt;/span&gt;=&lt;span &gt;"C#"&lt;/span&gt;&amp;nbsp;&lt;span &gt;AutoEventWireup&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&amp;nbsp;&lt;span &gt;CodeFile&lt;/span&gt;=&lt;span &gt;"HttpHandlersDemo.aspx.cs"&lt;/span&gt;&amp;nbsp;&lt;span &gt;Inherits&lt;/span&gt;=&lt;span &gt;"HttpHandlersDemo"&lt;/span&gt;&amp;nbsp;%&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span &gt;&amp;lt;!DOCTYPE&amp;nbsp;html&amp;nbsp;PUBLIC&amp;nbsp;"-//W3C//DTD&amp;nbsp;XHTML&amp;nbsp;1.0&amp;nbsp;Transitional//EN"&amp;nbsp;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;html&lt;/span&gt;&amp;nbsp;&lt;span &gt;xmlns&lt;/span&gt;=&lt;span &gt;"http://www.w3.org/1999/xhtml"&lt;/span&gt;&amp;nbsp;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;head&lt;/span&gt;&amp;nbsp;&lt;span &gt;runat&lt;/span&gt;=&lt;span &gt;"server"&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;title&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;httpHandlers节点的例子&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;title&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;head&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;body&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;form&lt;/span&gt;&amp;nbsp;&lt;span &gt;id&lt;/span&gt;=&lt;span &gt;"form1"&lt;/span&gt;&amp;nbsp;&lt;span &gt;runat&lt;/span&gt;=&lt;span &gt;"server"&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;div&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;a&lt;/span&gt;&amp;nbsp;&lt;span &gt;href&lt;/span&gt;=&lt;span &gt;"IPData/IPData.txt"&lt;/span&gt;&amp;nbsp;&lt;span &gt;title&lt;/span&gt;=&lt;span &gt;"打开IPData/IPData.txt"&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;打开IPData/IPData.txt&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;a&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;div&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;form&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;body&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;html&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&lt;/div&gt;&#xD;
&lt;p&gt;运行这个页面的效果如下：&lt;br /&gt;&lt;img src="http://p.blog.csdn.net/images/p_blog_csdn_net/zhoufoxcn/EntryImages/20081110/asp.net_night1106.jpg" alt="" width="428" height="156" /&gt;&amp;nbsp;&lt;br /&gt;当前web.config文件的&amp;lt;customErrors&amp;gt;节点配置如下：&lt;br /&gt;&amp;lt;customErrors mode="On" defaultRedirect="GenericErrorPage.htm"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;error statusCode="403" redirect="403.htm" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;error statusCode="404" redirect="404.htm" /&amp;gt;&lt;br /&gt;&amp;lt;/customErrors&amp;gt;&lt;br /&gt;如果存在403.htm和404.htm页面，点击超级链接之后会出现如下效果：&lt;br /&gt;&lt;img src="http://p.blog.csdn.net/images/p_blog_csdn_net/zhoufoxcn/EntryImages/20081110/asp.net_night1107.jpg" alt="" width="528" height="162" /&gt;&amp;nbsp;&lt;br /&gt;我们从上图中可以看到当&amp;lt;customErrors&amp;gt;节点的Mode属性为&amp;ldquo;On&amp;rdquo;时，因为被禁止访问IPData文件夹下的所有txt文件，所以会跳转到自定义的没有权限提示页面，即403.htm。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;lt;httpRuntime&amp;gt;节点&lt;/strong&gt;&lt;br /&gt;&amp;lt;httpRuntime&amp;gt;节点用于对 ASP.NET HTTP 运行库设置。该节可以在计算机、站点、应用程序和子目录级别声明。&lt;br /&gt;例如下面的配置控制用户最大能上传的文件为40M（40*1024K），最大超时时间为60秒，最大并发请求为100个。&lt;/p&gt;&#xD;
&lt;div &gt;&lt;ol &gt;&#xD;
&lt;li&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;httpRuntime&lt;/span&gt;&amp;nbsp;&lt;span &gt;maxRequestLength&lt;/span&gt;=&lt;span &gt;"40960"&lt;/span&gt;&amp;nbsp;&lt;span &gt;executionTimeout&lt;/span&gt;=&lt;span &gt;"60"&lt;/span&gt;&amp;nbsp;&lt;span &gt;appRequestQueueLimit&lt;/span&gt;=&lt;span &gt;"100"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;lt;pages&amp;gt;节点&lt;br /&gt;&lt;/strong&gt;&amp;lt;pages&amp;gt;节点用于表示对特定页设置，主要有三个属性，分别如下：&lt;br /&gt;属性名&amp;nbsp;说明&lt;br /&gt;buffer&amp;nbsp;是否启用了 HTTP 响应缓冲。&lt;br /&gt;enableViewStateMac&amp;nbsp;是否应该对页的视图状态运行计算机身份验证检查 (MAC)，以放置用户篡改，默认为false，如果设置为true将会引起性能的降低。&lt;br /&gt;validateRequest&amp;nbsp;是否验证用户输入中有跨站点脚本攻击和SQL注入式漏洞攻击，默认为true，如果出现匹配情况就会发 HttpRequestValidationException 异常。对于包含有在线文本编辑器页面一般自行验证用户输入而将此属性设为false。&lt;br /&gt;下面就是一个配置节点的例子：&lt;/p&gt;&#xD;
&lt;div &gt;&lt;ol &gt;&#xD;
&lt;li&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;pages&lt;/span&gt;&amp;nbsp;&lt;span &gt;buffer&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&amp;nbsp;&lt;span &gt;enableViewStateMac&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&amp;nbsp;&lt;span &gt;validateRequest&lt;/span&gt;=&lt;span &gt;"false"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;lt;sessionState&amp;gt;节点&lt;/strong&gt;&lt;br /&gt;&amp;lt;sessionState&amp;gt;节点用于配置当前asp.net应用程序的会话状态配置。以下就是一个常见配置：&lt;/p&gt;&#xD;
&lt;div &gt;&lt;ol &gt;&#xD;
&lt;li&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;sessionState&lt;/span&gt;&amp;nbsp;&lt;span &gt;cookieless&lt;/span&gt;=&lt;span &gt;"false"&lt;/span&gt;&amp;nbsp;&lt;span &gt;mode&lt;/span&gt;=&lt;span &gt;"InProc"&lt;/span&gt;&amp;nbsp;&lt;span &gt;timeout&lt;/span&gt;=&lt;span &gt;"30"&lt;/span&gt;&amp;nbsp;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&lt;/div&gt;&#xD;
&lt;p&gt;上面的节点配置是设置在asp.net应用程序中启用Cookie，并且指定会话状态模式为在进程中保存会话状态，同时还指定了会话超时为30分钟。&lt;br /&gt;&amp;lt;sessionState&amp;gt;节点的Mode属性可以是以下几种值之一：&lt;br /&gt;属性值&amp;nbsp;说明&lt;br /&gt;Custom&amp;nbsp;使用自定义数据来存储会话状态数据。&lt;br /&gt;InProc&amp;nbsp;默认值。由asp.net辅助进程来存储会话状态数据。&lt;br /&gt;Off&amp;nbsp;禁用会话状态。&lt;br /&gt;SQLServer&amp;nbsp;使用进程外SQL Server数据库保存会话状态数据。&lt;br /&gt;StateServer&amp;nbsp;使用进程外 ASP.NET 状态服务存储状态信息。&lt;br /&gt;一般默认情况下使用InProc模式来存储会话状态数据，这种模式的好处是存取速度快，缺点是比较占用内存，所以不宜在这种模式下存储大型的用户会话数据。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;lt;globalization&amp;gt;节点：&lt;/strong&gt;&lt;br /&gt;用于配置应用程序的全球化设置。此节点有几个比较重要的属性，分别如下：&lt;br /&gt;属性名&amp;nbsp;说明&lt;br /&gt;fileEncoding&amp;nbsp;可选属性。设置.aspx、.asmx 和 .asax 文件的存储编码。&lt;br /&gt;requestEncoding&amp;nbsp;可选属性。设置客户端请求的编码，默认为UTF-8.&lt;br /&gt;responseEncoding&amp;nbsp;可选属性。设置服务器端响应的编码，默认为UTF-8.&lt;br /&gt;以下就是asp.net应用程序中的默认配置：&lt;/p&gt;&#xD;
&lt;div &gt;&lt;ol &gt;&#xD;
&lt;li&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;globalization&lt;/span&gt;&amp;nbsp;&lt;span &gt;fileEncoding&lt;/span&gt;=&lt;span &gt;"utf-8"&lt;/span&gt;&amp;nbsp;&lt;span &gt;requestEncoding&lt;/span&gt;=&lt;span &gt;"utf-8"&lt;/span&gt;&amp;nbsp;&lt;span &gt;responseEncoding&lt;/span&gt;=&lt;span &gt;"utf-8"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;配置文件的读写操作&lt;br /&gt;&lt;/strong&gt;虽然web.config文件是一个XML文件，但是由于权限的原因它在部署中不能像操作普通XML文件那样进行修改，在.net中提供了一个类用于对web.config进行修改。&lt;br /&gt;下面是针对web.config修改通用类的代码：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;div &gt;&lt;ol &gt;&#xD;
&lt;li&gt;&lt;span &gt;using&lt;/span&gt;&amp;nbsp;System;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span &gt;using&lt;/span&gt;&amp;nbsp;System.Configuration;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span &gt;using&lt;/span&gt;&amp;nbsp;System.Web;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span &gt;using&lt;/span&gt;&amp;nbsp;System.Web.Configuration;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span &gt;///&amp;nbsp;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span &gt;///&amp;nbsp;ConfigurationOperator&amp;nbsp;的摘要说明&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span &gt;///&amp;nbsp;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span &gt;public&lt;/span&gt;&amp;nbsp;&lt;span &gt;class&lt;/span&gt;&amp;nbsp;ConfigurationOperator:IDisposable&lt;/li&gt;&#xD;
&lt;li &gt;{&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;private&lt;/span&gt;&amp;nbsp;Configuration&amp;nbsp;config;&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&lt;span &gt;public&lt;/span&gt;&amp;nbsp;ConfigurationOperator():&lt;span &gt;this&lt;/span&gt;(HttpContext.Current.Request.ApplicationPath)&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;{&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;}&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;public&lt;/span&gt;&amp;nbsp;ConfigurationOperator(&lt;span &gt;string&lt;/span&gt;&amp;nbsp;path)&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;config&amp;nbsp;=&amp;nbsp;WebConfigurationManager.OpenWebConfiguration(path);&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;///&amp;nbsp;&amp;lt;summary&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;///&amp;nbsp;设置应用程序配置节点，如果已经存在此节点，则会修改该节点的值，否则添加此节点&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;///&amp;nbsp;&amp;lt;/summary&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;///&amp;nbsp;&amp;lt;param&amp;nbsp;name="key"&amp;gt;节点名称&amp;lt;/param&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;///&amp;nbsp;&amp;lt;param&amp;nbsp;name="value"&amp;gt;节点值&amp;lt;/param&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;public&lt;/span&gt;&amp;nbsp;&lt;span &gt;void&lt;/span&gt;&amp;nbsp;SetAppSetting(&lt;span &gt;string&lt;/span&gt;&amp;nbsp;key,&amp;nbsp;&lt;span &gt;string&lt;/span&gt;&amp;nbsp;value)&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AppSettingsSection&amp;nbsp;appSetting&amp;nbsp;=&amp;nbsp;(AppSettingsSection)config.GetSection(&lt;span &gt;"appSettings"&lt;/span&gt;);&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;if&lt;/span&gt;&amp;nbsp;(appSetting.Settings[key]&amp;nbsp;==&amp;nbsp;&lt;span &gt;null&lt;/span&gt;)&lt;span &gt;//如果不存在此节点，则添加&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/li&gt;&#xD;
&lt;li &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;appSetting.Settings.Add(key,&amp;nbsp;value);&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;else&lt;/span&gt;&lt;span &gt;//如果存在此节点，则修改&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/li&gt;&#xD;
&lt;li &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;appSetting.Settings[key].Value&amp;nbsp;=&amp;nbsp;value;&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;///&amp;nbsp;&amp;lt;summary&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;///&amp;nbsp;设置数据库连接字符串节点，如果不存在此节点，则会添加此节点及对应的值，存在则修改&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;///&amp;nbsp;&amp;lt;/summary&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;///&amp;nbsp;&amp;lt;param&amp;nbsp;name="key"&amp;gt;节点名称&amp;lt;/param&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;///&amp;nbsp;&amp;lt;param&amp;nbsp;name="value"&amp;gt;节点值&amp;lt;/param&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;public&lt;/span&gt;&amp;nbsp;&lt;span &gt;void&lt;/span&gt;&amp;nbsp;SetConnectionString(&lt;span &gt;string&lt;/span&gt;&amp;nbsp;key,&amp;nbsp;&lt;span &gt;string&lt;/span&gt;&amp;nbsp;connectionString)&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ConnectionStringsSection&amp;nbsp;connectionSetting&amp;nbsp;=&amp;nbsp;(ConnectionStringsSection)config.GetSection(&lt;span &gt;"connectionStrings"&lt;/span&gt;);&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;if&lt;/span&gt;&amp;nbsp;(connectionSetting.ConnectionStrings[key]&amp;nbsp;==&amp;nbsp;&lt;span &gt;null&lt;/span&gt;)&lt;span &gt;//如果不存在此节点，则添加&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/li&gt;&#xD;
&lt;li &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;ConnectionStringSettings&amp;nbsp;connectionStringSettings&amp;nbsp;=&amp;nbsp;&lt;span &gt;new&lt;/span&gt;&amp;nbsp;ConnectionStringSettings(key,&amp;nbsp;connectionString);&lt;/li&gt;&#xD;
&lt;li&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;connectionSetting.ConnectionStrings.Add(connectionStringSettings);&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;else&lt;/span&gt;&lt;span &gt;//如果存在此节点，则修改&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/li&gt;&#xD;
&lt;li&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;connectionSetting.ConnectionStrings[key].ConnectionString&amp;nbsp;=&amp;nbsp;connectionString;&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;///&amp;nbsp;&amp;lt;summary&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;///&amp;nbsp;保存所作的修改&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;///&amp;nbsp;&amp;lt;/summary&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;public&lt;/span&gt;&amp;nbsp;&lt;span &gt;void&lt;/span&gt;&amp;nbsp;Save()&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;config.Save();&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;config&amp;nbsp;=&amp;nbsp;&lt;span &gt;null&lt;/span&gt;;&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;public&lt;/span&gt;&amp;nbsp;&lt;span &gt;void&lt;/span&gt;&amp;nbsp;Dispose()&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;if&lt;/span&gt;&amp;nbsp;(config&amp;nbsp;!=&amp;nbsp;&lt;span &gt;null&lt;/span&gt;)&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/li&gt;&#xD;
&lt;li&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;config.Save();&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&#xD;
&lt;li &gt;}&lt;/li&gt;&#xD;
&lt;/ol&gt;&lt;/div&gt;&#xD;
&lt;p&gt;把上面的代码存放到App_Code文件夹下，我们在项目中就可以直接使用了。&lt;br /&gt;我们通过一个例子演示如果使用这个通用类对web.config进行设置。新建一个aspx页面，下面是前台代码：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;div &gt;&lt;ol &gt;&#xD;
&lt;li&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;%@&amp;nbsp;Page&amp;nbsp;&lt;span &gt;Language&lt;/span&gt;=&lt;span &gt;"C#"&lt;/span&gt;&amp;nbsp;&lt;span &gt;AutoEventWireup&lt;/span&gt;=&lt;span &gt;"true"&lt;/span&gt;&amp;nbsp;&lt;span &gt;CodeFile&lt;/span&gt;=&lt;span &gt;"ConfigModifyDemo.aspx.cs"&lt;/span&gt;&amp;nbsp;&lt;span &gt;Inherits&lt;/span&gt;=&lt;span &gt;"ConfigModifyDemo"&lt;/span&gt;&amp;nbsp;%&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span &gt;&amp;lt;!DOCTYPE&amp;nbsp;html&amp;nbsp;PUBLIC&amp;nbsp;"-//W3C//DTD&amp;nbsp;XHTML&amp;nbsp;1.0&amp;nbsp;Transitional//EN"&amp;nbsp;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;html&lt;/span&gt;&amp;nbsp;&lt;span &gt;xmlns&lt;/span&gt;=&lt;span &gt;"http://www.w3.org/1999/xhtml"&lt;/span&gt;&amp;nbsp;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;head&lt;/span&gt;&amp;nbsp;&lt;span &gt;runat&lt;/span&gt;=&lt;span &gt;"server"&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;title&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;在部署后修改web.config的例子&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;title&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;head&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;body&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;form&lt;/span&gt;&amp;nbsp;&lt;span &gt;id&lt;/span&gt;=&lt;span &gt;"form1"&lt;/span&gt;&amp;nbsp;&lt;span &gt;runat&lt;/span&gt;=&lt;span &gt;"server"&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;div&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;table&lt;/span&gt;&amp;nbsp;&lt;span &gt;border&lt;/span&gt;=&lt;span &gt;"0"&lt;/span&gt;&amp;nbsp;&lt;span &gt;cellpadding&lt;/span&gt;=&lt;span &gt;"0"&lt;/span&gt;&amp;nbsp;&lt;span &gt;cellspacing&lt;/span&gt;=&lt;span &gt;"0"&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;tr&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;td&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;类型&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;td&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;td&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;名称&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;td&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;td&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;值&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;td&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;tr&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;tr&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;td&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;程序配置&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;td&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;td&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &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;&amp;lt;&lt;/span&gt;&lt;span &gt;asp:TextBox&lt;/span&gt;&amp;nbsp;&lt;span &gt;ID&lt;/span&gt;=&lt;span &gt;"txtKey"&lt;/span&gt;&amp;nbsp;&lt;span &gt;runat&lt;/span&gt;=&lt;span &gt;"server"&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;asp:TextBox&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&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;&amp;lt;&lt;/span&gt;&lt;span &gt;asp:RequiredFieldValidator&lt;/span&gt;&amp;nbsp;&lt;span &gt;ID&lt;/span&gt;=&lt;span &gt;"RequiredFieldValidator2"&lt;/span&gt;&amp;nbsp;&lt;span &gt;runat&lt;/span&gt;=&lt;span &gt;"server"&lt;/span&gt;&amp;nbsp;&lt;span &gt;ControlToValidate&lt;/span&gt;=&lt;span &gt;"txtKey"&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &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;&lt;span &gt;ErrorMessage&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;Display&lt;/span&gt;=&lt;span &gt;"Dynamic"&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;asp:RequiredFieldValidator&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;td&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;td&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;asp:TextBox&lt;/span&gt;&amp;nbsp;&lt;span &gt;ID&lt;/span&gt;=&lt;span &gt;"txtAppSetting"&lt;/span&gt;&amp;nbsp;&lt;span &gt;runat&lt;/span&gt;=&lt;span &gt;"server"&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;asp:TextBox&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;td&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;tr&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;tr&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;td&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;数据库连接&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;td&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;td&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &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;&amp;lt;&lt;/span&gt;&lt;span &gt;asp:TextBox&lt;/span&gt;&amp;nbsp;&lt;span &gt;ID&lt;/span&gt;=&lt;span &gt;"txtConnectionName"&lt;/span&gt;&amp;nbsp;&lt;span &gt;runat&lt;/span&gt;=&lt;span &gt;"server"&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;asp:TextBox&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&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;&amp;lt;&lt;/span&gt;&lt;span &gt;asp:RequiredFieldValidator&lt;/span&gt;&amp;nbsp;&lt;span &gt;ID&lt;/span&gt;=&lt;span &gt;"RequiredFieldValidator1"&lt;/span&gt;&amp;nbsp;&lt;span &gt;runat&lt;/span&gt;=&lt;span &gt;"server"&lt;/span&gt;&amp;nbsp;&lt;span &gt;ErrorMessage&lt;/span&gt;=&lt;span &gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span &gt;ControlToValidate&lt;/span&gt;=&lt;span &gt;"txtConnectionName"&lt;/span&gt;&amp;nbsp;&lt;span &gt;Display&lt;/span&gt;=&lt;span &gt;"Dynamic"&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;asp:RequiredFieldValidator&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;td&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;td&lt;/span&gt;&amp;nbsp;&lt;span &gt;style&lt;/span&gt;=&lt;span &gt;"height:&amp;nbsp;24px"&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;asp:TextBox&lt;/span&gt;&amp;nbsp;&lt;span &gt;ID&lt;/span&gt;=&lt;span &gt;"txtConnectionString"&lt;/span&gt;&amp;nbsp;&lt;span &gt;runat&lt;/span&gt;=&lt;span &gt;"server"&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;asp:TextBox&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;td&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;tr&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;tr&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;td&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;asp:Button&lt;/span&gt;&amp;nbsp;&lt;span &gt;ID&lt;/span&gt;=&lt;span &gt;"btnModify"&lt;/span&gt;&amp;nbsp;&lt;span &gt;runat&lt;/span&gt;=&lt;span &gt;"server"&lt;/span&gt;&amp;nbsp;&lt;span &gt;OnClick&lt;/span&gt;=&lt;span &gt;"btnModify_Click"&lt;/span&gt;&amp;nbsp;&lt;span &gt;Text&lt;/span&gt;=&lt;span &gt;"修改"&lt;/span&gt;&amp;nbsp;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;td&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;td&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;td&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;td&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;td&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;tr&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;table&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;div&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;form&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;body&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;html&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;编写后台代码有时可能需要增加对配置文件读写操作类所在dll的引用，如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://p.blog.csdn.net/images/p_blog_csdn_net/zhoufoxcn/EntryImages/20081110/asp.net_night1108.jpg" alt="" width="482" height="345" /&gt;下面是后台代码：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&lt;ol &gt;&#xD;
&lt;li&gt;&lt;span &gt;using&lt;/span&gt;&amp;nbsp;System;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span &gt;using&lt;/span&gt;&amp;nbsp;System.Data;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span &gt;using&lt;/span&gt;&amp;nbsp;System.Configuration;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span &gt;using&lt;/span&gt;&amp;nbsp;System.Collections;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span &gt;using&lt;/span&gt;&amp;nbsp;System.Web;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span &gt;using&lt;/span&gt;&amp;nbsp;System.Web.Security;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span &gt;using&lt;/span&gt;&amp;nbsp;System.Web.UI;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span &gt;using&lt;/span&gt;&amp;nbsp;System.Web.UI.WebControls;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span &gt;using&lt;/span&gt;&amp;nbsp;System.Web.UI.WebControls.WebParts;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span &gt;using&lt;/span&gt;&amp;nbsp;System.Web.UI.HtmlControls;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span &gt;using&lt;/span&gt;&amp;nbsp;System.Web.Configuration;&lt;span &gt;//注意添加这个命名空间&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span &gt;public&lt;/span&gt;&amp;nbsp;partial&amp;nbsp;&lt;span &gt;class&lt;/span&gt;&amp;nbsp;ConfigModifyDemo&amp;nbsp;:&amp;nbsp;System.Web.UI.Page&lt;/li&gt;&#xD;
&lt;li &gt;{&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;protected&lt;/span&gt;&amp;nbsp;&lt;span &gt;void&lt;/span&gt;&amp;nbsp;Page_Load(&lt;span &gt;object&lt;/span&gt;&amp;nbsp;sender,&amp;nbsp;EventArgs&amp;nbsp;e)&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;protected&lt;/span&gt;&amp;nbsp;&lt;span &gt;void&lt;/span&gt;&amp;nbsp;btnModify_Click(&lt;span &gt;object&lt;/span&gt;&amp;nbsp;sender,&amp;nbsp;EventArgs&amp;nbsp;e)&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;string&lt;/span&gt;&amp;nbsp;appSetting&amp;nbsp;=&amp;nbsp;txtAppSetting.Text;&lt;span &gt;//appSetting子节点值&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;string&lt;/span&gt;&amp;nbsp;connectionString&amp;nbsp;=&amp;nbsp;txtConnectionString.Text;&lt;span &gt;//连接字符串&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;string&lt;/span&gt;&amp;nbsp;key&amp;nbsp;=&amp;nbsp;txtKey.Text;&lt;span &gt;//appSetting子节点Key&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;string&lt;/span&gt;&amp;nbsp;connectionName&amp;nbsp;=&amp;nbsp;txtConnectionName.Text;&lt;span &gt;//连接Name&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ConfigurationOperator&amp;nbsp;op&amp;nbsp;=&amp;nbsp;&lt;span &gt;new&lt;/span&gt;&amp;nbsp;ConfigurationOperator();&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;op.SetAppSetting(key,&amp;nbsp;appSetting);&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;op.SetConnectionString(connectionName,&amp;nbsp;connectionString);&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;op.Save();&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&#xD;
&lt;li &gt;}&lt;/li&gt;&#xD;
&lt;/ol&gt;&lt;/div&gt;&#xD;
&lt;p&gt;下面是运行界面：&lt;br /&gt;&lt;img src="http://p.blog.csdn.net/images/p_blog_csdn_net/zhoufoxcn/EntryImages/20081110/asp.net_night1109.jpg" alt="" width="417" height="220" /&gt;&amp;nbsp;&lt;br /&gt;我们在上面的表单中填入如下信息：&lt;br /&gt;&lt;img src="http://p.blog.csdn.net/images/p_blog_csdn_net/zhoufoxcn/EntryImages/20081110/asp.net_night1110.jpg" alt="" width="435" height="220" /&gt;&amp;nbsp;&lt;br /&gt;假设此时web.config文件相关节点的内容如下：&lt;/p&gt;&#xD;
&lt;div &gt;&lt;ol &gt;&#xD;
&lt;li&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;appSettings&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;appSettings&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;connectionStrings&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;name&lt;/span&gt;=&lt;span &gt;"Conn"&lt;/span&gt;&amp;nbsp;&lt;span &gt;connectionString&lt;/span&gt;=&lt;span &gt;"Data&amp;nbsp;Source=(local);Initial&amp;nbsp;Catalog=AspNetStudy;Persist&amp;nbsp;Security&amp;nbsp;Info=True;User&amp;nbsp;ID=sa;Password=sa"&lt;/span&gt;&amp;nbsp;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;connectionStrings&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&lt;/div&gt;&#xD;
&lt;p&gt;我们点击&amp;ldquo;修改&amp;rdquo;按钮之后的文件内容如下：&lt;/p&gt;&#xD;
&lt;div &gt;&lt;ol &gt;&#xD;
&lt;li&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;appSettings&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;key&lt;/span&gt;=&lt;span &gt;"country"&lt;/span&gt;&amp;nbsp;&lt;span &gt;value&lt;/span&gt;=&lt;span &gt;"china"&lt;/span&gt;&amp;nbsp;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;appSettings&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;connectionStrings&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&amp;nbsp;&lt;span &gt;name&lt;/span&gt;=&lt;span &gt;"Conn"&lt;/span&gt;&amp;nbsp;&lt;span &gt;connectionString&lt;/span&gt;=&lt;span &gt;"Data&amp;nbsp;Source=(local);Initial&amp;nbsp;Catalog=Study;User&amp;nbsp;ID=sa;Password=sa"&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;providerName&lt;/span&gt;=&lt;span &gt;"System.Data.SqlClient"&lt;/span&gt;&amp;nbsp;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;connectionStrings&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&lt;/div&gt;&#xD;
&lt;p&gt;从执行结果可以看出我们的程序确实能做到修改和添加web.config中的节点的功能。需要注意的是，在利用了某些版本控制软件之后（如Microsoft Visual SourceSafe），版本控制软件可能会将web.config设置为只读属性，就会出现不能设置的情况，我们需要手动将web.config的只读属性去掉才能设置web.config文件。在实际部署项目的时候就不会存在这个问题。&lt;/p&gt;&#xD;
&lt;p&gt;总结：web.config是asp.net应用程序中一个很重要的配置文件，通过web.config文件可以方便我们进行开发和部署asp.net应用程序。此外还能对程序进行一些灵活的控制。在本篇中详细讲述了各节点的作用。因为在部署asp.net应用程序后因为权限原因不能按照XML方式进行修改web.config文件，所以在本篇中还提供了一个针对&amp;lt;appSettings&amp;gt;节点和&amp;lt;connectionStrings&amp;gt;节点设置的通用类，读者朋友可以根据实际项目需要对这个通用类进行完善和补充。&lt;br /&gt;下一篇笔者将带领大家进入到asp.net的内部，了解一下asp.net的内部运行机制，这对于我们更加灵活地控制asp.net应用程序是非常有帮助的。&lt;br /&gt;2008-11-5 01：47&lt;br /&gt;周公（周金桥）&lt;/p&gt;&#xD;
&lt;p&gt;最近事情比较多，忙不过来了，可能发表时间会比较长，不过也好能有时间让我再思考一下我的表述方式。&lt;/p&gt;&#xD;
&lt;p&gt;注意，因为个人空间大小和下载速度受限，所以以后不再提供从本人主机上的下载地址，可以到www.verycd.com下载。地址是：http://www.verycd.com/topics/2730883/&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Asp.net夜话系列文章：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="http://blog.csdn.net/zhoufoxcn/archive/2008/09/12/2915811.aspx"&gt;Asp.net夜话之一 ：asp.net介绍&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://blog.csdn.net/zhoufoxcn/archive/2008/09/15/2930049.aspx"&gt;Asp.net夜话之二 ：asp.net内置对象&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://blog.csdn.net/zhoufoxcn/archive/2008/09/18/2944967.aspx"&gt;asp.net夜话之三 ：表单和控件&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://blog.csdn.net/zhoufoxcn/archive/2008/09/22/2959316.aspx"&gt;Asp.net夜话之四 ：Visual Studio 2005中容易被忽略的技巧&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://blog.csdn.net/zhoufoxcn/archive/2008/09/28/2990318.aspx"&gt;asp.net夜话之五 ：Page类和回调技术&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://blog.csdn.net/zhoufoxcn/archive/2008/10/06/3019670.aspx"&gt;asp.net夜话之六 ：asp.net基本控件&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://blog.csdn.net/zhoufoxcn/archive/2008/10/13/3066799.aspx"&gt;asp.net夜话之七 ：ADO.NET介绍&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://blog.csdn.net/zhoufoxcn/archive/2008/10/24/3134608.aspx"&gt;asp.net夜话之八 ：数据绑定控件&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://blog.csdn.net/zhoufoxcn/archive/2008/10/28/3164300.aspx"&gt;asp.net夜话之 九：验证控件&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://blog.csdn.net/zhoufoxcn/archive/2008/11/03/3208413.aspx"&gt;asp.net夜话之 十：复合控件和母板页&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://blog.csdn.net/zhoufoxcn/archive/2008/11/10/3265141.aspx"&gt;asp.net夜话之十 一：web.config详解&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;引用自：&lt;a href="http://blog.csdn.net/zhoufoxcn/article/details/3265141"&gt;http://blog.csdn.net/zhoufoxcn/article/details/3265141&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/zhangchenliang/aggbug/2335430.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhangchenliang/archive/2012/02/02/2335430.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhangchenliang/archive/2012/02/02/2335429.html</id><title type="text">在web.config和app.config文件中增加自定义配置节点</title><summary type="text">有经验的开发人员都知道在开发.NET应用时可以利用配置文件保存一些常用并且有可能变化的信息，例如日志文件的保存路径、数据库连接信息等等，这样即使生产环境中的参数信息与开发环境不一致也只需要更改配置文件而不用改动源代码再重新编译，极其方便。并且我们一般还约定，在&amp;lt;appSettings&amp;gt;节点保存应用程序的配置信息，在&amp;lt;connectionStrings&amp;gt;中保存数据库连接字符串信息（详见本博客《asp.net夜话之十一：web.config详解》）。上面的这些方法和约定足以让我们在大部分开发中获得方便，但是在有些情况下有些配置信息可以按组分类存放，如果采用上面的方法不仅不直</summary><published>2012-02-02T02:37:00Z</published><updated>2012-02-02T02:37:00Z</updated><author><name>独孤伤</name><uri>http://www.cnblogs.com/zhangchenliang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhangchenliang/archive/2012/02/02/2335429.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhangchenliang/archive/2012/02/02/2335429.html"/><content type="html">&lt;p&gt;有经验的开发人员都知道在开发.NET应用时可以利用配置文件保存一些常用并且有可能变化的信息，例如日志文件的保存路径、数据库连接信息等等，这样即使生产环境中的参数信息与开发环境不一致也只需要更改配置文件而不用改动源代码再重新编译，极其方便。并且我们一般还约定，在&amp;lt;appSettings&amp;gt;节点保存应用程序的配置信息，在&amp;lt;connectionStrings&amp;gt;中保存数据库连接字符串信息（详见本博客&lt;a href="http://blog.csdn.net/zhoufoxcn/archive/2008/11/10/3265141.aspx"&gt;《asp.net夜话之十一：web.config详解》&lt;/a&gt;）。&lt;br /&gt;上面的这些方法和约定足以让我们在大部分开发中获得方便，但是在有些情况下有些配置信息可以按组分类存放，如果采用上面的方法不仅不直观，而且读取起来也不是太方便，幸好在.NET里就提供了这样的方法。如果有使用过Log4Net或者Enyim.Caching的朋友，肯定对下面的配置不会陌生：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;ol  start="1"&gt;&#xD;
&lt;li &gt;&lt;span&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;sectionGroup&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span &gt;"enyim.com"&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;section&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span &gt;"memcached"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;type&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span &gt;"Enyim.Caching.Configuration.MemcachedClientSection,&amp;nbsp;Enyim.Caching"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;sectionGroup&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&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;div &gt;&#xD;
&lt;div &gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;ol  start="1"&gt;&#xD;
&lt;li &gt;&lt;span&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;configSections&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;section&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span &gt;"log4net"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;type&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span &gt;"System.Configuration.IgnoreSectionHandler"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;configSections&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在出现上面配置的配置文件中，我们就会找到名称为"enyim.com"或者"log4net"的节点，尽管它们本不属于config文件的默认节点，但是通过上面的配置之后程序运行并不会报错。这样一来，相关配置信息也可以很好分类保存起来。&lt;br /&gt;在这里周公演示一个简单的例子，这个例子来源于周公的一个从2006年起就开始开发的自用软件（因为没有美化所以没有免费发布），在这个应用程序的connfig文件中我增加了一些特有的配置，所以新增了一个自己的节点，app.config文件内容如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;ol  start="1"&gt;&#xD;
&lt;li &gt;&lt;span&gt;&lt;span &gt;&amp;lt;?&lt;/span&gt;&lt;span &gt;xml&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;version&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span &gt;"1.0"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;encoding&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span &gt;"utf-8"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;?&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;configuration&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;configSections&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;section&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span &gt;"SoftwareSettings"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;type&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span &gt;"ImageAssistant.Configuration.SoftwareSettings,&amp;nbsp;ImageAssistant"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;configSections&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;SoftwareSettings&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;LoadSettings&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;key&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span &gt;"LoadBmp"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;value&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;key&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span &gt;"LoadJpg"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;value&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;key&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span &gt;"LoadGif"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;value&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;key&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span &gt;"LoadPng"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;value&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span &gt;"false"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;LoadSettings&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;PathSettings&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;SavePath&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span &gt;"C:/ResizeImages/"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;SearchSubPath&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;SoftwareSettings&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;appSettings&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;key&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span &gt;"LoadBmp"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;value&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;key&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span &gt;"LoadJpg"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;value&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;key&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span &gt;"LoadGif"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;value&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;key&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span &gt;"LoadPng"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;value&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span &gt;"false"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;key&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span &gt;"IncludeSubPath"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;value&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span &gt;"true"&lt;/span&gt;&lt;span &gt;/&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;appSettings&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;configuration&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在config文件中我们使用&amp;lt;section name="SoftwareSettings" type="ImageAssistant.Configuration.SoftwareSettings, ImageAssistant" /&amp;gt;告诉应用程序对于配置文件中的SoftwareSettings节点，其对应的类是ImageAssistant程序集中ImageAssistant.Configuration.SoftwareSettings类，并且在&amp;lt;SoftwareSettings&amp;gt;节点中我们还看到有&amp;lt;LoadSettings&amp;gt;节点和&amp;lt;PathSettings&amp;gt;节点，其中&amp;lt;LoadSettings&amp;gt;是一个节点集合，还包含有多个子节点，为了表示清楚这些关系我们需要添加四个类：SoftwareSettings、LoadSettingsCollection、LoadSettingsElement及PathSettingElement。为了发布方便，周公将这四个类的代码放在一个物理文件中，代码如下（注意添加对System.Configuration.dll的引用）：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;ol  start="1"&gt;&#xD;
&lt;li &gt;&lt;span&gt;&lt;span &gt;using&lt;/span&gt;&lt;span&gt;&amp;nbsp;System;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span &gt;using&lt;/span&gt;&lt;span&gt;&amp;nbsp;System.Collections.Generic;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&lt;span &gt;using&lt;/span&gt;&lt;span&gt;&amp;nbsp;System.Linq;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span &gt;using&lt;/span&gt;&lt;span&gt;&amp;nbsp;System.Text;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&lt;span &gt;using&lt;/span&gt;&lt;span&gt;&amp;nbsp;System.Configuration;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&lt;span &gt;//作者：zhoufoxcn（周公）&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span &gt;//日期：2011-03-08&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&lt;span &gt;//blog：http://blog.csdn.net/zhoufoxcn&amp;nbsp;或http://zhoufoxcn.blog.51cto.com&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span &gt;//版权声明：本文允许非商业用途，但必须保证不得去掉本文中的任何链接，违者必究。&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&lt;span &gt;namespace&lt;/span&gt;&lt;span&gt;&amp;nbsp;ImageAssistant.Configuration&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;sealed&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;class&lt;/span&gt;&lt;span&gt;&amp;nbsp;LoadSettingsCollection&amp;nbsp;:&amp;nbsp;ConfigurationElementCollection&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;private&lt;/span&gt;&lt;span&gt;&amp;nbsp;IDictionary&amp;lt;&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span&gt;,&amp;nbsp;&lt;/span&gt;&lt;span &gt;bool&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;nbsp;settings;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;protected&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;override&lt;/span&gt;&lt;span&gt;&amp;nbsp;ConfigurationElement&amp;nbsp;CreateNewElement()&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&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;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;LoadSettingsElement();&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;protected&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;override&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;object&lt;/span&gt;&lt;span&gt;&amp;nbsp;GetElementKey(ConfigurationElement&amp;nbsp;element)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&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;LoadSettingsElement&amp;nbsp;ep&amp;nbsp;=&amp;nbsp;(LoadSettingsElement)element;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&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;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;ep.Key;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;protected&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;override&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span&gt;&amp;nbsp;ElementName&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&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;get&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&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;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&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;&lt;span &gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;base&lt;/span&gt;&lt;span&gt;.ElementName;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&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;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;IDictionary&amp;lt;&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span&gt;,&amp;nbsp;&lt;/span&gt;&lt;span &gt;bool&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;nbsp;Settings&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&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;get&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&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;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&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;&lt;span &gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(settings&amp;nbsp;==&amp;nbsp;&lt;/span&gt;&lt;span &gt;null&lt;/span&gt;&lt;span&gt;)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&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;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&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;settings&amp;nbsp;=&amp;nbsp;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;Dictionary&amp;lt;&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span&gt;,&amp;nbsp;&lt;/span&gt;&lt;span &gt;bool&lt;/span&gt;&lt;span&gt;&amp;gt;();&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&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;&lt;span &gt;foreach&lt;/span&gt;&lt;span&gt;&amp;nbsp;(LoadSettingsElement&amp;nbsp;e&amp;nbsp;&lt;/span&gt;&lt;span &gt;in&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;this&lt;/span&gt;&lt;span&gt;)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&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;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&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;settings.Add(e.Key,&amp;nbsp;e.Value);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&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;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&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;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&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;&lt;span &gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;settings;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&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;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;bool&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;this&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span&gt;&amp;nbsp;key]&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&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;get&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&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;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&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;&lt;span &gt;bool&lt;/span&gt;&lt;span&gt;&amp;nbsp;isLoad&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;true&lt;/span&gt;&lt;span&gt;;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&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;&lt;span &gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(settings.TryGetValue(key,&amp;nbsp;&lt;/span&gt;&lt;span &gt;out&lt;/span&gt;&lt;span&gt;&amp;nbsp;isLoad))&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&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;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&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;&lt;span &gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;isLoad;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&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;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&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;&lt;span &gt;else&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&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;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&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;&lt;span &gt;throw&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;ArgumentException(&lt;/span&gt;&lt;span &gt;"没有对'"&lt;/span&gt;&lt;span&gt;&amp;nbsp;+&amp;nbsp;key&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span &gt;"'节点进行配置。"&lt;/span&gt;&lt;span&gt;);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&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;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&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;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;class&lt;/span&gt;&lt;span&gt;&amp;nbsp;LoadSettingsElement&amp;nbsp;:&amp;nbsp;ConfigurationElement&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[ConfigurationProperty(&lt;span &gt;"key"&lt;/span&gt;&lt;span&gt;,&amp;nbsp;IsRequired&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;true&lt;/span&gt;&lt;span&gt;)]&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span&gt;&amp;nbsp;Key&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&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;get&lt;/span&gt;&lt;span&gt;&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;span &gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;(&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span &gt;base&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span &gt;"key"&lt;/span&gt;&lt;span&gt;];&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&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;set&lt;/span&gt;&lt;span&gt;&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;span &gt;base&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span &gt;"key"&lt;/span&gt;&lt;span&gt;]&amp;nbsp;=&amp;nbsp;value;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[ConfigurationProperty(&lt;span &gt;"value"&lt;/span&gt;&lt;span&gt;,&amp;nbsp;IsRequired&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;true&lt;/span&gt;&lt;span&gt;)]&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;bool&lt;/span&gt;&lt;span&gt;&amp;nbsp;Value&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&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;get&lt;/span&gt;&lt;span&gt;&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;span &gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;(&lt;/span&gt;&lt;span &gt;bool&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span &gt;base&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span &gt;"value"&lt;/span&gt;&lt;span&gt;];&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&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;set&lt;/span&gt;&lt;span&gt;&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;span &gt;base&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span &gt;"value"&lt;/span&gt;&lt;span&gt;]&amp;nbsp;=&amp;nbsp;value;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;class&lt;/span&gt;&lt;span&gt;&amp;nbsp;PathSettingElement&amp;nbsp;:&amp;nbsp;ConfigurationElement&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;///&amp;nbsp;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;///&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;///&amp;nbsp;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[ConfigurationProperty(&lt;span &gt;"SavePath"&lt;/span&gt;&lt;span&gt;,&amp;nbsp;IsRequired&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;true&lt;/span&gt;&lt;span&gt;)]&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span&gt;&amp;nbsp;SavePath&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&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;get&lt;/span&gt;&lt;span&gt;&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;span &gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;(&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span &gt;base&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span &gt;"SavePath"&lt;/span&gt;&lt;span&gt;];&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&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;set&lt;/span&gt;&lt;span&gt;&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;span &gt;base&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span &gt;"SavePath"&lt;/span&gt;&lt;span&gt;]&amp;nbsp;=&amp;nbsp;value;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;///&amp;nbsp;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;///&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;///&amp;nbsp;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[ConfigurationProperty(&lt;span &gt;"SearchSubPath"&lt;/span&gt;&lt;span&gt;,&amp;nbsp;IsRequired&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;false&lt;/span&gt;&lt;span&gt;,&amp;nbsp;DefaultValue&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;true&lt;/span&gt;&lt;span&gt;)]&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;bool&lt;/span&gt;&lt;span&gt;&amp;nbsp;SearchSubPath&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&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;get&lt;/span&gt;&lt;span&gt;&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;span &gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;(&lt;/span&gt;&lt;span &gt;bool&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span &gt;base&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span &gt;"SearchSubPath"&lt;/span&gt;&lt;span&gt;];&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&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;set&lt;/span&gt;&lt;span&gt;&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;span &gt;base&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span &gt;"SearchSubPath"&lt;/span&gt;&lt;span&gt;]&amp;nbsp;=&amp;nbsp;value;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;///&amp;nbsp;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;///&amp;nbsp;对应config文件中的&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;///&amp;nbsp;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;sealed&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;class&lt;/span&gt;&lt;span&gt;&amp;nbsp;SoftwareSettings&amp;nbsp;:&amp;nbsp;ConfigurationSection&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;///&amp;nbsp;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;///&amp;nbsp;对应SoftwareSettings节点下的LoadSettings子节点&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;///&amp;nbsp;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[ConfigurationProperty(&lt;span &gt;"LoadSettings"&lt;/span&gt;&lt;span&gt;,&amp;nbsp;IsRequired&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;true&lt;/span&gt;&lt;span&gt;)]&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;LoadSettingsCollection&amp;nbsp;LoadSettings&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&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;get&lt;/span&gt;&lt;span&gt;&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;span &gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;(LoadSettingsCollection)&lt;/span&gt;&lt;span &gt;base&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span &gt;"LoadSettings"&lt;/span&gt;&lt;span&gt;];&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;///&amp;nbsp;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;///&amp;nbsp;对应SoftwareSettings节点下的PathSettings子节点，非必须&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;///&amp;nbsp;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[ConfigurationProperty(&lt;span &gt;"PathSettings"&lt;/span&gt;&lt;span&gt;,&amp;nbsp;IsRequired&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;false&lt;/span&gt;&lt;span&gt;)]&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;PathSettingElement&amp;nbsp;PathSetting&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&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;get&lt;/span&gt;&lt;span&gt;&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;span &gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;(PathSettingElement)&lt;/span&gt;&lt;span &gt;base&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span &gt;"PathSettings"&lt;/span&gt;&lt;span&gt;];&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&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;set&lt;/span&gt;&lt;span&gt;&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;span &gt;base&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span &gt;"PathSettings"&lt;/span&gt;&lt;span&gt;]&amp;nbsp;=&amp;nbsp;value;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在上面的代码中可以看到ConfigurationProperty这个属性，这是表示对应的属性在config文件中的属性名，IsRequired表示是否是必须的属性，还有DefaultValue表示属性的默认值。初次之外，我们还要注意以下关系：&lt;br /&gt;SoftwareSettings：根节点，继承自ConfigurationSection。&lt;br /&gt;LoadSettingsCollection：子节点集合，继承自ConfigurationElementCollection。&lt;br /&gt;LoadSettingsElement：子节点，继承自ConfigurationElement。&lt;br /&gt;PathSettingElement：子节点，继承自ConfigurationElement。&lt;br /&gt;编写了如下代码之后，我们又该如何使用上面的类呢？其实很简单，如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;ol  start="1"&gt;&#xD;
&lt;li &gt;&lt;span&gt;&lt;span &gt;class&lt;/span&gt;&lt;span&gt;&amp;nbsp;Program&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;static&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;Main(&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span&gt;[]&amp;nbsp;args)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&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;SoftwareSettings&amp;nbsp;softSettings&amp;nbsp;=&amp;nbsp;ConfigurationManager.GetSection(&lt;span &gt;"SoftwareSettings"&lt;/span&gt;&lt;span&gt;)&amp;nbsp;&lt;/span&gt;&lt;span &gt;as&lt;/span&gt;&lt;span&gt;&amp;nbsp;SoftwareSettings;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&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;foreach&lt;/span&gt;&lt;span&gt;&amp;nbsp;(&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span&gt;&amp;nbsp;key&amp;nbsp;&lt;/span&gt;&lt;span &gt;in&lt;/span&gt;&lt;span&gt;&amp;nbsp;softSettings.LoadSettings.Settings.Keys)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&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;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&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;Console.WriteLine(&lt;span &gt;"{0}={1}"&lt;/span&gt;&lt;span&gt;,&amp;nbsp;key,&amp;nbsp;softSettings.LoadSettings[key]);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&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;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&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.WriteLine(&lt;span &gt;"SavePath={0},SearchSubPath={1}"&lt;/span&gt;&lt;span&gt;,&amp;nbsp;softSettings.PathSetting.SavePath,&amp;nbsp;softSettings.PathSetting.SearchSubPath);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&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.ReadLine();&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这个程序的运行结果如下：&lt;br /&gt;LoadBmp=True&lt;br /&gt;LoadJpg=True&lt;br /&gt;LoadGif=True&lt;br /&gt;LoadPng=False&lt;br /&gt;SavePath=C:/ResizeImages/,SearchSubPath=True&lt;/p&gt;&#xD;
&lt;p&gt;总结：在上面的config文件中通过&amp;lt;appSettings&amp;gt;也达到了类似的效果，但是通过自定义节点我们可以方便地读取相关的应用程序配置，同时也便于维护。如果在开发过程中遇到本文中类似的情况，不妨采取本文所述的方式。本文示例源代码可以到&lt;a href="http://zhoufoxcn.blog.51cto.com/attachment/201103/792419_1299632125.rar"&gt;这里&lt;/a&gt;下载。&lt;/p&gt;&#xD;
&lt;p&gt;周公&lt;br /&gt;2011-03-08&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;引用自：&lt;a href="http://blog.csdn.net/zhoufoxcn/article/details/6233171"&gt;http://blog.csdn.net/zhoufoxcn/article/details/6233171&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;另外一篇 ：&lt;a href="http://wendang.baidu.com/view/cd907368af1ffc4ffe47acae.html?from=related"&gt;http://wendang.baidu.com/view/cd907368af1ffc4ffe47acae.html?from=related&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/zhangchenliang/aggbug/2335429.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhangchenliang/archive/2012/02/02/2335429.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhangchenliang/archive/2012/01/16/2323673.html</id><title type="text">使用NUnit做单元测试（总结版）</title><summary type="text">【按：有关于NUnit的详细介绍请见：《NUnit2.0详细使用方法 》http://confach.cnblogs.com/archive/2005/06/20/177817.aspx本文是个人心得和简要总结】一、本文摘要：●什么单元测试●什么是NUnit●NUnit的下载以及安装●NUnit的启动●NUnit的最简单使用●验证设计的功能是否实现●SetUp/TearDown 属性●TestFixtureSetUp/TestFixtureTearDown●Category属性●Explicit属性●输出二、什么单元测试单元测试，就是局部测试，对于web应用程序或者Windows应用程序来说，</summary><published>2012-01-16T07:40:00Z</published><updated>2012-01-16T07:40:00Z</updated><author><name>独孤伤</name><uri>http://www.cnblogs.com/zhangchenliang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhangchenliang/archive/2012/01/16/2323673.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhangchenliang/archive/2012/01/16/2323673.html"/><content type="html">&lt;div id="cnblogs_post_body"&gt;&#xD;
&lt;p&gt;【按：有关于NUnit的详细介绍请见：《NUnit2.0详细使用方法 》&lt;a href="http://confach.cnblogs.com/archive/2005/06/20/177817.aspx"&gt;http://confach.cnblogs.com/archive/2005/06/20/177817.aspx&lt;/a&gt;&amp;nbsp;本文是个人心得和简要总结】&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;一、本文摘要：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;●什么单元测试&lt;br /&gt;&amp;nbsp;●什么是NUnit&lt;br /&gt;&amp;nbsp;●NUnit的下载以及安装&lt;br /&gt;&amp;nbsp;●NUnit的启动&lt;br /&gt;&amp;nbsp;●NUnit的最简单使用&lt;br /&gt;&amp;nbsp;●验证设计的功能是否实现&lt;br /&gt;&amp;nbsp;●SetUp/TearDown 属性&lt;br /&gt;&amp;nbsp;●TestFixtureSetUp/TestFixtureTearDown&amp;nbsp;&lt;br /&gt;&amp;nbsp;●Category属性&lt;br /&gt;&amp;nbsp;●Explicit属性&amp;nbsp;&lt;br /&gt;&amp;nbsp;●输出&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;二、什么单元测试&lt;/p&gt;&#xD;
&lt;p&gt;单元测试，就是局部测试，对于web应用程序或者Windows应用程序来说，都是由很多&amp;ldquo;局部&amp;rdquo;组成的。如果是一个具体的Web Page，那么可以通常运行、浏览页面看到具体的结果，但是如果是一个类，测试起来可能就会有一些麻烦，尤其是在类反复继承之后，想要查看程序运行过程中某个类的具体实现结果和实现过程，往往就不那么容易了。&lt;br /&gt;vs IDE当中包含调试(Debug)和跟踪(Trace)的功能，但是它们也有一些局限，往往都是要对程序的整体进行测试，通过层层调用才能运行到某个类。&lt;br /&gt;所以使用单元测试对局部进行测试就会有更好的结果了。&lt;br /&gt;使用单元测试可以很轻松的实现：&lt;/p&gt;&#xD;
&lt;p&gt;静态类测试&lt;br /&gt;静态方法测试&lt;br /&gt;类的实例化测试&lt;br /&gt;类的方法测试&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;三、什么是NUnit？&lt;/p&gt;&#xD;
&lt;p&gt;单元测试通过有两种办法：一个是微软在VS提供的单元测试，另一个是NUnit，前者可能更复杂也更全面（我只实践过一次，发现复杂是肯定有的），后者更简洁明了。&lt;/p&gt;&#xD;
&lt;p&gt;四、NUnit的下载以及安装&lt;/p&gt;&#xD;
&lt;p&gt;和普通的软件没有什么区别，略。&lt;br /&gt;下载地址：&lt;a href="http://www.nunit.org/"&gt;http://www.nunit.org/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;五、NUnit的启动&lt;/p&gt;&#xD;
&lt;p&gt;有两种方法，一个是单独启动（通过开始菜单快捷方式），这个时候需要指定已经编译好的dll路径；另一个是集成在VS中启动。&lt;/p&gt;&#xD;
&lt;p&gt;后者适合单独开发类库的时候使用，否则，在一个解决方案中既有类库，也有Web应用程序，还得反复切换&amp;ldquo;启动项目&amp;rdquo;。&lt;/p&gt;&#xD;
&lt;p&gt;单独启动的时候，指定好已经编译的DLL，按下"RUN"按钮，测试成功就会以绿色方式显示，失败就会显示红色，黄的部分则是通过Category指令跳过。&lt;/p&gt;&#xD;
&lt;p&gt;六、最简单使用&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;◆在项目（库类）中添加NUnit的引用。&lt;/p&gt;&#xD;
&lt;p&gt;NUnit.Framework 有针对 .net framwork 1.1和2.0两个版本，引用的时候需要注意&lt;/p&gt;&#xD;
&lt;p&gt;◆新建一个类&lt;/p&gt;&#xD;
&lt;p&gt;需要说明的是&amp;nbsp;&lt;br /&gt;i)NUnit通过创建这个类的实例，和运行这个实例的方法来完成测试。它和原始的、想测试的目标类，并不相同。假如写好一个类classA，想要对classA进行测试，那么现在新建的这个类就是Test_For_ClassA&lt;br /&gt;ii)为了便于叙述，文中使用命名约定：&amp;ldquo;原始类&amp;rdquo;和&amp;ldquo;测试类&amp;rdquo;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;◆并且使用Using指令把"NUnit.Framework;"命名空间包含进来&lt;/p&gt;&#xD;
&lt;p&gt;注意大小写，在添加引用的时候是全小写的，但是命名空间却不是。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;◆在类名称前面加上指令：[TestFixtureSetUp]，这个类必须是public&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;◆添加一个public void 方法，在这个方法前面加上 [Test]指令。后文管这种方法叫做&amp;ldquo;测试方法&amp;rdquo;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;◆ Shift+F6或者F6生成&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;◆通过开始菜单快捷方式启动NUnit&lt;/p&gt;&#xD;
&lt;p&gt;◆通过&amp;ldquo;文件&amp;rdquo;菜单》&amp;ldquo;打开&amp;rdquo;，浏览并找到刚才生成的dll&lt;/p&gt;&#xD;
&lt;p&gt;◆按下Run按钮，NUnit显示绿色的进度条，表明测试成功。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;以上就是NUnit的最简单使用，这里其实什么也没有测试，只是演练一下NUnit这个单元测试工具的使用。下面进一步介绍NUnit的使用方法。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;七、验证设计的功能是否实现&lt;/p&gt;&#xD;
&lt;p&gt;7.1基本的测试&lt;/p&gt;&#xD;
&lt;p&gt;◆例如：类的实例化&lt;/p&gt;&#xD;
&lt;p&gt;新建一个测试类，添加一个&amp;ldquo;测试方法&amp;rdquo;，在这个方法中添加原始类的实例化代码，这时候可以使用各种构造函数，例如（这里使用范例代码不能运行）：&lt;/p&gt;&#xD;
&lt;p&gt;class a&amp;nbsp; = new class();&lt;br /&gt;class b = new class("abc");&lt;/p&gt;&#xD;
&lt;p&gt;使用NUnit测试。如果&amp;ldquo;测试方法&amp;rdquo;测试通过显示绿色的进度条，那就证明类的构造函数通过了测试。&lt;/p&gt;&#xD;
&lt;p&gt;◆例如：类的void方法&lt;/p&gt;&#xD;
&lt;p&gt;在&amp;ldquo;测试方法&amp;rdquo;中实例化原始类，然后再运运行相应的方法，例如（这里使用范例代码不能运行）：&lt;/p&gt;&#xD;
&lt;p&gt;class a = new class();&lt;/p&gt;&#xD;
&lt;p&gt;a.go();&lt;/p&gt;&#xD;
&lt;p&gt;7.2详细测试：断言&lt;/p&gt;&#xD;
&lt;p&gt;以上的测试都是简单的验证原始类的某些代码运行过程中是否出现异常。对于复杂的类来说，这些远远不够，对于原始类的属性和有返回值的方法可以使用NUnit提供的Assert(断言)来测试。例如：&lt;/p&gt;&#xD;
&lt;p&gt;原始类：&lt;/p&gt;&#xD;
&lt;p&gt;public class tag&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int Count;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public tag(string html)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; prase(html);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void prase(string str)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;Count = 0;&lt;br /&gt;&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; return ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;测试类：&lt;/p&gt;&#xD;
&lt;p&gt;[TestFixture]&lt;br /&gt;public class TestTag&lt;br /&gt;{&lt;/p&gt;&#xD;
&lt;p&gt;[Test]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void T1()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tag t = new tag("&amp;lt;i&amp;gt;abc&amp;lt;/i&amp;gt;");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Assert.AreEqual(1, t.Count);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;NUnit在测试的时候，就会比较t.Count是否和1相等，相等则通过测试，并且通过绿色表示出来。&lt;br /&gt;需要说明的是，Assert.AreEqual只是针对值类型判断是否相等。其它的断言，请查看中文帮助：&lt;a href="http://www.36sign.com/nunit/assertions.html"&gt;http://www.36sign.com/nunit/assertions.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;还有一些情况不能通过异常和或者断言来判断，那么有两个选择：&lt;br /&gt;A 自己在测试类当中写私有的类业判断&lt;/p&gt;&#xD;
&lt;p&gt;B 在控制台中输出相关的信息。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;八、SetUp/TearDown 指令&lt;/p&gt;&#xD;
&lt;p&gt;简单说，就是多个测试中包含的&amp;ldquo;重合&amp;rdquo;的代码，可以放到[SetUp]指令指导定的代码当中。每个[Test]方法都会在运行之前先运行[SetUp]运行结束再运行[TearDown]。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;九、TestFixtureSetUp/TestFixtureTearDown 指令&lt;/p&gt;&#xD;
&lt;p&gt;这一组指令和前面的指令类似，但是又有些不同，主要的区别在于，这一组指令通常用来打开、释放某些共同的资源（例如数据库连接）&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;十、Category指令&lt;/p&gt;&#xD;
&lt;p&gt;跳过的测试&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;十一、Explicit指令&lt;/p&gt;&#xD;
&lt;p&gt;在7.1中是验证代码能否正常运行，如果不出现异常那么就通过测试了。在这里Explicit指令是故意验证，代码当中会不会出现某一具体的异常。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;十二、输出&lt;/p&gt;&#xD;
&lt;p&gt;根据测试的需要，可以在NUnit测试的过程种在控制台输出测试类中指定的信息。&lt;/p&gt;&#xD;
&lt;p&gt;能过在NUnit工具的&amp;ldquo;Text Output&amp;rdquo;选项卡可以看到测试过程中输出的信息。&lt;/p&gt;&#xD;
&lt;p&gt;例如：&lt;/p&gt;&#xD;
&lt;p&gt;[TestFixtureSetUp]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void Init()&lt;br /&gt;&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.WriteLine("开始测试并且初始化。");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;PS:关于输出,我封装了一个类TestBase，除了输出文本以外，还可以输出DataTable的内容。具体请见下面的链接。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/xpnew/admin/EditPosts.aspx?postid=1795867"&gt;http://www.cnblogs.com/xpnew/admin/EditPosts.aspx?postid=1795867&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div id="MySignature"&gt;流浪是注定的宿命；&lt;br /&gt;漂泊是无尽的轮回。&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;引用自 :　&lt;a href="http://www.cnblogs.com/xpnew/archive/2010/08/09/1795867.html"&gt;http://www.cnblogs.com/xpnew/archive/2010/08/09/1795867.html&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/zhangchenliang/aggbug/2323673.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhangchenliang/archive/2012/01/16/2323673.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhangchenliang/archive/2012/01/16/2323455.html</id><title type="text">通过16道练习学习Linq和Lambda</title><summary type="text">1、查询Student表中的所有记录的Sname、Ssex和Class列。select sname,ssex,class from studentLinq:from s in Students select new { s.SNAME, s.SSEX, s.CLASS }Lambda: Students.Select( s =&amp;gt; new { SNAME = s.SNAME,SSEX = s.SSEX,CLASS = s.CLASS })2、查询教师所有的单位即不重复的Depart列。select distinct depart from teacherLinq:from t in Tea</summary><published>2012-01-16T03:52:00Z</published><updated>2012-01-16T03:52:00Z</updated><author><name>独孤伤</name><uri>http://www.cnblogs.com/zhangchenliang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhangchenliang/archive/2012/01/16/2323455.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhangchenliang/archive/2012/01/16/2323455.html"/><content type="html">&lt;p&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;查询&lt;/span&gt;&lt;span&gt;Student&lt;/span&gt;&lt;span&gt;表中的所有记录的&lt;/span&gt;&lt;span&gt;Sname&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;Ssex&lt;/span&gt;&lt;span&gt;和&lt;/span&gt;&lt;span&gt;Class&lt;/span&gt;&lt;span&gt;列。&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;span&gt;select sname,ssex,class from student&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Linq:&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;from s in Students&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; select new {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s.SNAME,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s.SSEX,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s.CLASS&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Lambda:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Students.Select( s =&amp;gt; new {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SNAME = s.SNAME,SSEX = s.SSEX,CLASS = s.CLASS&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; })&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;2&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;查询教师所有的单位即不重复的&lt;/span&gt;&lt;span&gt;Depart&lt;/span&gt;&lt;span&gt;列。&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;span&gt;select distinct depart from teacher&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Linq:&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;from t in Teachers.Distinct()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; select t.DEPART&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Lambda:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Teachers.Distinct().Select( t =&amp;gt; t.DEPART)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;查询&lt;/span&gt;&lt;span&gt;Student&lt;/span&gt;&lt;span&gt;表的所有记录。&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;span&gt;select * from student&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Linq:&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;from s in Students&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; select s&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Lambda:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Students.Select( s =&amp;gt; s)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;4&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;查询&lt;/span&gt;&lt;span&gt;Score&lt;/span&gt;&lt;span&gt;表中成绩在&lt;/span&gt;&lt;span&gt;60&lt;/span&gt;&lt;span&gt;到&lt;/span&gt;&lt;span&gt;80&lt;/span&gt;&lt;span&gt;之间的所有记录。&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;span&gt;select * from score where degree between 60 and 80&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Linq:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from s in Scores&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; where s.DEGREE &amp;gt;= 60 &amp;amp;&amp;amp; s.DEGREE &amp;lt; 80&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; select s&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Lambda:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Scores.Where(&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s =&amp;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;&amp;nbsp;&amp;nbsp;&amp;nbsp; s.DEGREE &amp;gt;= 60 &amp;amp;&amp;amp; s.DEGREE &amp;lt; 80&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;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; )&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;查询&lt;/span&gt;&lt;span&gt;Score&lt;/span&gt;&lt;span&gt;表中成绩为&lt;/span&gt;&lt;span&gt;85&lt;/span&gt;&lt;span&gt;，&lt;/span&gt;&lt;span&gt;86&lt;/span&gt;&lt;span&gt;或&lt;/span&gt;&lt;span&gt;88&lt;/span&gt;&lt;span&gt;的记录。&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;span&gt;select * from score where degree in (85,86,88)&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Linq:&lt;br /&gt;In&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from s in Scores&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; where (&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; new decimal[]{85,86,88}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ).Contains(s.DEGREE)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; select s&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Lambda:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Scores.Where( s =&amp;gt; new Decimal[] {85,86,88}.Contains(s.DEGREE))&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Not in&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from s in Scores&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; where !(&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; new decimal[]{85,86,88}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ).Contains(s.DEGREE)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; select s&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Lambda:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Scores.Where( s =&amp;gt; !(new Decimal[]{85,86,88}.Contains(s.DEGREE)))&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Any()&lt;/span&gt;&lt;span&gt;应用：双表进行&lt;/span&gt;&lt;span&gt;Any&lt;/span&gt;&lt;span&gt;时，必须是主键为&lt;/span&gt;&lt;span&gt;(String)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CustomerDemographics CustomerTypeID&lt;/span&gt;&lt;span&gt;（&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;）&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CustomerCustomerDemos (CustomerID CustomerTypeID) (String)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;一个主键与二个主建进行&lt;/span&gt;&lt;span&gt;Any(&lt;/span&gt;&lt;span&gt;或者是一对一关键进行&lt;/span&gt;&lt;span&gt;Any)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;不可，以二个主键于与一个主键进行&lt;/span&gt;&lt;span&gt;Any&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from e in CustomerDemographics&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; where !e.CustomerCustomerDemos.Any()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; select e&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from c in Categories&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; where !c.Products.Any()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; select c&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;6&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;查询&lt;/span&gt;&lt;span&gt;Student&lt;/span&gt;&lt;span&gt;表中&lt;/span&gt;&lt;span&gt;"95031"&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;/span&gt;&lt;span&gt;的同学记录。&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;span&gt;select * from student where class ='95031' or ssex= N'&lt;/span&gt;&lt;/span&gt;&lt;span&gt;女&lt;/span&gt;&lt;span&gt;'&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;Linq:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from s in Students&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; where s.CLASS == "95031"&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; || s.CLASS == "&lt;/span&gt;&lt;span&gt;女&lt;/span&gt;&lt;span&gt;"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; select s&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;Lambda:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Students.Where(s =&amp;gt; ( s.CLASS == "95031" || s.CLASS == "&lt;/span&gt;&lt;span&gt;女&lt;/span&gt;&lt;span&gt;"))&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;7&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;以&lt;/span&gt;&lt;span&gt;Class&lt;/span&gt;&lt;span&gt;降序查询&lt;/span&gt;&lt;span&gt;Student&lt;/span&gt;&lt;span&gt;表的所有记录。&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;span&gt;select * from student order by Class DESC&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Linq:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from s in Students&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; orderby s.CLASS descending&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; select s&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Lambda:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Students.OrderByDescending(s =&amp;gt; s.CLASS)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;8&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;以&lt;/span&gt;&lt;span&gt;Cno&lt;/span&gt;&lt;span&gt;升序、&lt;/span&gt;&lt;span&gt;Degree&lt;/span&gt;&lt;span&gt;降序查询&lt;/span&gt;&lt;span&gt;Score&lt;/span&gt;&lt;span&gt;表的所有记录。&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;span&gt;select * from score order by Cno ASC,Degree DESC&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Linq:(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;这里&lt;/span&gt;&lt;span&gt;&lt;span&gt;Cno ASC&lt;/span&gt;&lt;span&gt;在&lt;/span&gt;&lt;span&gt;linq&lt;/span&gt;&lt;span&gt;中要写在最外面&lt;/span&gt;&lt;span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from s in Scores&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; orderby s.DEGREE descending&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; orderby s.CNO ascending&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; select s&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Lambda:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Scores.OrderByDescending( s =&amp;gt; s.DEGREE)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .OrderBy( s =&amp;gt; s.CNO)&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;9&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;查询&lt;/span&gt;&lt;span&gt;"95031"&lt;/span&gt;&lt;span&gt;班的学生人数。&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;span&gt;select count(*) from student where class = '95031'&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Linq:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&amp;nbsp;&amp;nbsp;&amp;nbsp; from s in Students&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where s.CLASS == "95031"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select s&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ).Count()&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Lambda:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Students.Where( s =&amp;gt; s.CLASS == "95031" )&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; .Select( s =&amp;gt; s)&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; .Count()&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;10&lt;/span&gt;&lt;span&gt;、查询&lt;/span&gt;&lt;span&gt;Score&lt;/span&gt;&lt;span&gt;表中的最高分的学生学号和课程号。&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;span&gt;select distinct s.Sno,c.Cno from student as s,course as c ,score as sc&amp;nbsp;&lt;br /&gt;where s.sno=(select sno from score where degree = (select max(degree) from score))&lt;br /&gt;and c.cno = (select cno from score where degree = (select max(degree) from score))&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Linq:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from s in Students&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from c in Courses&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from sc in Scores&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; let maxDegree = (from sss in Scores&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; select sss.DEGREE&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; ).Max()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; let sno = (from ss in Scores&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; where ss.DEGREE == maxDegree&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; select ss.SNO).Single().ToString()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; let cno = (from ssss in Scores&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; where ssss.DEGREE == maxDegree&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; select ssss.CNO).Single().ToString()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where s.SNO == sno &amp;amp;&amp;amp; c.CNO == cno&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select new {&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; s.SNO,&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; c.CNO&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ).Distinct()&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;操作时问题？执行时报错：&lt;/span&gt;&lt;span&gt;&amp;nbsp;where s.SNO == sno&lt;/span&gt;&lt;span&gt;（这行报出来的）&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;运算符&lt;/span&gt;&lt;span&gt;"=="&lt;/span&gt;&lt;span&gt;无法应用于&lt;/span&gt;&lt;span&gt;"string"&lt;/span&gt;&lt;span&gt;和&lt;/span&gt;&lt;span&gt;"System.Linq.IQueryable&amp;lt;string&amp;gt;"&lt;/span&gt;&lt;span&gt;类型的操作数&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;解决：&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;原：&lt;/span&gt;&lt;span&gt;let sno = (from ss in Scores&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; where ss.DEGREE == maxDegree&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; select ss.SNO).ToString()&lt;br /&gt;Queryable().Single()&lt;/span&gt;&lt;span&gt;返回序列的唯一元素；如果该序列并非恰好包含一个元素，则会引发异常。&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;解：&lt;/span&gt;&lt;span&gt;let sno = (from ss in Scores&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; where ss.DEGREE == maxDegree&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; select ss.SNO).Single().ToString()&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;11&lt;/span&gt;&lt;span&gt;、查询&lt;/span&gt;&lt;span&gt;'3-105'&lt;/span&gt;&lt;span&gt;号课程的平均分。&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;span&gt;select avg(degree) from score where cno = '3-105'&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Linq:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from s in Scores&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where s.CNO == "3-105"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select s.DEGREE&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ).Average()&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Lambda:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Scores.Where( s =&amp;gt; s.CNO == "3-105")&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; .Select( s =&amp;gt; s.DEGREE)&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; .Average()&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;12&lt;/span&gt;&lt;span&gt;、查询&lt;/span&gt;&lt;span&gt;Score&lt;/span&gt;&lt;span&gt;表中至少有&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;名学生选修的并以&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;开头的课程的平均分数。&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;span&gt;select avg(degree) from score where cno like '3%' group by Cno having count(*)&amp;gt;=5&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Linq:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from s in Scores&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where s.CNO.StartsWith("3")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; group s by s.CNO&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; into cc&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where cc.Count() &amp;gt;= 5&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select cc.Average( c =&amp;gt; c.DEGREE)&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Lambda:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Scores.Where( s =&amp;gt; s.CNO.StartsWith("3") )&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; .GroupBy( s =&amp;gt; s.CNO )&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; .Where( cc =&amp;gt; ( cc.Count() &amp;gt;= 5) )&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; .Select( cc =&amp;gt; cc.Average( c =&amp;gt; c.DEGREE) )&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Linq: SqlMethod&lt;br /&gt;like&lt;/span&gt;&lt;/span&gt;&lt;span&gt;也可以这样写&lt;/span&gt;&lt;span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; s.CNO.StartsWith("3") or SqlMethods.Like(s.CNO,"%3")&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;13&lt;/span&gt;&lt;span&gt;、查询最低分大于&lt;/span&gt;&lt;span&gt;70&lt;/span&gt;&lt;span&gt;，最高分小于&lt;/span&gt;&lt;span&gt;90&lt;/span&gt;&lt;span&gt;的&lt;/span&gt;&lt;span&gt;Sno&lt;/span&gt;&lt;span&gt;列。&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;span&gt;select sno from score group by sno having min(degree) &amp;gt; 70 and max(degree) &amp;lt; 90&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Linq:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from s in Scores&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; group s by s.SNO&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; into ss&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; where ss.Min(cc =&amp;gt; cc.DEGREE) &amp;gt; 70 &amp;amp;&amp;amp; ss.Max( cc =&amp;gt; cc.DEGREE) &amp;lt; 90&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; select new&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sno = ss.Key&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Lambda:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Scores.GroupBy (s =&amp;gt; s.SNO)&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; .Where (ss =&amp;gt; ((ss.Min (cc =&amp;gt; cc.DEGREE) &amp;gt; 70) &amp;amp;&amp;amp; (ss.Max (cc =&amp;gt; cc.DEGREE) &amp;lt; 90)))&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; .Select ( ss =&amp;gt; new {&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; sno = ss.Key&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; })&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;14&lt;/span&gt;&lt;span&gt;、查询所有学生的&lt;/span&gt;&lt;span&gt;Sname&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;Cno&lt;/span&gt;&lt;span&gt;和&lt;/span&gt;&lt;span&gt;Degree&lt;/span&gt;&lt;span&gt;列。&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;span&gt;select s.sname,sc.cno,sc.degree from student as s,score as sc where s.sno = sc.sno&lt;br /&gt;&lt;/span&gt;Linq:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;from s in Students&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; join sc in Scores&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; on s.SNO equals sc.SNO&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; select new&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s.SNAME,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sc.CNO,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sc.DEGREE&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Lambda:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Students.Join(Scores, s =&amp;gt; s.SNO,&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; sc =&amp;gt; sc.SNO,&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;&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; (s,sc) =&amp;gt; new{&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;&amp;nbsp;SNAME = s.SNAME,&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; CNO = sc.CNO,&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; DEGREE = sc.DEGREE&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; })&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;15&lt;/span&gt;&lt;span&gt;、查询所有学生的&lt;/span&gt;&lt;span&gt;Sno&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;Cname&lt;/span&gt;&lt;span&gt;和&lt;/span&gt;&lt;span&gt;Degree&lt;/span&gt;&lt;span&gt;列。&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;span&gt;select sc.sno,c.cname,sc.degree from course as c,score as sc where c.cno = sc.cno&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Linq:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from c in Courses&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; join sc in Scores&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; on c.CNO equals sc.CNO&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; select new&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sc.SNO,c.CNAME,sc.DEGREE&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Lambda:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Courses.Join ( Scores, c =&amp;gt; c.CNO,&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;&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; sc =&amp;gt; sc.CNO,&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;&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; (c, sc) =&amp;gt; new&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;&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;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; SNO = sc.SNO,&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;&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; CNAME = c.CNAME,&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;&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; DEGREE = sc.DEGREE&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; })&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;16&lt;/span&gt;&lt;span&gt;、查询所有学生的&lt;/span&gt;&lt;span&gt;Sname&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;Cname&lt;/span&gt;&lt;span&gt;和&lt;/span&gt;&lt;span&gt;Degree&lt;/span&gt;&lt;span&gt;列。&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;span&gt;select s.sname,c.cname,sc.degree from student as s,course as c,score as sc where s.sno = sc.sno and c.cno = sc.cno&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Linq:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from s in Students&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from c in Courses&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from sc in Scores&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; where s.SNO == sc.SNO &amp;amp;&amp;amp; c.CNO == sc.CNO&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; select new { s.SNAME,c.CNAME,sc.DEGREE }&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span&gt;主要参考文章链接：&lt;a href="http://www.cnblogs.com/RuiLei/archive/2008/11/09/1329905.html"&gt;&lt;span&gt;http://www.cnblogs.com/RuiLei/archive/2008/11/09/1329905.html&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/zhangchenliang/aggbug/2323455.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhangchenliang/archive/2012/01/16/2323455.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
