<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_Dozer .NET 技术博客</title><subtitle type="text">没有最强的个人，只有最强的团队</subtitle><id>http://feed.cnblogs.com/blog/u/66712/rss</id><updated>2012-03-14T14:05:45Z</updated><author><name>Dozer</name><uri>http://www.cnblogs.com/dozer/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dozer/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/66712/rss"/><entry><id>http://www.cnblogs.com/dozer/archive/2012/03/14/async-and-await-in-asp-net-beta.html</id><title type="text">不要在 ASP.NET 4.5 Beta 的 Page 类事件上直接使用 async 与 await</title><summary type="text">欢迎到我的博客中阅读独立版本：http://www.dozer.cc/2012/03/async-and-await-in-asp-net-beta/发现问题在我的上一篇文章《async 与 await 在 Web 下的应用》中，我提到了 asp.net 4.5 在 Web.Config 中的一个奇怪配置：&lt;appSettings&gt; &lt;add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /&gt;&lt;/appSettings&gt;在Stack Ov</summary><published>2012-03-14T12:10:00Z</published><updated>2012-03-14T12:10:00Z</updated><author><name>Dozer</name><uri>http://www.cnblogs.com/dozer/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dozer/archive/2012/03/14/async-and-await-in-asp-net-beta.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dozer/archive/2012/03/14/async-and-await-in-asp-net-beta.html"/><content type="html">&lt;p&gt;欢迎到我的博客中阅读独立版本：&lt;a href="http://www.dozer.cc/2012/03/async-and-await-in-asp-net-beta/"&gt;http://www.dozer.cc/2012/03/async-and-await-in-asp-net-beta/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;发现问题&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在我的上一篇文章&lt;a href="http://www.dozer.cc/2012/03/async-and-await-in-web-application/" target="_blank"&gt;&lt;strong&gt;《async 与 await 在 Web 下的应用》&lt;/strong&gt;&lt;/a&gt;中，我提到了 asp.net 4.5 在 Web.Config 中的一个奇怪配置：&lt;/p&gt;&amp;lt;appSettings&amp;gt;&lt;br/&gt;  &amp;lt;add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /&amp;gt;&lt;br/&gt;&amp;lt;/appSettings&amp;gt;&lt;p&gt;在&amp;nbsp;&lt;a href="http://stackoverflow.com/questions/9562836/whats-the-meaning-of-usetaskfriendlysynchronizationcontext" target="_blank"&gt;&lt;strong&gt;Stack Overflow&lt;/strong&gt;&lt;/a&gt;&amp;nbsp;上提问后，终于有人回答我了。&lt;/p&gt;&lt;p&gt;看了别人的回复后，才发现了我上篇文章中的问题。&lt;/p&gt;&lt;p&gt;下面代码中的这种用法是错误的：&lt;/p&gt;protected async void Page_Load(object sender, EventArgs e)&lt;br/&gt;{&lt;br/&gt;    WebClient client = new WebClient();&lt;br/&gt;    var result1 = await client.DownloadStringTaskAsync("http://www.website.com");&lt;br/&gt;    WebClient client2 = new WebClient();&lt;br/&gt;    var result2 = await client.DownloadStringTaskAsync(result1);&lt;br/&gt;    //do more&lt;br/&gt;}&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;在事件上直接使用 async 引发的错误&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;代码段一：&lt;/strong&gt;&lt;/p&gt;public partial class WebForm1 : System.Web.UI.Page&lt;br/&gt;{&lt;br/&gt;    protected string Msg { get; set; }&lt;br/&gt;    protected async void Page_Load(object sender, EventArgs e)&lt;br/&gt;    {&lt;br/&gt;        using (WebService service = new WebService())&lt;br/&gt;        {&lt;br/&gt;            Msg = await service.Method1TaskSync();&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    protected async void Button_Test_Click(object sender, EventArgs e)&lt;br/&gt;    {&lt;br/&gt;        using (WebService service = new WebService())&lt;br/&gt;        {&lt;br/&gt;            Msg = await service.Method2TaskSync();&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;}&lt;p&gt;试问，最后的 Msg 的值是什么？应该是哪个方法的返回值？&lt;/p&gt;&lt;p&gt;如果去掉异步，那答案肯定是 Method2。那加上异步后呢？&lt;/p&gt;&lt;p&gt;这里用的是 async 和 await 来实现了异步，所以逻辑上的先后次序应该和代码上的先后次序一样。&lt;/p&gt;&lt;p&gt;但是上述代码两个事件会一起执行！导致了一定的问题！&lt;/p&gt;&lt;p&gt;总结一下上面代码的问题：当页面中的 Page_Load 事件和别的事件都用了 async 和 await 后会出现执行次序错误、死锁等问题。它们并不会按次序执行。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;代码段二：&lt;/strong&gt;&lt;/p&gt;&amp;lt;appSettings&amp;gt;&lt;br/&gt;  &amp;lt;add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /&amp;gt;&lt;br/&gt;&amp;lt;/appSettings&amp;gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&amp;lt;%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="AsyncAwait.WebForm1"&lt;br/&gt;    Async="true" %&amp;gt;&lt;br/&gt;&lt;br/&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;br/&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&lt;br/&gt;&amp;lt;head runat="server"&amp;gt;&lt;br/&gt;    &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;&lt;br/&gt;&amp;lt;/head&amp;gt;&lt;br/&gt;&amp;lt;body&amp;gt;&lt;br/&gt;    &amp;lt;form id="form1" runat="server"&amp;gt;&lt;br/&gt;    &amp;lt;div&amp;gt;&lt;br/&gt;        &amp;lt;%:Msg %&amp;gt;&lt;br/&gt;    &amp;lt;/div&amp;gt;&lt;br/&gt;    &amp;lt;/form&amp;gt;&lt;br/&gt;&amp;lt;/body&amp;gt;&lt;br/&gt;&amp;lt;/html&amp;gt;&lt;p&gt;后端代码和上面一样的代码，只不过把&amp;nbsp;UseTaskFriendlySynchronizationContext 的配置改成了 true，并且把数据显示到了页面上。&lt;/p&gt;&lt;p&gt;执行后发现：根本无法显示内容，页面在异步执行结束前就已经输出完毕了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;UseTaskFriendlySynchronizationContext 的作用和错误引发的原因&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;其实在老外的回答中已经说明了全部，我这里主要是翻译+精简一下。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;UseTaskFriendlySynchronizationContext 的作用：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;之前版本的 asp.net 所使用的异步不符合 CLR 的规范，而只有 RegisterAsyncTask&amp;nbsp;这个方法是符合 CLR 规范的。&lt;/p&gt;&lt;p&gt;所以 asp.net 4.5 中，加入这个新的配置是为了禁用掉之前不符合约定的功能，只要把这个配置设置为了 true，别的异步方案全部会失效。（代码段二主要就是演示了这个现象）&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;引发错误的原因：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;async 和 await 关键字在底层主要是利用 SynchronizationContext 来实现了异步。（具体原理我也没研究过）&lt;/p&gt;&lt;p&gt;而这个方案首先不符合 CLR 规范，另外也会引起很多问题。（代码段一主要就是演示了其中一个问题）&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;目前正确的写法&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;首先，建议把 UseTaskFriendlySynchronizationContext&amp;nbsp;设置为 true。&lt;/p&gt;&lt;p&gt;另外，正确的写法如下：&lt;/p&gt;public partial class WebForm1 : System.Web.UI.Page&lt;br/&gt;{&lt;br/&gt;    protected string Msg { get; set; }&lt;br/&gt;    protected void Page_Load(object sender, EventArgs e)&lt;br/&gt;    {&lt;br/&gt;        RegisterAsyncTask(new PageAsyncTask(Method1));&lt;br/&gt;&lt;br/&gt;    }&lt;br/&gt;    private async Task Method1()&lt;br/&gt;    {&lt;br/&gt;        using (WebService service = new WebService())&lt;br/&gt;        {&lt;br/&gt;            Msg = await service.HelloWorldTaskSync();&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    protected void Button_Test_Click(object sender, EventArgs e)&lt;br/&gt;    {&lt;br/&gt;        RegisterAsyncTask(new PageAsyncTask(Method2));&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    private async Task Method2()&lt;br/&gt;    {&lt;br/&gt;        using (WebService service = new WebService())&lt;br/&gt;        {&lt;br/&gt;            Msg = await service.HelloWorldTaskSync();&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;}&lt;p&gt;如果需要写异步，一定要用&amp;nbsp;RegisterAsyncTask 方法，实测证明，支持多次调用，而且会按次序执行。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;老外说了，他们也想直接在事件上加 async 来写，但是由于技术原因并没有实现，希望在正式版或者未来的版本中可以实现吧！&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;参考资料：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://stackoverflow.com/questions/9562836/whats-the-meaning-of-usetaskfriendlysynchronizationcontext" target="_blank"&gt;http://stackoverflow.com/questions/9562836/whats-the-meaning-of-usetaskfriendlysynchronizationcontext&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://social.msdn.microsoft.com/Forums/en-NZ/async/thread/b2e8c51e-2808-46d0-92e9-b825321d0af8" target="_blank"&gt;http://social.msdn.microsoft.com/Forums/en-NZ/async/thread/b2e8c51e-2808-46d0-92e9-b825321d0af8&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/dozer/aggbug/2396509.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/dozer/archive/2012/03/14/async-and-await-in-asp-net-beta.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/dozer/archive/2012/03/06/async-and-await-in-web-application.html</id><title type="text">async 与 await 在 Web 下的应用</title><summary type="text">关于 .net 的异步，一篇文章是讲不完的，我这里就贴两篇文章让大家看一下：《正确使用异步操作》、《C#客户端的异步操作》、《细说ASP.NET的各种异步操作》另外，在 .net 4.0 中还推出了新的任务并行库（TPL），也是一种新异步模式：《任务并行库》最后，.net 4.5 又推出了全新的 async 和 await 关键字：《C#与Visual Basic的未来（上）》《C#与Visual Basic的未来（中）》《C#与Visual Basic的未来（下）》 最后，在这几篇文章的基础上，想和大家谈谈 async 和 await 在 Web 下的应用，包括 WebForm 和 MVC。</summary><published>2012-03-06T11:39:00Z</published><updated>2012-03-06T11:39:00Z</updated><author><name>Dozer</name><uri>http://www.cnblogs.com/dozer/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dozer/archive/2012/03/06/async-and-await-in-web-application.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dozer/archive/2012/03/06/async-and-await-in-web-application.html"/><content type="html">&lt;p&gt;原文地址：&lt;a href="http://www.dozer.cc/2012/03/async-and-await-in-web-application/"&gt;http://www.dozer.cc/2012/03/async-and-await-in-web-application/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;欢迎大家到我的博客中查看，排版会更舒服一点！&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;.net 中的异步&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;关于 .net 的异步，一篇文章是讲不完的，我这里就贴两篇文章让大家看一下：&lt;/p&gt;&lt;p&gt;&lt;a href="http://blog.zhaojie.me/2008/02/use-async-operation-properly.html" target="_blank"&gt;&lt;strong&gt;《正确使用异步操作》&lt;/strong&gt;&lt;/a&gt;、&lt;a href="http://www.cnblogs.com/fish-li/archive/2011/10/23/2222013.html" target="_blank"&gt;&lt;strong&gt;《C#客户端的异步操作》&lt;/strong&gt;&lt;/a&gt;、&lt;strong&gt;&lt;a href="http://www.cnblogs.com/fish-li/archive/2011/11/20/2256385.html" target="_blank"&gt;《细说ASP.NET的各种异步操作》&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;另外，在 .net 4.0 中还推出了新的任务并行库（TPL），也是一种新异步模式：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/dd460717.aspx" target="_blank"&gt;《任务并行库》&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;最后，.net 4.5 又推出了全新的 async 和 await 关键字：&lt;/p&gt;&lt;p&gt;&lt;a href="http://blog.zhaojie.me/2010/10/pdc2010-the-future-of-csharp-and-vb-by-anders-hejlsberg-1.html" target="_blank"&gt;&lt;strong&gt;《C#与Visual Basic的未来（上）》&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://blog.zhaojie.me/2010/10/pdc2010-the-future-of-csharp-and-vb-by-anders-hejlsberg-2.html" target="_blank"&gt;&lt;strong&gt;《C#与Visual Basic的未来（中）》&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://blog.zhaojie.me/2010/11/pdc2010-the-future-of-csharp-and-vb-by-anders-hejlsberg-3.html" target="_blank"&gt;《C#与Visual Basic的未来（下）》&amp;nbsp;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;最后，在这几篇文章的基础上，想和大家谈谈 async 和 await 在 Web 下的应用，包括&amp;nbsp;&lt;a href="http://zh.wikipedia.org/wiki/ASP.NET" target="_blank"&gt;&lt;strong&gt;WebForm&lt;/strong&gt;&lt;/a&gt;&amp;nbsp;和&amp;nbsp;&lt;a href="http://zh.wikipedia.org/wiki/ASP.NET_MVC_Framework" target="_blank"&gt;&lt;strong&gt;MVC&lt;/strong&gt;&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;async 与 await 的简单介绍&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;仔细看完老赵的《C#与Visual Basic的未来》大家应该都能明白这两个关键字的作用是什么了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;适用条件：只能适用于TPL异步模式&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;传统的方法返回的就是需要返回的内容，而基于TPL模式的异步，返回的都是 Task&amp;lt;T&amp;gt;，其中的 T 类型就是你需要返回内容的类型。&lt;/p&gt;&lt;p&gt;在&amp;nbsp;&lt;a href="http://www.microsoft.com/visualstudio/11/zh-cn" target="_blank"&gt;&lt;strong&gt;Visual Studio 11&lt;/strong&gt;&lt;/a&gt;&amp;nbsp;中，只要你调用的某个方法返回的类型是 Task 或者 Task&amp;lt;T&amp;gt;，它就会提示这是一个可等待的方法。&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.dozer.cc/wp-content/uploads/2012/03/canwait.png"&gt;&lt;img class="alignnone size-full wp-image-664" title="canwait" src="http://www.dozer.cc/wp-content/uploads/2012/03/canwait.png" alt="" width="499" height="132" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;这时候，就可以利用 async 和 await 关键字了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;场景：解决基于事件的异步中回调函数嵌套使用中的问题&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;假设有这样一个场景，一个 C# 应用程序中（WinForm Or WPF）我需要从一个网站上下载一个内容，然后再根据内容里的网址再下载里面的内容。&lt;/p&gt;&lt;p&gt;如果直接利用 WebClient 的 DownloadString 方法，很明显 UI 线程会被阻塞，没人会这么做。&lt;/p&gt;&lt;p&gt;如果只是一次下载，那利用 WebClient 的 DownloadStringAsync 就可以轻松解决了，但是如果是想这样需要两次下载，而且两次下载是有关联的呢？如果是三次四次呢？&lt;/p&gt;&lt;p&gt;我们先来看看用基于事件的异步来实现：&lt;/p&gt;protected void DownloadAsync()&lt;br/&gt;{&lt;br/&gt;    WebClient client = new WebClient();&lt;br/&gt;    client.DownloadStringCompleted += client_DownloadStringCompleted;&lt;br/&gt;    client.DownloadStringAsync(new Uri("http://www.website.com"));&lt;br/&gt;}&lt;br/&gt;void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)&lt;br/&gt;{&lt;br/&gt;    WebClient client = new WebClient();&lt;br/&gt;    client.DownloadStringCompleted+=client_DownloadStringCompleted2;&lt;br/&gt;    client.DownloadStringAsync(new Uri(e.Result));&lt;br/&gt;}&lt;br/&gt;void client_DownloadStringCompleted2(object sender, DownloadStringCompletedEventArgs e)&lt;br/&gt;{&lt;br/&gt;    var result = e.Result;//最终结果&lt;br/&gt;    //do more&lt;br/&gt;}&lt;p&gt;下面再来看看用 async 和 await 来实现：&lt;/p&gt;protected async void DownloadTaskAsync() {&lt;br/&gt;    WebClient client = new WebClient();&lt;br/&gt;    var result1 = await client.DownloadStringTaskAsync("http://www.website.com");&lt;br/&gt;    WebClient client2 = new WebClient();&lt;br/&gt;    var result2 = await client.DownloadStringTaskAsync(result1);&lt;br/&gt;    //do more&lt;br/&gt;}&lt;p&gt;是不是简单多了？&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;在 WebForm 和 MVC 中使用 async 和 await&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在 .net 4.5 中，最新的 WebForm 和 MVC 都已经支持这两个关键字了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;在 asp.net WebForm 中：&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;首先新建一个页面&lt;/li&gt;&lt;li&gt;打开 aspx 文件，然后再顶部的属性中加入：Async="true"&lt;/li&gt;&lt;li&gt;接下来在任何一个事件中，加入这两个关键字即可&lt;/li&gt;&lt;li&gt;另外在 Web.Config 中有两个奇怪的配置，有可能会导致出错，去掉有正常，这两个配置具体有什么用，我已经在&amp;nbsp;&lt;a href="http://stackoverflow.com/questions/9562836/whats-the-meaning-of-usetaskfriendlysynchronizationcontext" target="_blank"&gt;&lt;strong&gt;StackOverFlow&lt;/strong&gt;&lt;/a&gt;&amp;nbsp;上问别人了&lt;/li&gt;&lt;/ol&gt;protected async void Page_Load(object sender, EventArgs e)&lt;br/&gt;{&lt;br/&gt;    WebClient client = new WebClient();&lt;br/&gt;    var result1 = await client.DownloadStringTaskAsync("http://www.website.com");&lt;br/&gt;    WebClient client2 = new WebClient();&lt;br/&gt;    var result2 = await client.DownloadStringTaskAsync(result1);&lt;br/&gt;    //do more&lt;br/&gt;}&lt;p&gt;&lt;strong&gt;在 asp.net MVC 中：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;把原来继承于&amp;nbsp;Controller 改成继承于 AsyncController&lt;/p&gt;&lt;p&gt;在方法前加上 async，并把返回类型改成 Task&amp;lt;T&amp;gt;&lt;/p&gt;public class HomeController : AsyncController&lt;br/&gt;{&lt;br/&gt;    public async Task&amp;lt;ActionResult&amp;gt; Test()&lt;br/&gt;    {&lt;br/&gt;        var result = await Task.Run(() =&amp;gt;&lt;br/&gt;        {&lt;br/&gt;            Thread.Sleep(5000);&lt;br/&gt;            return "hello";&lt;br/&gt;        });&lt;br/&gt;        return Content(result);&lt;br/&gt;    }&lt;br/&gt;}&lt;p&gt;&lt;strong&gt;&amp;nbsp;在 IHttpHandlder 中：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;微软官方的 .net 4.5&amp;nbsp;&lt;a href="http://www.asp.net/vnext/overview/whitepapers/whats-new#_Toc318097378" target="_blank"&gt;&lt;strong&gt;releace note&lt;/strong&gt;&lt;/a&gt;&amp;nbsp;中已经提到了：&lt;/p&gt;public class MyAsyncHandler : HttpTaskAsyncHandler&lt;br/&gt;{&lt;br/&gt;    // ...&lt;br/&gt;&lt;br/&gt;    // ASP.NET automatically takes care of integrating the Task based override&lt;br/&gt;    // with the ASP.NET pipeline.&lt;br/&gt;    public override async Task ProcessRequestAsync(HttpContext context)&lt;br/&gt;    {&lt;br/&gt;        WebClient wc = new WebClient();&lt;br/&gt;        var result = await&lt;br/&gt;            wc.DownloadStringTaskAsync("http://www.microsoft.com");&lt;br/&gt;        // Do something with the result&lt;br/&gt;    }&lt;br/&gt;}&lt;p&gt;&lt;strong&gt;&amp;nbsp;在 IHttpModule&amp;nbsp;中：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;同样是微软官方的 .net 4.5&amp;nbsp;&lt;a href="http://www.asp.net/vnext/overview/whitepapers/whats-new#_Toc318097377" target="_blank"&gt;&lt;strong&gt;releace note&lt;/strong&gt;&lt;/a&gt;&amp;nbsp;中，实现起来有点复杂，大家可以自己去看看。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;在 Web 应用程序中使用 async 和 await 的注意事项&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;其实不仅仅是使用这两个关键字的注意事项，而是在 Web 中只要用到了异步页，就要注意一下问题！&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Web 本来就是多线程的，为什么还要用异步编程？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;多线程只是实现异步的一种手段，的确，Web 本来就是多线程的，所以在很多时候不用异步也没什么问题。一般也不会有问题，只是有更好的方案。&lt;/p&gt;&lt;p&gt;大家看完&lt;strong&gt;&lt;a href="http://blog.zhaojie.me/2008/02/use-async-operation-properly.html" target="_blank"&gt;《正确使用异步操作》&lt;/a&gt;&lt;/strong&gt;后就会知道，异步有多种实现方式，但是它们底层只有两种类型，一种是：&amp;ldquo;Compute-Bound Operation&amp;rdquo;，另一种是&amp;ldquo;IO-Bound Operation&amp;rdquo;。（具体的可以到文中查看）&lt;/p&gt;&lt;p&gt;在 Web 中，使用异步去处理&amp;ldquo;Compute-Bound Operation&amp;rdquo;是没有意义的，因为 Web 本来就是多线程的，这样做没有任何效率上的提升。（除非你在处理这个异步的时候，不需要等待这个异步执行结束就可以返回页面内容）&lt;/p&gt;&lt;p&gt;所以，在 Web 中，只有当你需要面对&amp;ldquo;IO-Bound Operation&amp;rdquo;的时候，去用异步页才是真的有用的。因为它是在等待磁盘或者网络响应，并不占据资源，甚至不占据工作线程。&lt;/p&gt;&lt;p&gt;如何区分呢？那篇文章中已经写了，另外，大部分和磁盘&amp;amp;网络打交道的异步操作都是&amp;ldquo;IO-Bound Operation&amp;rdquo;的。&lt;/p&gt;&lt;p&gt;但是，如果你真的想要提升效率，还需要你亲自去测试一下，因为要实现&amp;ldquo;IO-Bound Operation&amp;rdquo;有一定的条件。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;WebClient、WebService 和 WCF 支持吗？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;经过测试，上面这三种 Web 应用程序中使用最多的，是支持&amp;ldquo;IO-Bound Operation&amp;rdquo;的。其中，在 .net 4.5 中，WebClient 和 WCF 可以直接支持 async 和 await 关键字。（因为它们有相关的方法可以返回 Task 对象）&lt;/p&gt;&lt;p&gt;而 WebService（微软不建议使用，但实际上还在被大量的应用），却不支持，但是可以通过写一些代码后让它支持。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;数据库操作支持吗？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;经过一定的配置后，它是可以支持的，但是具体的还需要进行大量的测试，毕竟不是调用几个方法那么简单。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;如何把传统的异步模式转换成 TPL 模式，以实现 async 和 await&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;上面提到了 WebService 并没有实现 TPL 模式，在 .net 4.5 中引用 WebService 后实现的是基于事件的异步。&lt;/p&gt;&lt;p&gt;&lt;span data-mce-=""&gt;（.net 2.0 以上程序在引用 WebService 的时候，需要点&amp;ldquo;添加服务引用&amp;rdquo;&amp;mdash;&amp;mdash;&amp;ldquo;高级&amp;rdquo;&amp;mdash;&amp;mdash;&amp;ldquo;添加Web引用&amp;rdquo;，如果直接在服务引用中添加，会出现一定的问题。并且，就算你添加了，它也没有帮你实现基于 TPL 的异步。）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;如何把 APM 模式转换成 TPL 模式？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;其实微软在这篇文章中已经写过如何把传统的异步模式转换成 TPL 模式了：&lt;a href="http://msdn.microsoft.com/ZH-CN/library/dd997423(VS.110).aspx" target="_blank"&gt;&lt;strong&gt;TPL 和传统 .NET 异步编程&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;其中 APM 转 TPL 比较简单，我就不多介绍了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;如何把 EAP 模式转换成 TPL 模式？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;EAP 就是基于事件的异步，上面那篇文章中其实也提到了，但是写的并不是很清楚。&lt;/p&gt;&lt;p&gt;下面我用一段简化的代码来实现 EAP 转 TPL：&lt;/p&gt;namespace WebServiceAdapter.MyWebService&lt;br/&gt;{&lt;br/&gt;    public partial class WebService&lt;br/&gt;    {&lt;br/&gt;        /// &amp;lt;summary&amp;gt;&lt;br/&gt;        /// 无 CancellationToken 的调用&lt;br/&gt;        /// &amp;lt;/summary&amp;gt;&lt;br/&gt;        /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br/&gt;        public Task&amp;lt;string&amp;gt; HelloWorldTaskSync()&lt;br/&gt;        {&lt;br/&gt;            return HelloWorldTaskSync(new CancellationToken());&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        /// &amp;lt;summary&amp;gt;&lt;br/&gt;        /// 有 CancellationToken 的调用&lt;br/&gt;        /// &amp;lt;/summary&amp;gt;&lt;br/&gt;        /// &amp;lt;param name="token"&amp;gt;&amp;lt;/param&amp;gt;&lt;br/&gt;        /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br/&gt;        public Task&amp;lt;string&amp;gt; HelloWorldTaskSync(CancellationToken token)&lt;br/&gt;        {&lt;br/&gt;            TaskCompletionSource&amp;lt;string&amp;gt; tcs = new TaskCompletionSource&amp;lt;string&amp;gt;();&lt;br/&gt;&lt;br/&gt;            token.Register(() =&amp;gt;&lt;br/&gt;            {&lt;br/&gt;                //注册 CancellationToken&lt;br/&gt;                this.CancelAsync(null);&lt;br/&gt;            });&lt;br/&gt;&lt;br/&gt;            //注册完成事件&lt;br/&gt;            this.HelloWorldCompleted += (object sender, HelloWorldCompletedEventArgs args) =&amp;gt;&lt;br/&gt;            {&lt;br/&gt;                if (args.Cancelled == true)&lt;br/&gt;                {&lt;br/&gt;                    tcs.TrySetCanceled();&lt;br/&gt;                    return;&lt;br/&gt;                }&lt;br/&gt;                else if (args.Error != null)&lt;br/&gt;                {&lt;br/&gt;                    tcs.TrySetException(args.Error);&lt;br/&gt;                    return;&lt;br/&gt;                }&lt;br/&gt;                else&lt;br/&gt;                {&lt;br/&gt;                    tcs.TrySetResult(args.Result);&lt;br/&gt;                }&lt;br/&gt;            };&lt;br/&gt;&lt;br/&gt;            //异步调用&lt;br/&gt;            this.HelloWorldAsync();&lt;br/&gt;&lt;br/&gt;            //返回 Task&lt;br/&gt;            return tcs.Task;&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;}&lt;p&gt;转换好后再去配合使用 async 和 await 关键字就方便多了：&lt;/p&gt;protected async void Page_Load(object sender, EventArgs e)&lt;br/&gt;{&lt;br/&gt;    using (WebService service = new WebService())&lt;br/&gt;    {&lt;br/&gt;        await service.HelloWorldTaskSync();&lt;br/&gt;    }&lt;br/&gt;}&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;性能测试&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;前期准备：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;理论和实际代码都讲完了，是不是该拿出点东西来验证一下了？&lt;/p&gt;&lt;p&gt;在做性能测试的时候我绕了很多弯路，碰到了很多问题，一度让我怀疑它是不是真的可以提升性能。&lt;/p&gt;&lt;p&gt;但最终还是解决了！感谢老赵的一篇文章：&lt;a href="http://blog.zhaojie.me/2009/01/lab-async-request.html" target="_blank"&gt;&lt;strong&gt;体会ASP.NET异步处理请求的效果&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;异步页最大的用处就是在处理&amp;ldquo;IO-Bound Operation&amp;rdquo;的时候可以不占据工作线程。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;测试的理论：&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;限制网站应用程序的工作线程，然后同时请求一个页面，请求数大于工作线程数。&lt;/li&gt;&lt;li&gt;请求的页面会访问一个 WebService ，这个 WebService 会延迟5秒，对于网站来说，这个5秒就是&amp;ldquo;IO-Bound Operation&amp;rdquo;。&lt;/li&gt;&lt;li&gt;如果限制了工作线程数后，异步页所有请求都可以在5秒完成，那说明的确没有占据工作线程。反之则说明理论错误！&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;我一开始限制的工作线程是10，然后同时请求50，但是无论是异步页还是同步页，总耗时都差不多&amp;hellip;&lt;/p&gt;&lt;p&gt;后来仔细看老赵的文章才发现，原来在 Vista &amp;amp; Win7 中最大请求数被限制在10了，所以多于10的请求根本没到达网站应用程序。&lt;/p&gt;&lt;p&gt;最后我把工作线程限制在2，然后同时请求10，终于得到了正确的理论数据！&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;工具准备：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我这里用的工具是 apache 下那只的 ab.exe，简单好用！&lt;/p&gt;&lt;p&gt;另外我也写了相关的代码来支持测试。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;开始测试：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;运行 WebService，提供一个会延时5秒的服务。&lt;/p&gt;&lt;p&gt;然后运行网站，有三个页面：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;NoAsyncPage.aspx ：传统的页面&lt;/li&gt;&lt;li&gt;AsyncPage_IO.aspx：异步页面，和传统页面一样，都是调用 WebService ，但是是用异步调用&lt;/li&gt;&lt;li&gt;AsyncPage_CPU.aspx：为了验证在异步中执行&amp;ldquo;Compute-Bound Operation&amp;rdquo;是没有意义的&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;在CMD中，依次用 ab.exe 调用这三个页面：&lt;/p&gt;ab -c 10 -n 10 http://localhost:6360/noasyncpage.aspx&lt;br/&gt;ab -c 10 -n 10 http://localhost:6360/asyncpage_io.aspx&lt;br/&gt;ab -c 10 -n 10 http://localhost:6360/asyncpage_cpu.aspx&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;最终运行结果如下：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;NoAsyncPage.aspx ：26.39秒&lt;/li&gt;&lt;li&gt;AsyncPage_IO.aspx：5.29秒&lt;/li&gt;&lt;li&gt;AsyncPage_CPU.aspx：26.54秒&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;数据分析：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;仔细分析下数据，会发现都符合理论：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;NoAsyncPage.aspx ：没有采用异步，2个工作线程，10个请求，总事件在10*5/2=25左右。&lt;/li&gt;&lt;li&gt;AsyncPage_IO.aspx：采用异步页，不占据工作线程，10个请求同时执行。&lt;/li&gt;&lt;li&gt;AsyncPage_CPU.aspx：虽然采用了异步页，但是异步的时候依然占据了一个工作线程，而且还多了一些新建线程，切换线程的损耗。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.dozer.cc/wp-content/uploads/2012/03/async.png"&gt;&lt;img class="alignnone size-medium wp-image-665" title="async" src="http://www.dozer.cc/wp-content/uploads/2012/03/async-300x194.png" alt="" width="300" height="194" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;最终结果非常让人满意，特别是AsyncPage_IO.aspx，如果我们把访问量大，并且需要等在磁盘或者是网络的页面都改写成这样，那可以大大减少IIS管线的消耗！&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;源代码和工具下载&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.dozer.cc/wp-content/uploads/2012/03/AsyncSample.zip" target="_blank"&gt;AsyncSample&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;请用 Visual Studio 11 打开&lt;/em&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/dozer/aggbug/2382502.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/dozer/archive/2012/03/06/async-and-await-in-web-application.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/dozer/archive/2012/01/22/theadvantages-of-short-function.html</id><title type="text">短函数的优点</title><summary type="text">大家刚学编程的时候，一定还记得为什么要用函数。那就是把重复的代码归纳到一个函数中多次利用。这点毋庸置疑，大家也用的很熟了，但是除了这个还有什么改进空间吗？答案肯定是有的！</summary><published>2012-01-22T14:26:00Z</published><updated>2012-01-22T14:26:00Z</updated><author><name>Dozer</name><uri>http://www.cnblogs.com/dozer/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dozer/archive/2012/01/22/theadvantages-of-short-function.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dozer/archive/2012/01/22/theadvantages-of-short-function.html"/><content type="html">&lt;h3 style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f5f5f5; border-top-width: 1px; border-right-width: 0px; border-bottom-width: 1px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 5px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; font-size: 18px; clear: both; border-bottom-color: #ebebeb; border-bottom-style: solid; border-top-color: #ebebeb; border-top-style: solid; color: #333333; font-family: arial, Verdana, sans-serif; line-height: 19px; text-align: justify;"&gt;函数最初的用处&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;大家刚学编程的时候，一定还记得为什么要用函数。那就是把重复的代码归纳到一个函数中多次利用。这点毋庸置疑，大家也用的很熟了，但是除了这个还有什么改进空间吗？答案肯定是有的！&lt;/p&gt;&lt;p&gt;&lt;span style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-style: initial; border-color: initial; border-image: initial; border-width: 0px; padding: 0px; margin: 0px;"&gt;PS.本文不讨论面向对象、不讨论设计模式，只是把视线聚焦在 Class 内部的函数上。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f5f5f5; border-top-width: 1px; border-right-width: 0px; border-bottom-width: 1px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 5px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; font-size: 18px; clear: both; border-bottom-color: #ebebeb; border-bottom-style: solid; border-top-color: #ebebeb; border-top-style: solid; color: #333333; font-family: arial, Verdana, sans-serif; line-height: 19px; text-align: justify;"&gt;出现什么问题了？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;大家都知道当一个函数很长的时候，就会造成阅读困难，那以前我们都是怎么解决的呢？&lt;/p&gt;&lt;ol style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ffffff; border-style: initial; border-color: initial; border-image: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 20px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 40px; list-style-type: none; list-style-position: initial; list-style-image: initial; clear: both; color: #333333; font-family: arial, Verdana, sans-serif; line-height: 19px; text-align: justify; border-width: 0px;"&gt;&lt;li style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-style: initial; border-color: initial; border-image: initial; list-style-type: decimal; list-style-position: initial; list-style-image: initial; background-position: initial initial; background-repeat: initial initial; border-width: 0px; padding: 0px; margin: 0px;"&gt;写注释：这个大家都知道怎么用，也是一种有效的方法。&lt;/li&gt;&lt;li style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-style: initial; border-color: initial; border-image: initial; list-style-type: decimal; list-style-position: initial; list-style-image: initial; background-position: initial initial; background-repeat: initial initial; border-width: 0px; padding: 0px; margin: 0px;"&gt;用 #region 代码块：这个也是一个行之有效的方法。&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;还有什么别的方法吗？其实还有一个方法就是文章的标题：使用短函数。&lt;/p&gt;&lt;p&gt;在讨论短函数有点之前，我想先用一点篇幅来讲述一下什么时候改写注释。&lt;/p&gt;&lt;p&gt;&lt;span style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-style: initial; border-color: initial; border-image: initial; border-width: 0px; padding: 0px; margin: 0px;"&gt;路人甲：纳尼？不是说任何时候都要写注释吗？&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f5f5f5; border-top-width: 1px; border-right-width: 0px; border-bottom-width: 1px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 5px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; font-size: 18px; clear: both; border-bottom-color: #ebebeb; border-bottom-style: solid; border-top-color: #ebebeb; border-top-style: solid; color: #333333; font-family: arial, Verdana, sans-serif; line-height: 19px; text-align: justify;"&gt;什么时候该写注释&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;函数主要就有两个用途：&lt;/p&gt;&lt;ol style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ffffff; border-style: initial; border-color: initial; border-image: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 20px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 40px; list-style-type: none; list-style-position: initial; list-style-image: initial; clear: both; color: #333333; font-family: arial, Verdana, sans-serif; line-height: 19px; text-align: justify; border-width: 0px;"&gt;&lt;li style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-style: initial; border-color: initial; border-image: initial; list-style-type: decimal; list-style-position: initial; list-style-image: initial; background-position: initial initial; background-repeat: initial initial; border-width: 0px; padding: 0px; margin: 0px;"&gt;在 Class 和 别的函数、字段、属性前打三个 / ，就会自动生成供 VS 使用的智能提示内容。&lt;/li&gt;&lt;li style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-style: initial; border-color: initial; border-image: initial; list-style-type: decimal; list-style-position: initial; list-style-image: initial; background-position: initial initial; background-repeat: initial initial; border-width: 0px; padding: 0px; margin: 0px;"&gt;解释代码意图。&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;第一点大家都会用，而且就这么用，没有什么替代的办法。&lt;/p&gt;&lt;p&gt;但是关于第二点，注释未必是最好的解决办法。&lt;/p&gt;&lt;p&gt;因为如果一段代码让人看不懂，要么就是&amp;ldquo;英文看不懂&amp;rdquo;，要么就是&amp;ldquo;逻辑复杂&amp;rdquo;。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-style: initial; border-color: initial; border-image: initial; font-weight: bold; border-width: 0px; padding: 0px; margin: 0px;"&gt;注释是为了弥补它们带来的缺点，但是为什么不从根本解决呢？&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;ldquo;英文看不懂&amp;rdquo;：每个程序员都应该有一定的英文基础吧？另外注意命名规范，就可以解决了。&lt;/p&gt;&lt;p&gt;&amp;ldquo;逻辑复杂&amp;rdquo;：如果一段程序逻辑复杂，让人看不懂，你觉得你应该费力地去给别人解释呢？还是自己好好整理整理，把代码梳理一下呢？&lt;/p&gt;&lt;p&gt;那怎么梳理你的代码呢？短函数？&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f5f5f5; border-top-width: 1px; border-right-width: 0px; border-bottom-width: 1px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 5px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; font-size: 18px; clear: both; border-bottom-color: #ebebeb; border-bottom-style: solid; border-top-color: #ebebeb; border-top-style: solid; color: #333333; font-family: arial, Verdana, sans-serif; line-height: 19px; text-align: justify;"&gt;短函数的优点&amp;mdash;&amp;mdash;有助于梳理代码&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我想废话不多说了，都是程序员，大家一看代码就明白了。&lt;/p&gt;&lt;p&gt;这里贴上另外一篇文章：&lt;a style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-style: initial; border-color: initial; border-image: initial; text-decoration: none; color: #3366cc; background-position: initial initial; background-repeat: initial initial; border-width: 0px; padding: 0px; margin: 0px;" href="http://kb.cnblogs.com/page/79099/" target="_blank"&gt;&lt;span style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-style: initial; border-color: initial; border-image: initial; font-weight: bold; border-width: 0px; padding: 0px; margin: 0px;"&gt;《代码才是最好的注释》&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;文章的题目是代码才是最好的注释，其实写的就是短函数的优点。&lt;/p&gt;&lt;p&gt;已经有了文章，我就不重复工作了。&lt;/p&gt;&lt;p&gt;顺便提一下 region ，其实 region 在 VS 下的收缩功能可以达到差不多的效果，你可以选用这个，但是不是很推荐。&lt;/p&gt;&lt;p&gt;下面，我还要和大家探讨一下另一个优点。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f5f5f5; border-top-width: 1px; border-right-width: 0px; border-bottom-width: 1px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 5px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; font-size: 18px; clear: both; border-bottom-color: #ebebeb; border-bottom-style: solid; border-top-color: #ebebeb; border-top-style: solid; color: #333333; font-family: arial, Verdana, sans-serif; line-height: 19px; text-align: justify;"&gt;短函数的优点&amp;mdash;&amp;mdash;在 .Net 下可优化性能&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;关于这点，我是在《More Effective C#》中看到的，觉得非常好，所以推荐给大家。&lt;/p&gt;&lt;p&gt;把一个大函数拆分成很多小函数可以优化性能？这点看上去很可笑。是的，其实这点性能的提升微不足道，但是如果可以，为什么不做呢？更何况这样做还有上面说的另一个优点。&lt;/p&gt;&lt;p&gt;为什么长函数分割成短函数的时候可以优化 .Net 下的性能呢？&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;你首先要明白：&lt;/p&gt;&lt;p&gt;.Net 下的语言编译的时候只是编译成了&lt;a style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-style: initial; border-color: initial; border-image: initial; text-decoration: none; color: #3366cc; background-position: initial initial; background-repeat: initial initial; border-width: 0px; padding: 0px; margin: 0px;" href="http://baike.baidu.com/view/2278922.htm" target="_blank"&gt;&lt;span style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-style: initial; border-color: initial; border-image: initial; font-weight: bold; border-width: 0px; padding: 0px; margin: 0px;"&gt;中间语言&lt;/span&gt;&lt;/a&gt;。运行的时候，它会再一次编译成机器码。&lt;/p&gt;&lt;p&gt;这个中间语言编译成机器码是以一个函数为基本代为的。也就是说，每次调用函数的时候，这个函数才会被编译。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;那长函数分割成了短函数有优势吗？代码量不还是一样的？纯粹的分割反而会产生更多的代码呢！&lt;/p&gt;&lt;p&gt;的确如此，所以说，这里还有另一个条件：当这个长函数中有很多分支的时候。&lt;/p&gt;&lt;div style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ffffff; border-style: initial; border-color: initial; border-image: initial; color: #333333; font-family: arial, Verdana, sans-serif; line-height: 19px; text-align: justify; border-width: 0px; padding: 0px; margin: 0px;"&gt;&lt;div id="highlighter_796730" class="syntaxhighlighter  csharp" style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: white !important; border-style: initial; border-color: initial; border-image: initial; margin-top: 1em !important; margin-right: 0px !important; margin-bottom: 1em !important; margin-left: 0px !important; width: 557px; position: relative !important; overflow-x: auto !important; overflow-y: auto !important; font-size: 1em !important; background-position: initial initial; background-repeat: initial initial; border-width: 0px; padding: 0px;"&gt;&lt;table style="border-collapse: collapse; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: initial !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; text-align: left !important; top: auto !important; vertical-align: baseline !important; width: 557px; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; font-size: 1em !important; min-height: inherit !important; border-width: 0px !important; padding: 0px !important; margin: 0px !important;" border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: initial !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-size: 1em !important; min-height: inherit !important; border-width: 0px !important; padding: 0px !important; margin: 0px !important;"&gt;&lt;tr style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: initial !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-size: 1em !important; min-height: inherit !important; border-width: 0px !important; padding: 0px !important; margin: 0px !important;"&gt;&lt;td class="gutter" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: initial !important; border-top-width: 1px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 1px; border-style: solid; border-color: #dedede; border-image: initial !important; padding-top: 5px; padding-right: 10px; padding-bottom: 5px; padding-left: 10px; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; font-size: 1em !important; min-height: inherit !important; color: #afafaf !important; margin: 0px !important;"&gt;&lt;div class="line number1 index0 alt2" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: white !important; border-top-width: 0px !important; border-right-width: 3px !important; border-bottom-width: 0px !important; border-left-width: 0px !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; padding-top: 0px !important; padding-right: 0.5em !important; padding-bottom: 0px !important; padding-left: 1em !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; text-align: right !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-size: 1em !important; min-height: inherit !important; white-space: pre !important; border-right-style: solid !important; border-right-color: #6ce26c !important; margin: 0px !important;"&gt;1&lt;/div&gt;&lt;div class="line number2 index1 alt1" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: white !important; border-top-width: 0px !important; border-right-width: 3px !important; border-bottom-width: 0px !important; border-left-width: 0px !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; padding-top: 0px !important; padding-right: 0.5em !important; padding-bottom: 0px !important; padding-left: 1em !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; text-align: right !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-size: 1em !important; min-height: inherit !important; white-space: pre !important; border-right-style: solid !important; border-right-color: #6ce26c !important; margin: 0px !important;"&gt;2&lt;/div&gt;&lt;div class="line number3 index2 alt2" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: white !important; border-top-width: 0px !important; border-right-width: 3px !important; border-bottom-width: 0px !important; border-left-width: 0px !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; padding-top: 0px !important; padding-right: 0.5em !important; padding-bottom: 0px !important; padding-left: 1em !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; text-align: right !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-size: 1em !important; min-height: inherit !important; white-space: pre !important; border-right-style: solid !important; border-right-color: #6ce26c !important; margin: 0px !important;"&gt;3&lt;/div&gt;&lt;div class="line number4 index3 alt1" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: white !important; border-top-width: 0px !important; border-right-width: 3px !important; border-bottom-width: 0px !important; border-left-width: 0px !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; padding-top: 0px !important; padding-right: 0.5em !important; padding-bottom: 0px !important; padding-left: 1em !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; text-align: right !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-size: 1em !important; min-height: inherit !important; white-space: pre !important; border-right-style: solid !important; border-right-color: #6ce26c !important; margin: 0px !important;"&gt;4&lt;/div&gt;&lt;div class="line number5 index4 alt2" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: white !important; border-top-width: 0px !important; border-right-width: 3px !important; border-bottom-width: 0px !important; border-left-width: 0px !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; padding-top: 0px !important; padding-right: 0.5em !important; padding-bottom: 0px !important; padding-left: 1em !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; text-align: right !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-size: 1em !important; min-height: inherit !important; white-space: pre !important; border-right-style: solid !important; border-right-color: #6ce26c !important; margin: 0px !important;"&gt;5&lt;/div&gt;&lt;div class="line number6 index5 alt1" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: white !important; border-top-width: 0px !important; border-right-width: 3px !important; border-bottom-width: 0px !important; border-left-width: 0px !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; padding-top: 0px !important; padding-right: 0.5em !important; padding-bottom: 0px !important; padding-left: 1em !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; text-align: right !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-size: 1em !important; min-height: inherit !important; white-space: pre !important; border-right-style: solid !important; border-right-color: #6ce26c !important; margin: 0px !important;"&gt;6&lt;/div&gt;&lt;div class="line number7 index6 alt2" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: white !important; border-top-width: 0px !important; border-right-width: 3px !important; border-bottom-width: 0px !important; border-left-width: 0px !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; padding-top: 0px !important; padding-right: 0.5em !important; padding-bottom: 0px !important; padding-left: 1em !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; text-align: right !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-size: 1em !important; min-height: inherit !important; white-space: pre !important; border-right-style: solid !important; border-right-color: #6ce26c !important; margin: 0px !important;"&gt;7&lt;/div&gt;&lt;div class="line number8 index7 alt1" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: white !important; border-top-width: 0px !important; border-right-width: 3px !important; border-bottom-width: 0px !important; border-left-width: 0px !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; padding-top: 0px !important; padding-right: 0.5em !important; padding-bottom: 0px !important; padding-left: 1em !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; text-align: right !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-size: 1em !important; min-height: inherit !important; white-space: pre !important; border-right-style: solid !important; border-right-color: #6ce26c !important; margin: 0px !important;"&gt;8&lt;/div&gt;&lt;div class="line number9 index8 alt2" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: white !important; border-top-width: 0px !important; border-right-width: 3px !important; border-bottom-width: 0px !important; border-left-width: 0px !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; padding-top: 0px !important; padding-right: 0.5em !important; padding-bottom: 0px !important; padding-left: 1em !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; text-align: right !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-size: 1em !important; min-height: inherit !important; white-space: pre !important; border-right-style: solid !important; border-right-color: #6ce26c !important; margin: 0px !important;"&gt;9&lt;/div&gt;&lt;div class="line number10 index9 alt1" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: white !important; border-top-width: 0px !important; border-right-width: 3px !important; border-bottom-width: 0px !important; border-left-width: 0px !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; padding-top: 0px !important; padding-right: 0.5em !important; padding-bottom: 0px !important; padding-left: 1em !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; text-align: right !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-size: 1em !important; min-height: inherit !important; white-space: pre !important; border-right-style: solid !important; border-right-color: #6ce26c !important; margin: 0px !important;"&gt;10&lt;/div&gt;&lt;div class="line number11 index10 alt2" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: white !important; border-top-width: 0px !important; border-right-width: 3px !important; border-bottom-width: 0px !important; border-left-width: 0px !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; padding-top: 0px !important; padding-right: 0.5em !important; padding-bottom: 0px !important; padding-left: 1em !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; text-align: right !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-size: 1em !important; min-height: inherit !important; white-space: pre !important; border-right-style: solid !important; border-right-color: #6ce26c !important; margin: 0px !important;"&gt;11&lt;/div&gt;&lt;/td&gt;&lt;td class="code" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: initial !important; border-top-width: 1px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 1px; border-style: solid; border-color: #dedede; border-image: initial !important; padding-top: 5px; padding-right: 10px; padding-bottom: 5px; padding-left: 10px; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: 522px; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; font-size: 1em !important; min-height: inherit !important; margin: 0px !important;"&gt;&lt;div class="container" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: initial !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: relative !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-size: 1em !important; min-height: inherit !important; border-width: 0px !important; padding: 0px !important; margin: 0px !important;"&gt;&lt;div class="line number1 index0 alt2" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: white !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; padding-top: 0px !important; padding-right: 1em !important; padding-bottom: 0px !important; padding-left: 1em !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-size: 1em !important; min-height: inherit !important; white-space: pre !important; border-width: 0px !important; margin: 0px !important;"&gt;&lt;code class="csharp keyword" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: initial !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; font-weight: bold !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; font-size: 1em !important; min-height: inherit !important; color: #006699 !important; border-width: 0px !important; padding: 0px !important; margin: 0px !important;"&gt;public&lt;/code&gt; &lt;code class="csharp keyword" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: initial !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; font-weight: bold !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; font-size: 1em !important; min-height: inherit !important; color: #006699 !important; border-width: 0px !important; padding: 0px !important; margin: 0px !important;"&gt;void&lt;/code&gt; &lt;code class="csharp plain" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: initial !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; font-size: 1em !important; min-height: inherit !important; border-width: 0px !important; padding: 0px !important; margin: 0px !important;"&gt;Func1()&lt;/code&gt;&lt;/div&gt;&lt;div class="line number2 index1 alt1" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: white !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; padding-top: 0px !important; padding-right: 1em !important; padding-bottom: 0px !important; padding-left: 1em !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-size: 1em !important; min-height: inherit !important; white-space: pre !important; border-width: 0px !important; margin: 0px !important;"&gt;&lt;code class="csharp plain" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: initial !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; font-size: 1em !important; min-height: inherit !important; border-width: 0px !important; padding: 0px !important; margin: 0px !important;"&gt;{&lt;/code&gt;&lt;/div&gt;&lt;div class="line number3 index2 alt2" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: white !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; padding-top: 0px !important; padding-right: 1em !important; padding-bottom: 0px !important; padding-left: 1em !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-size: 1em !important; min-height: inherit !important; white-space: pre !important; border-width: 0px !important; margin: 0px !important;"&gt;&lt;code class="csharp spaces" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: initial !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; font-size: 1em !important; min-height: inherit !important; border-width: 0px !important; padding: 0px !important; margin: 0px !important;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: initial !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; font-weight: bold !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; font-size: 1em !important; min-height: inherit !important; color: #006699 !important; border-width: 0px !important; padding: 0px !important; margin: 0px !important;"&gt;if&lt;/code&gt;&lt;code class="csharp plain" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: initial !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; font-size: 1em !important; min-height: inherit !important; border-width: 0px !important; padding: 0px !important; margin: 0px !important;"&gt;(xxxx)&lt;/code&gt;&lt;/div&gt;&lt;div class="line number4 index3 alt1" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: white !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; padding-top: 0px !important; padding-right: 1em !important; padding-bottom: 0px !important; padding-left: 1em !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-size: 1em !important; min-height: inherit !important; white-space: pre !important; border-width: 0px !important; margin: 0px !important;"&gt;&lt;code class="csharp spaces" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: initial !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; font-size: 1em !important; min-height: inherit !important; border-width: 0px !important; padding: 0px !important; margin: 0px !important;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: initial !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; font-size: 1em !important; min-height: inherit !important; border-width: 0px !important; padding: 0px !important; margin: 0px !important;"&gt;{&lt;/code&gt;&lt;/div&gt;&lt;div class="line number5 index4 alt2" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: white !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; padding-top: 0px !important; padding-right: 1em !important; padding-bottom: 0px !important; padding-left: 1em !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-size: 1em !important; min-height: inherit !important; white-space: pre !important; border-width: 0px !important; margin: 0px !important;"&gt;&lt;code class="csharp spaces" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: initial !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; font-size: 1em !important; min-height: inherit !important; border-width: 0px !important; padding: 0px !important; margin: 0px !important;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp comments" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: initial !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; color: #008200 !important; font-size: 1em !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; min-height: inherit !important; border-width: 0px !important; padding: 0px !important; margin: 0px !important;"&gt;//代码段1，几百行&lt;/code&gt;&lt;/div&gt;&lt;div class="line number6 index5 alt1" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: white !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; padding-top: 0px !important; padding-right: 1em !important; padding-bottom: 0px !important; padding-left: 1em !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-size: 1em !important; min-height: inherit !important; white-space: pre !important; border-width: 0px !important; margin: 0px !important;"&gt;&lt;code class="csharp spaces" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: initial !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; font-size: 1em !important; min-height: inherit !important; border-width: 0px !important; padding: 0px !important; margin: 0px !important;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: initial !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; font-size: 1em !important; min-height: inherit !important; border-width: 0px !important; padding: 0px !important; margin: 0px !important;"&gt;}&lt;/code&gt;&lt;/div&gt;&lt;div class="line number7 index6 alt2" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: white !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; padding-top: 0px !important; padding-right: 1em !important; padding-bottom: 0px !important; padding-left: 1em !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-size: 1em !important; min-height: inherit !important; white-space: pre !important; border-width: 0px !important; margin: 0px !important;"&gt;&lt;code class="csharp spaces" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: initial !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; font-size: 1em !important; min-height: inherit !important; border-width: 0px !important; padding: 0px !important; margin: 0px !important;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: initial !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; font-weight: bold !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; font-size: 1em !important; min-height: inherit !important; color: #006699 !important; border-width: 0px !important; padding: 0px !important; margin: 0px !important;"&gt;else&lt;/code&gt;&lt;/div&gt;&lt;div class="line number8 index7 alt1" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: white !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; padding-top: 0px !important; padding-right: 1em !important; padding-bottom: 0px !important; padding-left: 1em !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-size: 1em !important; min-height: inherit !important; white-space: pre !important; border-width: 0px !important; margin: 0px !important;"&gt;&lt;code class="csharp spaces" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: initial !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; font-size: 1em !important; min-height: inherit !important; border-width: 0px !important; padding: 0px !important; margin: 0px !important;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: initial !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; font-size: 1em !important; min-height: inherit !important; border-width: 0px !important; padding: 0px !important; margin: 0px !important;"&gt;{&lt;/code&gt;&lt;/div&gt;&lt;div class="line number9 index8 alt2" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: white !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; padding-top: 0px !important; padding-right: 1em !important; padding-bottom: 0px !important; padding-left: 1em !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-size: 1em !important; min-height: inherit !important; white-space: pre !important; border-width: 0px !important; margin: 0px !important;"&gt;&lt;code class="csharp spaces" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: initial !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; font-size: 1em !important; min-height: inherit !important; border-width: 0px !important; padding: 0px !important; margin: 0px !important;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp comments" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: initial !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; color: #008200 !important; font-size: 1em !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; min-height: inherit !important; border-width: 0px !important; padding: 0px !important; margin: 0px !important;"&gt;//代码段2，几百行&lt;/code&gt;&lt;/div&gt;&lt;div class="line number10 index9 alt1" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: white !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; padding-top: 0px !important; padding-right: 1em !important; padding-bottom: 0px !important; padding-left: 1em !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-size: 1em !important; min-height: inherit !important; white-space: pre !important; border-width: 0px !important; margin: 0px !important;"&gt;&lt;code class="csharp spaces" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: initial !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; font-size: 1em !important; min-height: inherit !important; border-width: 0px !important; padding: 0px !important; margin: 0px !important;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: initial !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; font-size: 1em !important; min-height: inherit !important; border-width: 0px !important; padding: 0px !important; margin: 0px !important;"&gt;}&lt;/code&gt;&lt;/div&gt;&lt;div class="line number11 index10 alt2" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: white !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; padding-top: 0px !important; padding-right: 1em !important; padding-bottom: 0px !important; padding-left: 1em !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-size: 1em !important; min-height: inherit !important; white-space: pre !important; border-width: 0px !important; margin: 0px !important;"&gt;&lt;code class="csharp plain" style="background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: initial !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; font-size: 1em !important; min-height: inherit !important; border-width: 0px !important; padding: 0px !important; margin: 0px !important;"&gt;}&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;上面这段代码，有两大段代码，每次调用这个函数其实只会执行一部分。&lt;/p&gt;&lt;p&gt;所以，如果把这两块代码段提取出来，编译的过程中就会少编译一半的代码。&lt;/p&gt;&lt;p&gt;现在明白在什么时候把长函数分割成短函数能优化性能了吧。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;虽然这点性能提升并不明显，但是，如果你一个函数中，有一个很大的分支。&lt;/p&gt;&lt;p&gt;你在看代码的过程中，一定会看花眼，滚屏的过程中，都不知道自己现在身处在哪个部分。&lt;/p&gt;&lt;p&gt;随意就算不考虑性能，也推荐把这样的代码分割成短函数！&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f5f5f5; border-top-width: 1px; border-right-width: 0px; border-bottom-width: 1px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 5px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; font-size: 18px; clear: both; border-bottom-color: #ebebeb; border-bottom-style: solid; border-top-color: #ebebeb; border-top-style: solid; color: #333333; font-family: arial, Verdana, sans-serif; line-height: 19px; text-align: justify;"&gt;总结&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;上文说了短函数的优点，说了下注释的缺陷，还有一个没怎么提到的 region &amp;hellip;&lt;/p&gt;&lt;p&gt;我在写代码的时候一般遵循一下原则：&lt;/p&gt;&lt;ol style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ffffff; border-style: initial; border-color: initial; border-image: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 20px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 40px; list-style-type: none; list-style-position: initial; list-style-image: initial; clear: both; color: #333333; font-family: arial, Verdana, sans-serif; line-height: 19px; text-align: justify; border-width: 0px;"&gt;&lt;li style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-style: initial; border-color: initial; border-image: initial; list-style-type: decimal; list-style-position: initial; list-style-image: initial; background-position: initial initial; background-repeat: initial initial; border-width: 0px; padding: 0px; margin: 0px;"&gt;函数内部一般不写注释，如果&amp;ldquo;逻辑复杂&amp;rdquo;，我会&lt;span style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-style: initial; border-color: initial; border-image: initial; font-weight: bold; border-width: 0px; padding: 0px; margin: 0px;"&gt;优化逻辑并分割成短函数&lt;/span&gt;。&lt;/li&gt;&lt;li style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-style: initial; border-color: initial; border-image: initial; list-style-type: decimal; list-style-position: initial; list-style-image: initial; background-position: initial initial; background-repeat: initial initial; border-width: 0px; padding: 0px; margin: 0px;"&gt;在一些算法中，包含很奇特的公式，这个一定要写注释了，没办法分割和优化。&lt;/li&gt;&lt;li style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-style: initial; border-color: initial; border-image: initial; list-style-type: decimal; list-style-position: initial; list-style-image: initial; background-position: initial initial; background-repeat: initial initial; border-width: 0px; padding: 0px; margin: 0px;"&gt;写完函数后查看是否有&lt;span style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-style: initial; border-color: initial; border-image: initial; font-weight: bold; border-width: 0px; padding: 0px; margin: 0px;"&gt;大段&lt;/span&gt;的分支，有的话再分割成短函数。&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;最后，希望本文能对大家有用！&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;你也可以到我的个人博客中查看此文：&lt;a style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-style: initial; border-color: initial; border-image: initial; text-decoration: none; color: #3366cc; background-position: initial initial; background-repeat: initial initial; border-width: 0px; padding: 0px; margin: 0px;" href="http://www.dozer.cc/2012/01/theadvantages-of-short-function/"&gt;短函数的优点&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/dozer/aggbug/2328863.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/dozer/archive/2012/01/22/theadvantages-of-short-function.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/dozer/archive/2011/10/28/ref-and-out-keywords.html</id><title type="text">把 ref 和 out 关键字说透</title><summary type="text">如果排版不好，可以到我个人博客上看，我是现在个人博客上写的，欢迎捧场^^：http://www.dozer.ccref 和 out 的区别网上有很多这方面的文章，但是大部分人总是纠结于他们在原理上的那一点点细微的区别，所以导致了难以区分它们，也不知道什么时候改用哪一个了。但是如果从试用场景的角度对它们进行区别的话，以后你一定不会再纠结了。当你明白它们的适用场景后，再去扣其中的原理，使用中的一些问题也就迎刃而解了~简单的来说，它们的区别在于：ref 关键字 是作用是把一个变量的引用传入函数，和 C/C++ 中的指针几乎一样，就是传入了这个变量的栈指针。out 关键字 的作用是当你需要返回多个变量</summary><published>2011-10-28T09:03:00Z</published><updated>2011-10-28T09:03:00Z</updated><author><name>Dozer</name><uri>http://www.cnblogs.com/dozer/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dozer/archive/2011/10/28/ref-and-out-keywords.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dozer/archive/2011/10/28/ref-and-out-keywords.html"/><content type="html">&lt;p&gt;如果排版不好，可以到我个人博客上看，我是现在个人博客上写的，欢迎捧场^^：&lt;a href="http://www.dozer.cc" target="_blank"&gt;http://www.dozer.cc&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;ref 和 out 的区别&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;网上有很多这方面的文章，但是大部分人总是纠结于他们在原理上的那一点点细微的区别，所以导致了难以区分它们，也不知道什么时候改用哪一个了。&lt;/p&gt;&lt;p&gt;但是如果从试用场景的角度对它们进行区别的话，以后你一定不会再纠结了。&lt;/p&gt;&lt;p&gt;当你明白它们的适用场景后，再去扣其中的原理，使用中的一些问题也就迎刃而解了~&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;简单的来说，它们的区别在于：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;ref 关键字 是作用是把一个变量的引用传入函数，和 C/C++ 中的指针几乎一样，就是传入了这个变量的栈指针。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;out 关键字 的作用是当你需要返回多个变量的时候，可以把一个变量加上 out 关键字，并在函数内对它赋值，以实现返回多个变量。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;几个简单的演示&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;上面说了 ref 和 out 的作用，非常简单，但是在具体使用的时候却遇到了很多麻烦，因为 C# 中本身就区分了引用类型和值类型。&lt;/p&gt;&lt;p&gt;我先举几个例子，来看看会出现哪些诡异的情况&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;代码段一：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;div id="highlighter_141513" class="syntaxhighlighter  csharp"&gt;&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;div class="line number1 index0 alt2"&gt;1&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;2&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;3&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;4&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;5&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;6&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;7&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;8&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;9&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;10&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;11&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;12&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;13&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;14&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;15&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;16&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;17&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="container"&gt;&lt;div class="line number1 index0 alt2"&gt;&lt;code class="csharp keyword"&gt;static&lt;/code&gt; &lt;code class="csharp keyword"&gt;void&lt;/code&gt; &lt;code class="csharp plain"&gt;Main(&lt;/code&gt;&lt;code class="csharp keyword"&gt;string&lt;/code&gt;&lt;code class="csharp plain"&gt;[] args)&lt;/code&gt;&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;&lt;code class="csharp plain"&gt;{&lt;/code&gt;&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;int&lt;/code&gt; &lt;code class="csharp plain"&gt;a;&lt;/code&gt;&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;Test1(&lt;/code&gt;&lt;code class="csharp keyword"&gt;out&lt;/code&gt; &lt;code class="csharp plain"&gt;a);&lt;/code&gt;&lt;code class="csharp comments"&gt;//编译通过&lt;/code&gt;&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;int&lt;/code&gt; &lt;code class="csharp plain"&gt;b;&lt;/code&gt;&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;Test2(&lt;/code&gt;&lt;code class="csharp keyword"&gt;ref&lt;/code&gt; &lt;code class="csharp plain"&gt;b);&lt;/code&gt;&lt;code class="csharp comments"&gt;//编译失败&lt;/code&gt;&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;&lt;code class="csharp plain"&gt;}&lt;/code&gt;&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;&lt;code class="csharp keyword"&gt;static&lt;/code&gt; &lt;code class="csharp keyword"&gt;void&lt;/code&gt; &lt;code class="csharp plain"&gt;Test1(&lt;/code&gt;&lt;code class="csharp keyword"&gt;out&lt;/code&gt; &lt;code class="csharp keyword"&gt;int&lt;/code&gt; &lt;code class="csharp plain"&gt;a)&lt;/code&gt;&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;&lt;code class="csharp plain"&gt;{&lt;/code&gt;&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;a = 1;&lt;/code&gt;&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;&lt;code class="csharp plain"&gt;}&lt;/code&gt;&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;&lt;code class="csharp keyword"&gt;static&lt;/code&gt; &lt;code class="csharp keyword"&gt;void&lt;/code&gt; &lt;code class="csharp plain"&gt;Test2(&lt;/code&gt;&lt;code class="csharp keyword"&gt;ref&lt;/code&gt; &lt;code class="csharp keyword"&gt;int&lt;/code&gt; &lt;code class="csharp plain"&gt;b)&lt;/code&gt;&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;&lt;code class="csharp plain"&gt;{&lt;/code&gt;&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;b = 1;&lt;/code&gt;&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;&lt;code class="csharp plain"&gt;}&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这两个关键字看起来用法一样，为什么会有合格现象？&lt;/p&gt;&lt;p&gt;网上的答案很简单：out 关键字在传入前可以不赋值，ref 关键字在传入前一定要赋值。&lt;/p&gt;&lt;p&gt;这是什么解释？受之于鱼但并没有授之予渔！这到底是为什么呢？&lt;/p&gt;&lt;p&gt;想知道背后真正原理的呢，就继续看下去吧，后面我讲会讲到这里的区别。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;代码二：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;div id="highlighter_750180" class="syntaxhighlighter  csharp"&gt;&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;div class="line number1 index0 alt2"&gt;1&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;2&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;3&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;4&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;5&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;6&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;7&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;8&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;9&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;10&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;11&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;12&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;13&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;14&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;15&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;16&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;17&lt;/div&gt;&lt;div class="line number18 index17 alt1"&gt;18&lt;/div&gt;&lt;div class="line number19 index18 alt2"&gt;19&lt;/div&gt;&lt;div class="line number20 index19 alt1"&gt;20&lt;/div&gt;&lt;div class="line number21 index20 alt2"&gt;21&lt;/div&gt;&lt;div class="line number22 index21 alt1"&gt;22&lt;/div&gt;&lt;div class="line number23 index22 alt2"&gt;23&lt;/div&gt;&lt;div class="line number24 index23 alt1"&gt;24&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="container"&gt;&lt;div class="line number1 index0 alt2"&gt;&lt;code class="csharp keyword"&gt;static&lt;/code&gt; &lt;code class="csharp keyword"&gt;void&lt;/code&gt; &lt;code class="csharp plain"&gt;Main(&lt;/code&gt;&lt;code class="csharp keyword"&gt;string&lt;/code&gt;&lt;code class="csharp plain"&gt;[] args)&lt;/code&gt;&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;&lt;code class="csharp plain"&gt;{&lt;/code&gt;&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;object&lt;/code&gt; &lt;code class="csharp plain"&gt;a = &lt;/code&gt;&lt;code class="csharp keyword"&gt;new&lt;/code&gt; &lt;code class="csharp keyword"&gt;object&lt;/code&gt;&lt;code class="csharp plain"&gt;(), b = &lt;/code&gt;&lt;code class="csharp keyword"&gt;new&lt;/code&gt; &lt;code class="csharp keyword"&gt;object&lt;/code&gt;&lt;code class="csharp plain"&gt;(), c = &lt;/code&gt;&lt;code class="csharp keyword"&gt;new&lt;/code&gt; &lt;code class="csharp keyword"&gt;object&lt;/code&gt;&lt;code class="csharp plain"&gt;();&lt;/code&gt;&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;Test1(&lt;/code&gt;&lt;code class="csharp keyword"&gt;out&lt;/code&gt; &lt;code class="csharp plain"&gt;a);&lt;/code&gt;&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;Test2(&lt;/code&gt;&lt;code class="csharp keyword"&gt;ref&lt;/code&gt; &lt;code class="csharp plain"&gt;b);&lt;/code&gt;&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;Test3(c);&lt;/code&gt;&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp comments"&gt;//最终 a,b,c 分别是什么？&lt;/code&gt;&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp comments"&gt;//a,b = null&lt;/code&gt;&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp comments"&gt;//c 还是 object&lt;/code&gt;&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;&lt;code class="csharp plain"&gt;}&lt;/code&gt;&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;&lt;code class="csharp keyword"&gt;static&lt;/code&gt; &lt;code class="csharp keyword"&gt;void&lt;/code&gt; &lt;code class="csharp plain"&gt;Test1(&lt;/code&gt;&lt;code class="csharp keyword"&gt;out&lt;/code&gt; &lt;code class="csharp keyword"&gt;object&lt;/code&gt; &lt;code class="csharp plain"&gt;a)&lt;/code&gt;&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;&lt;code class="csharp plain"&gt;{&lt;/code&gt;&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;a = &lt;/code&gt;&lt;code class="csharp keyword"&gt;null&lt;/code&gt;&lt;code class="csharp plain"&gt;;&lt;/code&gt;&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;&lt;code class="csharp plain"&gt;}&lt;/code&gt;&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;&lt;code class="csharp keyword"&gt;static&lt;/code&gt; &lt;code class="csharp keyword"&gt;void&lt;/code&gt; &lt;code class="csharp plain"&gt;Test2(&lt;/code&gt;&lt;code class="csharp keyword"&gt;ref&lt;/code&gt; &lt;code class="csharp keyword"&gt;object&lt;/code&gt; &lt;code class="csharp plain"&gt;b)&lt;/code&gt;&lt;/div&gt;&lt;div class="line number18 index17 alt1"&gt;&lt;code class="csharp plain"&gt;{&lt;/code&gt;&lt;/div&gt;&lt;div class="line number19 index18 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;b = &lt;/code&gt;&lt;code class="csharp keyword"&gt;null&lt;/code&gt;&lt;code class="csharp plain"&gt;;&lt;/code&gt;&lt;/div&gt;&lt;div class="line number20 index19 alt1"&gt;&lt;code class="csharp plain"&gt;}&lt;/code&gt;&lt;/div&gt;&lt;div class="line number21 index20 alt2"&gt;&lt;code class="csharp keyword"&gt;static&lt;/code&gt; &lt;code class="csharp keyword"&gt;void&lt;/code&gt; &lt;code class="csharp plain"&gt;Test3(&lt;/code&gt;&lt;code class="csharp keyword"&gt;object&lt;/code&gt; &lt;code class="csharp plain"&gt;c)&lt;/code&gt;&lt;/div&gt;&lt;div class="line number22 index21 alt1"&gt;&lt;code class="csharp plain"&gt;{&lt;/code&gt;&lt;/div&gt;&lt;div class="line number23 index22 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;c = &lt;/code&gt;&lt;code class="csharp keyword"&gt;null&lt;/code&gt;&lt;code class="csharp plain"&gt;;&lt;/code&gt;&lt;/div&gt;&lt;div class="line number24 index23 alt1"&gt;&lt;code class="csharp plain"&gt;}&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;新建三个 object，object是引用类型；三个函数，分别是 out,ref和普通调用；执行了一样的语句；最后的结果为什么是这样呢？&lt;/p&gt;&lt;p&gt;如果你只是从浅层次理解了 out 和 ref 的区别，这个问题你一定回答不上了。（我以前也不知道）&lt;/p&gt;&lt;p&gt;所以，这是为什么呢？继续往下看。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;^_^ 相信很多人晕了，我的目的达到了。（邪恶的笑~~）&lt;/p&gt;&lt;p&gt;那么，下面，我为大家从两个角度来分析一下。&lt;/p&gt;&lt;p&gt;对于值类型来说，加 out、加 ref 和什么都不加有什么共同点和区别？&lt;/p&gt;&lt;p&gt;对于引用类型来说，加 out、加 ref 和什么都不加有什么共同点和区别？&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;问题一：关于值类型&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;普通的传递值类型很简单了，传的只是一个值，没难度，平时都是这么用的，很好区分，所以这里就不惨和进去了。&lt;/p&gt;&lt;p&gt;接下来是 ref 和 out 的区别，为什么要了解区别呢？当然是为了了解怎么用它们，简单的来说就是需要了解：什么时候该用哪个。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;strong&gt;个人总结有几个原则：&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;如果你是为了能多返回一个变量，那么就应该用 out：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;用 out 关键字有几个好处：可以不关心函数外是否被赋值，并且如果在函数内没有赋值的话就会编译不通过。（提醒你一定要返回）&lt;/p&gt;&lt;p&gt;你可以把它当成是另一种形式的 return 来用，我们来做一个类比：&lt;/p&gt;&lt;p&gt;return 语句的特点：接收 return 的变量事先不需要赋值（当然如果赋值了也没关系），在函数内必须 return。&lt;/p&gt;&lt;p&gt;可以看到 out 关键字的作用、行为、特点 和 return 是完全一样的。因为它当初设计的目的就是为了解决这个问题的。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;如果你想要像引用类型那样调用值类型，那你就可以 ref：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;传入值类型的引用后，你可以用它，也可以不用它，你也可以重新修改它的各个属性，而函数外也可以随之改变。&lt;/p&gt;&lt;p&gt;我们来把 &amp;ldquo;传值类型的引用&amp;rdquo; 和 &amp;ldquo;传引用类型&amp;rdquo; 来做一个类比：&lt;/p&gt;&lt;div&gt;&lt;div id="highlighter_479191" class="syntaxhighlighter  csharp"&gt;&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;div class="line number1 index0 alt2"&gt;1&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;2&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;3&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;4&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;5&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;6&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;7&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;8&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;9&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;10&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;11&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="container"&gt;&lt;div class="line number1 index0 alt2"&gt;&lt;code class="csharp keyword"&gt;static&lt;/code&gt; &lt;code class="csharp keyword"&gt;void&lt;/code&gt; &lt;code class="csharp plain"&gt;Main(&lt;/code&gt;&lt;code class="csharp keyword"&gt;string&lt;/code&gt;&lt;code class="csharp plain"&gt;[] args)&lt;/code&gt;&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;&lt;code class="csharp plain"&gt;{&lt;/code&gt;&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;int&lt;/code&gt; &lt;code class="csharp plain"&gt;a;&lt;/code&gt;&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;Test1(&lt;/code&gt;&lt;code class="csharp keyword"&gt;ref&lt;/code&gt; &lt;code class="csharp plain"&gt;a);&lt;/code&gt;&lt;code class="csharp comments"&gt;//错误&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp; 使用了未赋值的局部变量&amp;ldquo;a&amp;rdquo;&lt;/code&gt;&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;object&lt;/code&gt; &lt;code class="csharp plain"&gt;b;&lt;/code&gt;&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;Test2(b);&lt;/code&gt;&lt;code class="csharp comments"&gt;//错误&amp;nbsp;&amp;nbsp; 2&amp;nbsp;&amp;nbsp; 使用了未赋值的局部变量&amp;ldquo;b&amp;rdquo;&lt;/code&gt;&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;&lt;code class="csharp plain"&gt;}&lt;/code&gt;&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;&lt;code class="csharp keyword"&gt;static&lt;/code&gt; &lt;code class="csharp keyword"&gt;void&lt;/code&gt; &lt;code class="csharp plain"&gt;Test1(&lt;/code&gt;&lt;code class="csharp keyword"&gt;ref&lt;/code&gt; &lt;code class="csharp keyword"&gt;int&lt;/code&gt; &lt;code class="csharp plain"&gt;a) { }&lt;/code&gt;&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;&lt;code class="csharp keyword"&gt;static&lt;/code&gt; &lt;code class="csharp keyword"&gt;void&lt;/code&gt; &lt;code class="csharp plain"&gt;Test2(&lt;/code&gt;&lt;code class="csharp keyword"&gt;object&lt;/code&gt; &lt;code class="csharp plain"&gt;b) { }&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;传入加了 ref 的值类型 和 传入一个引用类型 的作用、行为、特点都是类似的。&lt;/p&gt;&lt;p&gt;同样，他们同时要遵守一个原则：传入前必须赋值，这个是为什么呢？&lt;/p&gt;&lt;p&gt;如果赋值后，传入两个函数的分别是 int a 的指针 和 object b 的指针。&lt;/p&gt;&lt;p&gt;而不赋值的话，a 和 b 根本还不存在，那它们又怎么会有地址呢？&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;注意：如果你只写了 object a ，而在后面的代码中没有赋值，它并没有真正地分配内存。&lt;/p&gt;&lt;p&gt;我们可以看一下三个操作的 IL 代码：&lt;/p&gt;&lt;div&gt;&lt;div id="highlighter_516071" class="syntaxhighlighter  csharp"&gt;&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;div class="line number1 index0 alt2"&gt;1&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;2&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;3&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;4&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;5&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;6&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;7&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;8&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;9&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;10&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;11&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;12&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;13&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="container"&gt;&lt;div class="line number1 index0 alt2"&gt;&lt;code class="csharp keyword"&gt;private&lt;/code&gt; &lt;code class="csharp keyword"&gt;static&lt;/code&gt; &lt;code class="csharp keyword"&gt;void&lt;/code&gt; &lt;code class="csharp plain"&gt;Main(&lt;/code&gt;&lt;code class="csharp keyword"&gt;string&lt;/code&gt;&lt;code class="csharp plain"&gt;[] args)&lt;/code&gt;&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;&lt;code class="csharp plain"&gt;{&lt;/code&gt;&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp comments"&gt;//IL_0000: nop&lt;/code&gt;&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;object&lt;/code&gt; &lt;code class="csharp plain"&gt;a;&lt;/code&gt;&lt;code class="csharp comments"&gt;//没做任何事&lt;/code&gt;&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp comments"&gt;//IL_0002: ldnull&lt;/code&gt;&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp comments"&gt;//IL_0003: stloc.1&lt;/code&gt;&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;object&lt;/code&gt; &lt;code class="csharp plain"&gt;b = &lt;/code&gt;&lt;code class="csharp keyword"&gt;null&lt;/code&gt;&lt;code class="csharp plain"&gt;;&lt;/code&gt;&lt;code class="csharp comments"&gt;//在栈中增加了一个指针，指向 null&lt;/code&gt;&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp comments"&gt;//IL_0004: newobj instance void [mscorlib]System.Object::.ctor()&lt;/code&gt;&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp comments"&gt;//IL_0009: stloc.2&lt;/code&gt;&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;object&lt;/code&gt; &lt;code class="csharp plain"&gt;c = &lt;/code&gt;&lt;code class="csharp keyword"&gt;new&lt;/code&gt; &lt;code class="csharp keyword"&gt;object&lt;/code&gt;&lt;code class="csharp plain"&gt;();&lt;/code&gt;&lt;code class="csharp comments"&gt;//在栈中增加了一个指针，指向新建的 object 对象&lt;/code&gt;&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;&lt;code class="csharp plain"&gt;}&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;传入引用类型的目的是把一个已经存在的对象的地址传过去，而如果你只是进行了 object a 声明，并没做复制，这行代码跟没做任何事！&lt;/p&gt;&lt;p&gt;所以，除非你使用了 out 关键字，在不用关键字和用 ref 关键字的情况下，你都必须事先复制。 out 只是一种特殊的 return&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;strong&gt;总结：&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;现在你是否明白，当变量什么情况下该用什么关键字了吗？其实有时候 ref 和 out 都可以达到目的，你需要根据你的初衷，和它们的特点，来衡量一下到底使用哪个了！&lt;/p&gt;&lt;p&gt;另外，我们来看看两个同样的函数，用 out 和 ref 时候的 IL 代码&lt;/p&gt;&lt;p&gt;原函数：&lt;/p&gt;&lt;div&gt;&lt;div id="highlighter_595720" class="syntaxhighlighter  csharp"&gt;&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;div class="line number1 index0 alt2"&gt;1&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;2&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;3&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;4&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;5&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;6&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;7&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;8&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="container"&gt;&lt;div class="line number1 index0 alt2"&gt;&lt;code class="csharp keyword"&gt;private&lt;/code&gt; &lt;code class="csharp keyword"&gt;static&lt;/code&gt; &lt;code class="csharp keyword"&gt;void&lt;/code&gt; &lt;code class="csharp plain"&gt;Test1(&lt;/code&gt;&lt;code class="csharp keyword"&gt;out&lt;/code&gt; &lt;code class="csharp keyword"&gt;int&lt;/code&gt; &lt;code class="csharp plain"&gt;a)&lt;/code&gt;&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;&lt;code class="csharp plain"&gt;{&lt;/code&gt;&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;a = 1;&lt;/code&gt;&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;&lt;code class="csharp plain"&gt;}&lt;/code&gt;&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;&lt;code class="csharp keyword"&gt;private&lt;/code&gt; &lt;code class="csharp keyword"&gt;static&lt;/code&gt; &lt;code class="csharp keyword"&gt;void&lt;/code&gt; &lt;code class="csharp plain"&gt;Test2(&lt;/code&gt;&lt;code class="csharp keyword"&gt;ref&lt;/code&gt; &lt;code class="csharp keyword"&gt;int&lt;/code&gt; &lt;code class="csharp plain"&gt;a)&lt;/code&gt;&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;&lt;code class="csharp plain"&gt;{&lt;/code&gt;&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;a = 1;&lt;/code&gt;&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;&lt;code class="csharp plain"&gt;}&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;IL代码：&lt;/p&gt;&lt;div&gt;&lt;div id="highlighter_857415" class="syntaxhighlighter  csharp"&gt;&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;div class="line number1 index0 alt2"&gt;1&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;2&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;3&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;4&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;5&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;6&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;7&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;8&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;9&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;10&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;11&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;12&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;13&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;14&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;15&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;16&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;17&lt;/div&gt;&lt;div class="line number18 index17 alt1"&gt;18&lt;/div&gt;&lt;div class="line number19 index18 alt2"&gt;19&lt;/div&gt;&lt;div class="line number20 index19 alt1"&gt;20&lt;/div&gt;&lt;div class="line number21 index20 alt2"&gt;21&lt;/div&gt;&lt;div class="line number22 index21 alt1"&gt;22&lt;/div&gt;&lt;div class="line number23 index22 alt2"&gt;23&lt;/div&gt;&lt;div class="line number24 index23 alt1"&gt;24&lt;/div&gt;&lt;div class="line number25 index24 alt2"&gt;25&lt;/div&gt;&lt;div class="line number26 index25 alt1"&gt;26&lt;/div&gt;&lt;div class="line number27 index26 alt2"&gt;27&lt;/div&gt;&lt;div class="line number28 index27 alt1"&gt;28&lt;/div&gt;&lt;div class="line number29 index28 alt2"&gt;29&lt;/div&gt;&lt;div class="line number30 index29 alt1"&gt;30&lt;/div&gt;&lt;div class="line number31 index30 alt2"&gt;31&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="container"&gt;&lt;div class="line number1 index0 alt2"&gt;&lt;code class="csharp plain"&gt;.method &lt;/code&gt;&lt;code class="csharp keyword"&gt;private&lt;/code&gt; &lt;code class="csharp plain"&gt;hidebysig &lt;/code&gt;&lt;code class="csharp keyword"&gt;static&lt;/code&gt;&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;void&lt;/code&gt; &lt;code class="csharp plain"&gt;Test1 (&lt;/code&gt;&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;[&lt;/code&gt;&lt;code class="csharp keyword"&gt;out&lt;/code&gt;&lt;code class="csharp plain"&gt;] int32&amp;amp; a&lt;/code&gt;&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;) cil managed&lt;/code&gt;&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;&lt;code class="csharp plain"&gt;{&lt;/code&gt;&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp comments"&gt;// Method begins at RVA 0x2053&lt;/code&gt;&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp comments"&gt;// Code size 5 (0x5)&lt;/code&gt;&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;.maxstack 8&lt;/code&gt;&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;IL_0000: nop&lt;/code&gt;&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;IL_0001: ldarg.0&lt;/code&gt;&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;IL_0002: ldc.i4.1&lt;/code&gt;&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;IL_0003: stind.i4&lt;/code&gt;&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;IL_0004: ret&lt;/code&gt;&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;&lt;code class="csharp plain"&gt;} &lt;/code&gt;&lt;code class="csharp comments"&gt;// end of method Program::Test1&lt;/code&gt;&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;&lt;code class="csharp plain"&gt;.method &lt;/code&gt;&lt;code class="csharp keyword"&gt;private&lt;/code&gt; &lt;code class="csharp plain"&gt;hidebysig &lt;/code&gt;&lt;code class="csharp keyword"&gt;static&lt;/code&gt;&lt;/div&gt;&lt;div class="line number18 index17 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;void&lt;/code&gt; &lt;code class="csharp plain"&gt;Test2 (&lt;/code&gt;&lt;/div&gt;&lt;div class="line number19 index18 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;int32&amp;amp; a&lt;/code&gt;&lt;/div&gt;&lt;div class="line number20 index19 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;) cil managed&lt;/code&gt;&lt;/div&gt;&lt;div class="line number21 index20 alt2"&gt;&lt;code class="csharp plain"&gt;{&lt;/code&gt;&lt;/div&gt;&lt;div class="line number22 index21 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp comments"&gt;// Method begins at RVA 0x2059&lt;/code&gt;&lt;/div&gt;&lt;div class="line number23 index22 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp comments"&gt;// Code size 5 (0x5)&lt;/code&gt;&lt;/div&gt;&lt;div class="line number24 index23 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;.maxstack 8&lt;/code&gt;&lt;/div&gt;&lt;div class="line number25 index24 alt2"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number26 index25 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;IL_0000: nop&lt;/code&gt;&lt;/div&gt;&lt;div class="line number27 index26 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;IL_0001: ldarg.0&lt;/code&gt;&lt;/div&gt;&lt;div class="line number28 index27 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;IL_0002: ldc.i4.1&lt;/code&gt;&lt;/div&gt;&lt;div class="line number29 index28 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;IL_0003: stind.i4&lt;/code&gt;&lt;/div&gt;&lt;div class="line number30 index29 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;IL_0004: ret&lt;/code&gt;&lt;/div&gt;&lt;div class="line number31 index30 alt2"&gt;&lt;code class="csharp plain"&gt;} &lt;/code&gt;&lt;code class="csharp comments"&gt;// end of method Program::Test2&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;发现了吗？ 它们在函数内部完全是一样的！因为他们的原理都是传入了这个变量的引用。只是 out 关键字前面出现了一个标记 [out]&lt;/p&gt;&lt;p&gt;它们在原理上的区别主要在于编译器对它们进行了一定的限制。&lt;/p&gt;&lt;p&gt;最上面&amp;ldquo;代码段一&amp;rdquo;中的问题你现在明白了吗？&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;问题二：关于引用类型&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;对于值类型来说，最难区别的是 ref 和 out，而对于引用类型来说就不同了。&lt;/p&gt;&lt;p&gt;首先，引用类型传的是引用，加了 ref 以后也是引用，所以它们是一样的？暂时我们就这么认为吧~ 我们暂时认为它们是一样的，并统称为：传引用。&lt;/p&gt;&lt;p&gt;所以，对于引用类型来说，out 和 传引用 的区别跟对于值类型传 ref 和 out 的区别类似，具体适用场景也和值类型类似，所以就不多加阐述了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;虽然我们说直接传和加 ref 都可以统称为传引用，但是它们还是有区别的！而且是一个很隐蔽的区别。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我们再来看一下最上面的代码段二：&lt;/p&gt;&lt;div&gt;&lt;div id="highlighter_319300" class="syntaxhighlighter  csharp"&gt;&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;div class="line number1 index0 alt2"&gt;1&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;2&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;3&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;4&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;5&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;6&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;7&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;8&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;9&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;10&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;11&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;12&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;13&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;14&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;15&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;16&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;17&lt;/div&gt;&lt;div class="line number18 index17 alt1"&gt;18&lt;/div&gt;&lt;div class="line number19 index18 alt2"&gt;19&lt;/div&gt;&lt;div class="line number20 index19 alt1"&gt;20&lt;/div&gt;&lt;div class="line number21 index20 alt2"&gt;21&lt;/div&gt;&lt;div class="line number22 index21 alt1"&gt;22&lt;/div&gt;&lt;div class="line number23 index22 alt2"&gt;23&lt;/div&gt;&lt;div class="line number24 index23 alt1"&gt;24&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="container"&gt;&lt;div class="line number1 index0 alt2"&gt;&lt;code class="csharp keyword"&gt;static&lt;/code&gt; &lt;code class="csharp keyword"&gt;void&lt;/code&gt; &lt;code class="csharp plain"&gt;Main(&lt;/code&gt;&lt;code class="csharp keyword"&gt;string&lt;/code&gt;&lt;code class="csharp plain"&gt;[] args)&lt;/code&gt;&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;&lt;code class="csharp plain"&gt;{&lt;/code&gt;&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;object&lt;/code&gt; &lt;code class="csharp plain"&gt;a = &lt;/code&gt;&lt;code class="csharp keyword"&gt;new&lt;/code&gt; &lt;code class="csharp keyword"&gt;object&lt;/code&gt;&lt;code class="csharp plain"&gt;(), b = &lt;/code&gt;&lt;code class="csharp keyword"&gt;new&lt;/code&gt; &lt;code class="csharp keyword"&gt;object&lt;/code&gt;&lt;code class="csharp plain"&gt;(), c = &lt;/code&gt;&lt;code class="csharp keyword"&gt;new&lt;/code&gt; &lt;code class="csharp keyword"&gt;object&lt;/code&gt;&lt;code class="csharp plain"&gt;();&lt;/code&gt;&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;Test1(&lt;/code&gt;&lt;code class="csharp keyword"&gt;out&lt;/code&gt; &lt;code class="csharp plain"&gt;a);&lt;/code&gt;&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;Test2(&lt;/code&gt;&lt;code class="csharp keyword"&gt;ref&lt;/code&gt; &lt;code class="csharp plain"&gt;b);&lt;/code&gt;&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;Test3(c);&lt;/code&gt;&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp comments"&gt;//最终 a,b,c 分别是什么？&lt;/code&gt;&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp comments"&gt;//a,b = null&lt;/code&gt;&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp comments"&gt;//c 还是 object&lt;/code&gt;&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;&lt;code class="csharp plain"&gt;}&lt;/code&gt;&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;&lt;code class="csharp keyword"&gt;static&lt;/code&gt; &lt;code class="csharp keyword"&gt;void&lt;/code&gt; &lt;code class="csharp plain"&gt;Test1(&lt;/code&gt;&lt;code class="csharp keyword"&gt;out&lt;/code&gt; &lt;code class="csharp keyword"&gt;object&lt;/code&gt; &lt;code class="csharp plain"&gt;a)&lt;/code&gt;&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;&lt;code class="csharp plain"&gt;{&lt;/code&gt;&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;a = &lt;/code&gt;&lt;code class="csharp keyword"&gt;null&lt;/code&gt;&lt;code class="csharp plain"&gt;;&lt;/code&gt;&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;&lt;code class="csharp plain"&gt;}&lt;/code&gt;&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;&lt;code class="csharp keyword"&gt;static&lt;/code&gt; &lt;code class="csharp keyword"&gt;void&lt;/code&gt; &lt;code class="csharp plain"&gt;Test2(&lt;/code&gt;&lt;code class="csharp keyword"&gt;ref&lt;/code&gt; &lt;code class="csharp keyword"&gt;object&lt;/code&gt; &lt;code class="csharp plain"&gt;b)&lt;/code&gt;&lt;/div&gt;&lt;div class="line number18 index17 alt1"&gt;&lt;code class="csharp plain"&gt;{&lt;/code&gt;&lt;/div&gt;&lt;div class="line number19 index18 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;b = &lt;/code&gt;&lt;code class="csharp keyword"&gt;null&lt;/code&gt;&lt;code class="csharp plain"&gt;;&lt;/code&gt;&lt;/div&gt;&lt;div class="line number20 index19 alt1"&gt;&lt;code class="csharp plain"&gt;}&lt;/code&gt;&lt;/div&gt;&lt;div class="line number21 index20 alt2"&gt;&lt;code class="csharp keyword"&gt;static&lt;/code&gt; &lt;code class="csharp keyword"&gt;void&lt;/code&gt; &lt;code class="csharp plain"&gt;Test3(&lt;/code&gt;&lt;code class="csharp keyword"&gt;object&lt;/code&gt; &lt;code class="csharp plain"&gt;c)&lt;/code&gt;&lt;/div&gt;&lt;div class="line number22 index21 alt1"&gt;&lt;code class="csharp plain"&gt;{&lt;/code&gt;&lt;/div&gt;&lt;div class="line number23 index22 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;c = &lt;/code&gt;&lt;code class="csharp keyword"&gt;null&lt;/code&gt;&lt;code class="csharp plain"&gt;;&lt;/code&gt;&lt;/div&gt;&lt;div class="line number24 index23 alt1"&gt;&lt;code class="csharp plain"&gt;}&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;out 关键字就相当于 return ，所以内部赋值为 null ，就相当于 return 了 null&lt;/p&gt;&lt;p&gt;可是，为什么引用类型还要加 ref 呢？它本身部已经是引用了吗？为什么加了以后就会有天大的区别呢？！&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;用一句话概括就是：不加 ref 的引用是堆引用，而加了 ref 后就是栈引用！ @_@ 好搞啊。。什么跟什么？让我们一步步说清楚吧！&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;正常的传递引用类型：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.dozer.cc/wp-content/uploads/2011/10/ref1.png" rel="group-30"&gt;&lt;img class="alignnone size-medium wp-image-480" title="ref1" src="http://www.dozer.cc/wp-content/uploads/2011/10/ref1-300x79.png" alt="" width="300" height="79" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;加了 ref 的传递引用类型：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.dozer.cc/wp-content/uploads/2011/10/ref2.png" rel="group-30"&gt;&lt;img class="alignnone size-medium wp-image-481" title="ref2" src="http://www.dozer.cc/wp-content/uploads/2011/10/ref2-300x79.png" alt="" width="300" height="79" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;这两张图对于上面那句话的解释很清楚了吧？&lt;/p&gt;&lt;p&gt;如果直接传，只是分配了一个新的栈空间，存放着同一个地址，指向同一个对象。&lt;/p&gt;&lt;p&gt;内外指向的都是同一个对象，所以对 对象内部的操作 都是同步的。&lt;/p&gt;&lt;p&gt;但是，如果把函数内部的 obj2 赋值了 null，只是修改了 obj2 的引用，而 obj1 依然是引用了原来的对象。&lt;/p&gt;&lt;p&gt;所以上面的例子中，外部的变量并没有收到影响。&lt;/p&gt;&lt;p&gt;同样，如果内部的对象作了 &amp;nbsp;obj2 = new object() 操作以后，也不会对外部的对象产生任何影响！&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;而加了 ref &amp;nbsp;后，传入的不是 object 地址，传入的是 object 地址的地址！&lt;/p&gt;&lt;p&gt;所以，当你对 obj2 赋 null 值的时候，其实是修改了 obj1 的地址，而自身的地址没变，还是引用到了 obj1&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;虽然在函数内部的语句是一样的，其实内部机制完全不同。我们可以看一下IL代码，一看就知道了！&lt;/p&gt;&lt;div&gt;&lt;div id="highlighter_472021" class="syntaxhighlighter  csharp"&gt;&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;div class="line number1 index0 alt2"&gt;1&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;2&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;3&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;4&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;5&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;6&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;7&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;8&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;9&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;10&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;11&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;12&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;13&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;14&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;15&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;16&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;17&lt;/div&gt;&lt;div class="line number18 index17 alt1"&gt;18&lt;/div&gt;&lt;div class="line number19 index18 alt2"&gt;19&lt;/div&gt;&lt;div class="line number20 index19 alt1"&gt;20&lt;/div&gt;&lt;div class="line number21 index20 alt2"&gt;21&lt;/div&gt;&lt;div class="line number22 index21 alt1"&gt;22&lt;/div&gt;&lt;div class="line number23 index22 alt2"&gt;23&lt;/div&gt;&lt;div class="line number24 index23 alt1"&gt;24&lt;/div&gt;&lt;div class="line number25 index24 alt2"&gt;25&lt;/div&gt;&lt;div class="line number26 index25 alt1"&gt;26&lt;/div&gt;&lt;div class="line number27 index26 alt2"&gt;27&lt;/div&gt;&lt;div class="line number28 index27 alt1"&gt;28&lt;/div&gt;&lt;div class="line number29 index28 alt2"&gt;29&lt;/div&gt;&lt;div class="line number30 index29 alt1"&gt;30&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="container"&gt;&lt;div class="line number1 index0 alt2"&gt;&lt;code class="csharp plain"&gt;.method &lt;/code&gt;&lt;code class="csharp keyword"&gt;private&lt;/code&gt; &lt;code class="csharp plain"&gt;hidebysig &lt;/code&gt;&lt;code class="csharp keyword"&gt;static&lt;/code&gt;&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;void&lt;/code&gt; &lt;code class="csharp plain"&gt;Test1 (&lt;/code&gt;&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;object&lt;/code&gt; &lt;code class="csharp plain"&gt;a&lt;/code&gt;&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;) cil managed&lt;/code&gt;&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;&lt;code class="csharp plain"&gt;{&lt;/code&gt;&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp comments"&gt;// Method begins at RVA 0x2053&lt;/code&gt;&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp comments"&gt;// Code size 5 (0x5)&lt;/code&gt;&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;.maxstack 8&lt;/code&gt;&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;IL_0000: nop&lt;/code&gt;&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;IL_0001: ldnull&lt;/code&gt;&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;IL_0002: starg.s a&lt;/code&gt;&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;IL_0004: ret&lt;/code&gt;&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;&lt;code class="csharp plain"&gt;} &lt;/code&gt;&lt;code class="csharp comments"&gt;// end of method Program::Test1&lt;/code&gt;&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;&lt;code class="csharp plain"&gt;.method &lt;/code&gt;&lt;code class="csharp keyword"&gt;private&lt;/code&gt; &lt;code class="csharp plain"&gt;hidebysig &lt;/code&gt;&lt;code class="csharp keyword"&gt;static&lt;/code&gt;&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;void&lt;/code&gt; &lt;code class="csharp plain"&gt;Test2 (&lt;/code&gt;&lt;/div&gt;&lt;div class="line number18 index17 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;object&lt;/code&gt;&lt;code class="csharp plain"&gt;&amp;amp; a&lt;/code&gt;&lt;/div&gt;&lt;div class="line number19 index18 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;) cil managed&lt;/code&gt;&lt;/div&gt;&lt;div class="line number20 index19 alt1"&gt;&lt;code class="csharp plain"&gt;{&lt;/code&gt;&lt;/div&gt;&lt;div class="line number21 index20 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp comments"&gt;// Method begins at RVA 0x2059&lt;/code&gt;&lt;/div&gt;&lt;div class="line number22 index21 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp comments"&gt;// Code size 5 (0x5)&lt;/code&gt;&lt;/div&gt;&lt;div class="line number23 index22 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;.maxstack 8&lt;/code&gt;&lt;/div&gt;&lt;div class="line number24 index23 alt1"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number25 index24 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;IL_0000: nop&lt;/code&gt;&lt;/div&gt;&lt;div class="line number26 index25 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;IL_0001: ldarg.0&lt;/code&gt;&lt;code class="csharp comments"&gt;//多了这行代码&lt;/code&gt;&lt;/div&gt;&lt;div class="line number27 index26 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;IL_0002: ldnull&lt;/code&gt;&lt;/div&gt;&lt;div class="line number28 index27 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;IL_0003: stind.&lt;/code&gt;&lt;code class="csharp keyword"&gt;ref&lt;/code&gt;&lt;/div&gt;&lt;div class="line number29 index28 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;IL_0004: ret&lt;/code&gt;&lt;/div&gt;&lt;div class="line number30 index29 alt1"&gt;&lt;code class="csharp plain"&gt;} &lt;/code&gt;&lt;code class="csharp comments"&gt;// end of method Program::Test2&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;上面是直接传入，并赋 null 值的&lt;/p&gt;&lt;p&gt;下面是加 ref 的&lt;/p&gt;&lt;p&gt;我们可以发现仅仅是多了一行代码：IL_0001: ldarg.0&lt;/p&gt;&lt;p&gt;其实，这样代码的作用就是讲参数0加载到堆栈上，也就是先根据引用，找到了外部的变量，然后再根据外部的变量，找到了最终的对象！&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;那现在你知道什么时候该加 ref，什么时候不用加 ref 了吗？&lt;/p&gt;&lt;p&gt;再看了一个例子：&lt;/p&gt;&lt;div&gt;&lt;div id="highlighter_557833" class="syntaxhighlighter  csharp"&gt;&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;div class="line number1 index0 alt2"&gt;1&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;2&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;3&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;4&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;5&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;6&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;7&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;8&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="container"&gt;&lt;div class="line number1 index0 alt2"&gt;&lt;code class="csharp keyword"&gt;private&lt;/code&gt; &lt;code class="csharp keyword"&gt;static&lt;/code&gt; &lt;code class="csharp keyword"&gt;void&lt;/code&gt; &lt;code class="csharp plain"&gt;Test1(List&amp;lt;&lt;/code&gt;&lt;code class="csharp keyword"&gt;int&lt;/code&gt;&lt;code class="csharp plain"&gt;&amp;gt; list)&lt;/code&gt;&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;&lt;code class="csharp plain"&gt;{&lt;/code&gt;&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;list.Clear();&lt;/code&gt;&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;&lt;code class="csharp plain"&gt;}&lt;/code&gt;&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;&lt;code class="csharp keyword"&gt;private&lt;/code&gt; &lt;code class="csharp keyword"&gt;static&lt;/code&gt; &lt;code class="csharp keyword"&gt;void&lt;/code&gt; &lt;code class="csharp plain"&gt;Test2(&lt;/code&gt;&lt;code class="csharp keyword"&gt;ref&lt;/code&gt; &lt;code class="csharp plain"&gt;List&amp;lt;&lt;/code&gt;&lt;code class="csharp keyword"&gt;int&lt;/code&gt;&lt;code class="csharp plain"&gt;&amp;gt; list)&lt;/code&gt;&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;&lt;code class="csharp plain"&gt;{&lt;/code&gt;&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;list = &lt;/code&gt;&lt;code class="csharp keyword"&gt;new&lt;/code&gt; &lt;code class="csharp plain"&gt;List&amp;lt;&lt;/code&gt;&lt;code class="csharp keyword"&gt;int&lt;/code&gt;&lt;code class="csharp plain"&gt;&amp;gt;();&lt;/code&gt;&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;&lt;code class="csharp plain"&gt;}&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;同样是清空一个 List，如果没加 ref ，只能用 clear。&lt;/p&gt;&lt;p&gt;而加了 ref 后可以直接 new 一个新的~&lt;/p&gt;&lt;p&gt;如果你没加 ref 就直接 new 一个新的了，抱歉，外部根本不知道有这个东西，你们操作的将不是同一个 List&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;所以，你一定要了解这点，并注意一下几件事：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;1、一般情况下不要用 ref&lt;/p&gt;&lt;p&gt;2、如果你没加 ref，千万别直接给它赋值，因为外面会接收不到&amp;hellip;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;现在你全部明白了吗？^_^&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;原文地址：&lt;a href="http://www.dozer.cc/2011/10/ref-and-out-keywords/"&gt;把 ref 和 out 关键字说透&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/dozer/aggbug/2227953.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/dozer/archive/2011/10/28/ref-and-out-keywords.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/dozer/archive/2011/08/07/to-enable-custom-linq-querying-of-generic-type.html</id><title type="text">不继承 IEnumerable 或 IQueryable 的类型怎么使用 LINQ 查询</title><summary type="text">最近想研究如何自定义 LINQ Provider ，但是一直无法入手，先写点收获吧~MSDN 上的这篇文章（《启用数据源以进行 LINQ 查询》）中写到：如果想对自己的数据源进行 LINQ 查询，那必须使用一下四种方法的其中一种。实现 IEnumerable 接口实现标准的查询方法实现 IQueryable 接口扩展已经实现的 LINQ 查询看到其中第二条，让人心生疑惑，那下面就来探讨一下吧~</summary><published>2011-08-06T16:21:00Z</published><updated>2011-08-06T16:21:00Z</updated><author><name>Dozer</name><uri>http://www.cnblogs.com/dozer/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dozer/archive/2011/08/07/to-enable-custom-linq-querying-of-generic-type.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dozer/archive/2011/08/07/to-enable-custom-linq-querying-of-generic-type.html"/><content type="html">【摘要】最近想研究如何自定义 LINQ Provider ，但是一直无法入手，先写点收获吧~MSDN 上的这篇文章（《启用数据源以进行 LINQ 查询》）中写到：如果想对自己的数据源进行 LINQ 查询，那必须使用一下四种方法的其中一种。实现 IEnumerable 接口实现标准的查询方法实现 IQueryable 接口扩展已经实现的 LINQ 查询看到其中第二条，让人心生疑惑，那下面就来探讨一下吧~ &lt;a href="最近想研究如何自定义 LINQ Provider ，但是一直无法入手，先写点收获吧~MSDN 上的这篇文章（《启用数据源以进行 LINQ 查询》）中写到：如果想对自己的数据源进行 LINQ 查询，那必须使用一下四种方法的其中一种。实现 IEnumerable 接口实现标准的查询方法实现 IQueryable 接口扩展已经实现的 LINQ 查询看到其中第二条，让人心生疑惑，那下面就来探讨一下吧~" target="_blank"&gt;http://www.cnblogs.com/dozer/archive/2011/08/07/to-enable-custom-linq-querying-of-generic-type.html&lt;/a&gt;&lt;img src="http://www.cnblogs.com/dozer/aggbug/2129757.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/dozer/archive/2011/08/07/to-enable-custom-linq-querying-of-generic-type.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/dozer/archive/2011/03/21/navigation-highlight-in-mv.html</id><title type="text">MVC 下导航高亮的一种解决方案</title><summary type="text">前言导航高亮一直是一个让大家头疼的问题。纯 Javascript 的话可以判断当前页面的地址和链接地址是否有关系。这样的弊端就是自由度太低，MVC 下会出一定的问题 （MVC 下有默认的 Controller 和 Action）另一种方案是前端后端结合，为每一张页面设置一个属性，然后在页面中判断。满足条件便高亮。这样的弊端就是，需要为你所有的页面设置属性，非常麻烦！那么有没有什么完美的解决方案？一劳永逸的？神奇的 eval 函数Javascript 有精粹也有糟粕，其中的 eval 是大多数动态语言都拥有的精髓。我们是否可以利用这个函数呢？基本思路：给每一个 li（对应一个链接）设置一个 cl</summary><published>2011-03-21T06:07:00Z</published><updated>2011-03-21T06:07:00Z</updated><author><name>Dozer</name><uri>http://www.cnblogs.com/dozer/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dozer/archive/2011/03/21/navigation-highlight-in-mv.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dozer/archive/2011/03/21/navigation-highlight-in-mv.html"/><content type="html">&lt;p&gt;&lt;strong&gt;前言&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;导航高亮一直是一个让大家头疼的问题。&lt;/p&gt;&lt;p&gt;纯 Javascript 的话可以判断当前页面的地址和链接地址是否有关系。&lt;/p&gt;&lt;p&gt;这样的弊端就是自由度太低，MVC 下会出一定的问题 （MVC 下有默认的 Controller 和 Action）&lt;/p&gt;&lt;p&gt;另一种方案是前端后端结合，为每一张页面设置一个属性，然后在页面中判断。满足条件便高亮。&lt;/p&gt;&lt;p&gt;这样的弊端就是，需要为你所有的页面设置属性，非常麻烦！&lt;/p&gt;&lt;p&gt;那么有没有什么完美的解决方案？一劳永逸的？&lt;/p&gt;&lt;p&gt;&lt;strong&gt;神奇的 eval 函数&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Javascript 有精粹也有糟粕，其中的 eval 是大多数动态语言都拥有的精髓。我们是否可以利用这个函数呢？&lt;/p&gt;&lt;p&gt;&lt;strong&gt;基本思路：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;给每一个 li（对应一个链接）设置一个 class，例如 class=&amp;rdquo;controller_Home&amp;rdquo;，&lt;/p&gt;&lt;p&gt;代表着，只要这张页面是的 controller 是 Home，就让这个链接高亮。&lt;/p&gt;&lt;p&gt;而在页面中，是可以通过代码直接得到 controller 和 action 的名称的，没必要为每一张页面单独手动设置。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;div id="highlighter_19704" class="syntaxhighlighter  xml"&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;ul &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="top-navigation"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;li &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;class&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="controller_Home"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;span&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;span&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;@Html.ActionLink("首页","Index","Home")&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;span&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;span&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;li&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;li &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;class&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="controller_Article"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;span&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;span&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;@Html.ActionLink("文章管理","Index","Article")&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;span&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;span&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;li&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;li &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;class&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="controller_User"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;span&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;span&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;@Html.ActionLink("用户管理","Index","User")&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;span&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;span&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;li&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;ul&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;input &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="controller"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="hidden"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="@Html.ViewContext.RouteData.Values["&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;controller"]"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;input &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="action"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="hidden"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="@Html.ViewContext.RouteData.Values["&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;action"]"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="syntaxhighlighter  xml"&gt;&lt;strong&gt;View 中的代码如上所示：&lt;/strong&gt;&lt;/div&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;首先给所有的 li 加上一个 class&lt;/li&gt;&lt;li&gt;然后再利用两个 hidden ，把 controller 和 action 的名字放到前端页面中&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;div id="highlighter_257624" class="syntaxhighlighter  js"&gt;&lt;span size="3" style="font-size: small;"&gt;&lt;span style="line-height: normal;"&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;$(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; () {&lt;br /&gt;    SetNavClass(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;top-navigation&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;active&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;});&lt;br /&gt; &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; SetNavClass(ulId, className) {&lt;br /&gt;    controller &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; $(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;#controller&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;).val();&lt;br /&gt;    action &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; $(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;#action&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;).val();&lt;br /&gt;    eval(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;controller_&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; controller &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt; = true&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;    eval(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;action_&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; action &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt; = true&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;    list &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; $(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;#&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; ulId &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;li&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt; &lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; k &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;; k &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; list.length; k&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;) {&lt;br /&gt;        item &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; list[k];&lt;br /&gt;        str &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; GetClassName(item);&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;span style="color: #000000;"&gt; {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (eval(str)) $(item).addClass(className);&lt;br /&gt;        } &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt;&lt;span style="color: #000000;"&gt; (e) { }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; GetClassName(item) {&lt;br /&gt;    classes &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; $(item).attr(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;).split(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; k &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;; k &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; classes.length; k&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;) {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (classes[k].indexOf(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;controller&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;) &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;||&lt;/span&gt;&lt;span style="color: #000000;"&gt; classes[k].indexOf(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;action&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;) &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;) &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; classes[k];&lt;br /&gt;    }&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;以上是 Javascript 的代码：&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;读取 controller 和 action 的名字&lt;/li&gt;&lt;li&gt;利用 eval 函数给 controller_[controller名字] 和 action_[action名字] 这两个变量赋值&lt;/li&gt;&lt;li&gt;取出 class 中的表达式&lt;/li&gt;&lt;li&gt;利用 eval 函数执行表达式，判断最后的结果，如果满足条件就加上高亮的 class&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;上述代码不需要为每个页面编写，只需要在母版页中编写一次即可，再引用这段 Javascript 函数。&lt;/p&gt;&lt;p&gt;如果你的 ul ID 和 高亮 class 名字不一样，那么只要在调用这个函数的时候传入你自己的就行了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;高级应用&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;就这么简单？仅此而已？&lt;/p&gt;&lt;p&gt;如果真的是这样，那么完全可以直接利用 Javascript 判断页面地址来实现。&lt;/p&gt;&lt;p&gt;那么让我们来玩一些好玩的吧~&lt;/p&gt;&lt;p&gt;因为是 eval 函数，所以完全可以在这个 class 中编写复杂的表达式（其实就是 Javascript 表达式）&lt;/p&gt;&lt;div&gt;&lt;div id="highlighter_748102" class="syntaxhighlighter  xml"&gt;&lt;/div&gt;&lt;div class="syntaxhighlighter  xml"&gt;&lt;span size="3" style="font-size: small;"&gt;&lt;span style="line-height: normal;"&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;li &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;class&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="controller_Home||controller_About"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;span&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;span&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;@Html.ActionLink("首页", "Index", "Home")&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;span&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;span&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;li&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;li &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;class&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="controller_Article&amp;amp;&amp;amp;action_Add"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;span&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;span&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;@Html.ActionLink("文章管理", "Index", "Article")&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;span&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;span&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;li&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;以上两行代码表示：&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;controller 只要是 Home，或者 About，都会激活这个链接&lt;/li&gt;&lt;li&gt;controller 必须是 Article，action 必须是 Add&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;也就是说，在这个 class 里可以输入复杂的 Javascript，这样就可以实现复杂的导航激活功能了！&lt;/p&gt;&lt;p&gt;&lt;br class="spacer_" /&gt;&lt;/p&gt;&lt;p&gt;原文地址：&lt;a href="http://www.dozer.cc/2011/03/navigation-highlight-in-mv/"&gt;MVC 下导航高亮的完美解决方案&lt;/a&gt;&amp;nbsp;(原文就是我自己的博客~ 所以是原创，不是转载~)&lt;/p&gt;&lt;img src="http://www.cnblogs.com/dozer/aggbug/1990201.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/dozer/archive/2011/03/21/navigation-highlight-in-mv.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/dozer/archive/2011/01/26/ucenter-api-in-depth.html</id><title type="text">深入研究 UCenter API</title><summary type="text">目录：开篇通讯原理：UCenter API与子站之间的通讯原理和单点登陆原理加密与解密：AuthCode详解 &amp; AuthCode函数翻译过程中的注意点网站搭建： 康盛旗下网站 &amp; Asp.net 网站搭建</summary><published>2011-01-26T15:47:00Z</published><updated>2011-01-26T15:47:00Z</updated><author><name>Dozer</name><uri>http://www.cnblogs.com/dozer/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dozer/archive/2011/01/26/ucenter-api-in-depth.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dozer/archive/2011/01/26/ucenter-api-in-depth.html"/><content type="html">&lt;p&gt;&lt;span style="color: #4e4e4e; font-size: 13px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; line-height: normal;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote style="margin-top: 1em; margin-right: 211px; margin-bottom: 1em; margin-left: 0px; padding-top: 0.6em; padding-right: 1em; padding-bottom: 0.6em; padding-left: 2.4em; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; min-height: 40px; font-style: italic; color: #474747; background-image: url(http://www.dozer.cc/wp-content/themes/mystique/images/blockquote.png); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ffffff; background-position: 4px 0%; background-repeat: no-repeat no-repeat; border: 1px dotted #dddddd;"&gt;&lt;p&gt;&lt;strong&gt;目录：&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.dozer.cc/2011/01/ucenter-api-in-depth-1st/" target="_blank"&gt;开篇&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.dozer.cc/2011/01/ucenter-api-in-depth-2nd/" target="_blank"&gt;通讯原理：UCenter API&amp;nbsp;与子站之间的通讯原理和单点登陆原理&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.dozer.cc/2011/01/ucenter-api-in-depth-3rd/" target="_blank"&gt;加密与解密：AuthCode详解 &amp;amp; AuthCode函数翻译过程中的注意点&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.dozer.cc/2011/02/ucenter-api-in-depth-4th/" target="_blank"&gt;网站搭建： 康盛旗下网站 &amp;amp; Asp.net 网站搭建&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ol style="margin-top: 0.4em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; line-height: 19px; padding: 0px;"&gt;&lt;/ol&gt;&lt;/blockquote&gt;&lt;img src="http://www.cnblogs.com/dozer/aggbug/1945845.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/dozer/archive/2011/01/26/ucenter-api-in-depth.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/dozer/archive/2010/12/05/MVC-Title-and-Sitemap.html</id><title type="text">利用Attribute扩展MVC的Title和Sitemap</title><summary type="text">开篇无论是 Asp.net 还是 MVC 中，想要设置网站的 Title 或者 Sitemap (不用控件)总是很麻烦。Title 和 Sitemap 都是有关联的，所以有什么办法可以 Write once, run anywhere 呢？先看一下效果和用法吧～[效果][用法：Controller中][用法：View中][用法总结]只要在 Controller 和 Action 上加上 Attri...</summary><published>2010-12-05T12:26:00Z</published><updated>2010-12-05T12:26:00Z</updated><author><name>Dozer</name><uri>http://www.cnblogs.com/dozer/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dozer/archive/2010/12/05/MVC-Title-and-Sitemap.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dozer/archive/2010/12/05/MVC-Title-and-Sitemap.html"/><content type="html">&lt;p&gt;&lt;strong&gt;开篇&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;无论是 Asp.net 还是 MVC 中，想要设置网站的 Title 或者 Sitemap (不用控件)总是很麻烦。&lt;/p&gt;&lt;p&gt;Title 和 Sitemap 都是有关联的，所以有什么办法可以 Write once, run anywhere 呢？&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;先看一下效果和用法吧～&lt;/p&gt;&lt;p&gt;[效果]&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/dozer/Windows-Live-Writer/ad4c83f9ec52_DFF1/image_2.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/dozer/Windows-Live-Writer/ad4c83f9ec52_DFF1/image_thumb.png" border="0" alt="image" width="432" height="379" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;[用法：Controller中]&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/dozer/Windows-Live-Writer/ad4c83f9ec52_DFF1/image_4.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/dozer/Windows-Live-Writer/ad4c83f9ec52_DFF1/image_thumb_1.png" border="0" alt="image" width="633" height="335" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;[用法：View中]&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/dozer/Windows-Live-Writer/ad4c83f9ec52_DFF1/image_6.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/dozer/Windows-Live-Writer/ad4c83f9ec52_DFF1/image_thumb_2.png" border="0" alt="image" width="295" height="189" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;[用法总结]&lt;/p&gt;&lt;p&gt;只要在 Controller 和 Action 上加上 Attribute 就可以设置当前 Controller 的 名字和 Action 的名字。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;设置 Controller 和 Action 的属性&lt;/strong&gt;&lt;/p&gt;[NewPath("Demo", Controller = "Home", Action = "Index")]&lt;br/&gt;public class HomeController : Controller&lt;br/&gt;{&lt;br/&gt;    [NewPath("首页", Controller = "Home", Action = "Index")]&lt;br/&gt;    public ActionResult Index()&lt;br/&gt;    {&lt;br/&gt;        ViewData["Message"] = "欢迎使用 ASP.NET MVC!";&lt;br/&gt;        return View();&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    public ActionResult About()&lt;br/&gt;    {&lt;br/&gt;        this.SetNewPath("关于", new { Controller = "Home", Action = "About" });&lt;br/&gt;        return View();&lt;br/&gt;    }&lt;br/&gt;}&lt;p&gt;这里，我这个网站名是Demo，那我给所有的 Controller 都加上 Demo 这个名称和相关信息即可&lt;/p&gt;&lt;p&gt;然后，有两张页面，分别是&amp;ldquo;首页&amp;rdquo;和&amp;ldquo;关于&amp;rdquo;&lt;/p&gt;&lt;p&gt;那我只要在 Action 上加上他们的名称和相关信息即可&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Q1：是否可以加多个 Attrubute？&lt;/p&gt;&lt;p&gt;A1：可以，而且可以设置 Order 来设置他们的顺序&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Q2：我需要，网站名、首页、文章、文章标题 这样的路径怎么办？&lt;/p&gt;&lt;p&gt;A2：代码如下，除了可以在 Attrubute 中设置外，还可以在 Action 代码中设置，因为有些信息需要经过处理后才能得到&lt;/p&gt;[NewPath("Demo", Controller = "Home", Action = "Index", Order = 1)]&lt;br/&gt;[NewPath("首页", Controller = "Home", Action = "Index", Order = 2)]&lt;br/&gt;public class HomeController : Controller&lt;br/&gt;{&lt;br/&gt;    [NewPath("新闻", Controller = "News", Action = "Index")]&lt;br/&gt;    public ActionResult Detail(int? id)&lt;br/&gt;    {&lt;br/&gt;        this.SetNewPath("新闻标题", new {Controller = "News", Action = "detail", id = id.Value});&lt;br/&gt;        return View();&lt;br/&gt;    }&lt;br/&gt;}&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;在View中显示&lt;/strong&gt;&lt;/p&gt;一般把上图的代码放在 MasterPage 中，因为他们的用法都是调用同一个函数&amp;nbsp;除了上面提供的两个主要函数外，还有一个很自由的函数：&amp;nbsp;&amp;lt;h2&amp;gt;&amp;lt;%=Html.GetSitemap() %&amp;gt;&amp;lt;/h2&amp;gt;&lt;br/&gt;&amp;lt;h2&amp;gt;&amp;lt;%=Html.GetWebPath("&amp;lt;a href=\"{1}\"&amp;gt;{0}&amp;lt;/a&amp;gt;", " / ") %&amp;gt;&amp;lt;/h2&amp;gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/dozer/Windows-Live-Writer/ad4c83f9ec52_DFF1/image_8.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/dozer/Windows-Live-Writer/ad4c83f9ec52_DFF1/image_thumb_3.png" border="0" alt="image" width="169" height="113" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;这里，只要传入显示模板和分隔符模板，就可以随意地自定义内容了&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;源代码和例子&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://files.cnblogs.com/dozer/MVCAttribute.zip" target="_blank"&gt;&lt;strong&gt;下载地址&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/dozer/aggbug/1897115.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/dozer/archive/2010/12/05/MVC-Title-and-Sitemap.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/dozer/archive/2010/11/11/Unobtrusive-JavaScript-in-ASP-NET-MVC-3.html</id><title type="text">Unobtrusive JavaScript in ASP.NET MVC 3</title><summary type="text">Unobtrusive JavaScript 是什么？以上的代码分别是 MVC 3 在“关闭”和“开启” Unobtrusive JavaScript 后生成的 Ajax.ActionLink。那 Unobtrusive JavaScript到 底是什么呢？简单地来说，就是一种代码分离的思想，把行为层和表现层分离开。具体的可以查看维基百科下对Unob...</summary><published>2010-11-11T04:14:00Z</published><updated>2010-11-11T04:14:00Z</updated><author><name>Dozer</name><uri>http://www.cnblogs.com/dozer/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dozer/archive/2010/11/11/Unobtrusive-JavaScript-in-ASP-NET-MVC-3.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dozer/archive/2010/11/11/Unobtrusive-JavaScript-in-ASP-NET-MVC-3.html"/><content type="html">&lt;p&gt;&lt;strong&gt;Unobtrusive JavaScript 是什么？&lt;/strong&gt;&lt;/p&gt;&amp;lt;!--以下是常规Javascript下写出来的Ajax--&amp;gt;&lt;br/&gt;&amp;lt;div id="test"&amp;gt;&lt;br/&gt;    &amp;lt;a href="/" onclick="Sys.Mvc.AsyncHyperlink.handleClick(this, new Sys.UI.DomEvent(event), { insertionMode: Sys.Mvc.InsertionMode.replace, httpMethod: 'GET', updateTargetId: 'test' });"&amp;gt;测试&amp;lt;/a&amp;gt;&lt;br/&gt;&amp;lt;/div&amp;gt;&lt;br/&gt;&lt;br/&gt;&amp;lt;!--以下是Unobtrusive Javascript下写出来的Ajax--&amp;gt;&lt;br/&gt;&amp;lt;div id="test"&amp;gt;&lt;br/&gt;    &amp;lt;a data-ajax="true" data-ajax-method="GET" data-ajax-mode="replace" data-ajax-update="#test" href="/"&amp;gt;测试&amp;lt;/a&amp;gt;&lt;br/&gt;&amp;lt;/div&amp;gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;以上的代码分别是 MVC 3 在&amp;ldquo;关闭&amp;rdquo;和&amp;ldquo;开启&amp;rdquo; Unobtrusive JavaScript 后生成的 Ajax.ActionLink。&lt;/p&gt;&lt;p&gt;那 Unobtrusive JavaScript到 底是什么呢？简单地来说，就是一种代码分离的思想，把行为层和表现层分离开。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;具体的可以查看维基百科下对&lt;a href="http://en.wikipedia.org/wiki/Unobtrusive_JavaScript" target="_blank"&gt;&lt;strong&gt;Unobtrusive JavaScript&lt;/strong&gt;&lt;/a&gt;的解释。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Unobtrusive JavaScriptin ASP.NET MVC 3&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Unobtrusive JavaScript 的好处显而易见，但是如何在MVC3使用Unobtrusive JavaScript呢？&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1、引用相应的Javascript文件&lt;/strong&gt;&lt;/p&gt;&amp;lt;script src="@Url.Content("~/Scripts/jquery-1.4.1.min.js")" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;br/&gt;&amp;lt;script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;br/&gt;&amp;lt;script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;br/&gt;&amp;lt;script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;这四个文件包含在 MVC 3 的 Scripts 文件夹中，直接引用即可。&lt;/p&gt;&lt;p&gt;值得注意的是：jquery.unobtrusive-ajax.min.js 和 jquery.validate.unobtrusive.min.js 是两个用来让 jquery 支持 Unobtrusive JavaScript 的库。&lt;/p&gt;&lt;p&gt;在 jQuery 官网上看不到，打开后发现，原来是微软自己写的。&lt;/p&gt;&lt;p&gt;另外，以前用来实现 MVC Ajax 和客户端验证的三个文件 MicrosoftAjax, MicrosoftMvcAjax.js, MicrosoftMvcValidation.js 不需要再引用了。&lt;/p&gt;&lt;p&gt;原因就是因为，微软在 MVC 3 使用 jQuery 来实现 Ajax 了，而上面两个 javascript 库就相当于是两个 &lt;a href="http://zh.wikipedia.org/zh/%E9%80%82%E9%85%8D%E5%99%A8%E6%A8%A1%E5%BC%8F" target="_blank"&gt;&lt;strong&gt;Adapter（适配器）&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2、开启 Unobtrusive JavaScript&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;MVC3中的Web.Config文件中默认多了两个配置项&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/dozer/Windows-Live-Writer/Unobtrusive-JavaScript-in-MVC3_90FF/image_2.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/dozer/Windows-Live-Writer/Unobtrusive-JavaScript-in-MVC3_90FF/image_thumb.png" border="0" alt="image" width="443" height="92" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;这里是一个全局设置，你可以打开或者关闭。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;另外，你也可以在任何一个 Action 或 Controller 中执行以下代码，灵活地进行控制，来处理一些特殊的 Action 或 Controller。&lt;/p&gt;HtmlHelper.ClientValidationEnabled = true;&lt;br/&gt;HtmlHelper.UnobtrusiveJavaScriptEnabled = true;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3、如果不需要用 Unobtrusive JavaScript 呢？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果不需要用的话根据上面的方法关闭即可。&lt;/p&gt;&lt;p&gt;但是要注意一点！这时候，如果你需要用 Ajax 或者客户端验证，务必引用MVC3以前版本中的三个 javascript文件：MicrosoftAjax, MicrosoftMvcAjax.js, MicrosoftMvcValidation.js&lt;/p&gt;&lt;p&gt;否则就不能实现Ajax 和客户端验证了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Unobtrusive Ajax in ASP.NET MVC 3&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;原文：&lt;a href="http://bradwilson.typepad.com/blog/2010/10/mvc3-unobtrusive-ajax.html" target="_blank"&gt;&lt;strong&gt;《Unobtrusive Ajax in ASP.NET MVC 3》&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;关于 AjaxOptions&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;MVC 中 AjaxHelper 的扩展方法，提供了一系列的 Ajax 方法，例如：ActionLink RouteLink, BeginForm, BeginRouteForm 等。它们的使用方法和 HtmlHelper很像，主要的区别就在于 AjaxHelper 有一个 AjaxOptions 参数。&lt;/p&gt;public class AjaxOptions {&lt;br/&gt;    public string Confirm { get; set; }&lt;br/&gt;    public string HttpMethod { get; set; }&lt;br/&gt;    public InsertionMode InsertionMode { get; set; }&lt;br/&gt;    public int LoadingElementDuration { get; set; }&lt;br/&gt;    public string LoadingElementId { get; set; }&lt;br/&gt;    public string OnBegin { get; set; }&lt;br/&gt;    public string OnComplete { get; set; }&lt;br/&gt;    public string OnFailure { get; set; }&lt;br/&gt;    public string OnSuccess { get; set; }&lt;br/&gt;    public string UpdateTargetId { get; set; }&lt;br/&gt;    public string Url { get; set; }&lt;br/&gt;}&lt;p&gt;这些属性会告诉 MVC 如何生成你的 Ajax 代码。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;传统的生成方式&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;当 unobtrusive 模式被关闭的时候，MVC 会把代码写在你的 &amp;lt;a&amp;gt; 标签或者 &amp;lt;form&amp;gt; 标签中，并且靠 MicrosoftAjax.js 和 MicrosoftMvcAjax.js 来执行相应的代码。&lt;/p&gt;&amp;lt;form&lt;br/&gt;    action="/ajax/callback"&lt;br/&gt;    id="form0"&lt;br/&gt;    method="post"&lt;br/&gt;    onclick="Sys.Mvc.AsyncForm.handleClick(this, new Sys.UI.DomEvent(event));"&lt;br/&gt;    onsubmit="Sys.Mvc.AsyncForm.handleSubmit(this, new Sys.UI.DomEvent(event), { insertionMode: Sys.Mvc.InsertionMode.replace, loadingElementId: 'loading', updateTargetId: 'updateme' });"&amp;gt;&lt;p&gt;MVC1 和 MVC2 中就是这样做的。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;依赖于 Unobtrusive JavaScript 的生成方式&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;当 unobtrusive 模式打开的时候，代码彻底的改变了，而且是那么地简洁！&lt;/p&gt;&amp;lt;form&lt;br/&gt;    action="/ajax/callback"&lt;br/&gt;    data-ajax="true"&lt;br/&gt;    data-ajax-loading="#loading"&lt;br/&gt;    data-ajax-mode="replace"&lt;br/&gt;    data-ajax-update="#updateme"&lt;br/&gt;    method="post"&amp;gt;&lt;p&gt;你会发现这些HTML代码是非常容易读懂的。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;映射AjaxOptions属性&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;下表列出了 AjaxOptions 和 HTML 5 的映射关系&lt;/p&gt;&lt;table border="1" cellspacing="0" cellpadding="4"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;AjaxOptions&lt;/th&gt;      &lt;th&gt;HTML attribute&lt;/th&gt;    &lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Confirm&lt;/td&gt;&lt;td&gt;data-ajax-confirm&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;HttpMethod&lt;/td&gt;&lt;td&gt;data-ajax-method&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;InsertionMode&lt;/td&gt;&lt;td&gt;data-ajax-mode *&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;LoadingElementDuration&lt;/td&gt;&lt;td&gt;data-ajax-loading-duration **&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;LoadingElementId&lt;/td&gt;&lt;td&gt;data-ajax-loading&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OnBegin&lt;/td&gt;&lt;td&gt;data-ajax-begin&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OnComplete&lt;/td&gt;&lt;td&gt;data-ajax-complete&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OnFailure&lt;/td&gt;&lt;td&gt;data-ajax-failure&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OnSuccess&lt;/td&gt;&lt;td&gt;data-ajax-success&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;UpdateTargetId&lt;/td&gt;&lt;td&gt;data-ajax-update&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Url&lt;/td&gt;&lt;td&gt;data-ajax-url&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;除了这些属性外，还有一个额外的 data-ajax="true" 属性，代表这是一个 Ajax 方法。&lt;/p&gt;&lt;p&gt;* = data-ajax-mode 只有在设置 UpdateTargetId 被设置后才有效。&lt;/p&gt;&lt;p&gt;** =&amp;nbsp; data-ajax-loading-duration 只有在 LoadingElementId 被设置后才有效。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Ajax 回调&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;传统 Ajax 和 unobtrusive JavaScript 的主要区别就在于 Ajax 的回调。当所有的回调函数都被定义在 Ajax 库中以后，你的代码就会变成这种理想化的风格。&lt;/p&gt;&lt;p&gt;当你在 MVC 3 中使用 unobtrusive Ajax 的时候，四个基本的回调函数会被因设为 jQuery.Ajax 的函数。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;OnBegin =&amp;gt; &amp;ldquo;beforeSend&amp;rdquo;&lt;/p&gt;&lt;p&gt;OnComplete =&amp;gt; &amp;ldquo;complete&amp;rdquo;&lt;/p&gt;&lt;p&gt;OnFailure =&amp;gt; &amp;ldquo;error&amp;rdquo;&lt;/p&gt;&lt;p&gt;OnSuccess = &amp;gt; &amp;ldquo;success&amp;rdquo;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;你可以给他们传递一个函数名，或一段匿名函数作为处理函数。&lt;/p&gt;&lt;p&gt;如果你的处理函数是一个函数名，并且参数列表符合Ajax标准，那么 jQuery.Ajax 便会把值传递给这个函数并执行。&lt;/p&gt;&lt;p&gt;如果是匿名函数的话，过程大同小异。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Ajax 回调函数的参数列表：&lt;/p&gt;&lt;p&gt;xhr : XMLHttpRequest 对象&lt;/p&gt;&lt;p&gt;status : 仅限 OnBegin&lt;/p&gt;&lt;p&gt;error : 仅限 OnFailure&lt;/p&gt;&lt;p&gt;data : 仅限 OnSuccess&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Unobtrusive Client Validation in ASP.NET MVC 3&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;原文：&lt;a href="http://bradwilson.typepad.com/blog/2010/10/mvc3-unobtrusive-validation.html" target="_blank"&gt;&lt;strong&gt;《Unobtrusive Client Validation in ASP.NET MVC 3》&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;传统的生成方式&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;一下是 &lt;a href="http://www.cnblogs.com/dozer/archive/2010/04/12/MVC-DataAnnotations.html" target="_blank"&gt;&lt;strong&gt;MVC 数据验证框架&lt;/strong&gt;&lt;/a&gt;下对于 Model 的描述（这部分不变）&lt;/p&gt;public class ValidationModel {&lt;br/&gt;    [Required]&lt;br/&gt;    public string FirstName { get; set; }&lt;br/&gt; &lt;br/&gt;    [Required, StringLength(60)]&lt;br/&gt;    public string LastName { get; set; }&lt;br/&gt; &lt;br/&gt;    [Range(1, 130)]&lt;br/&gt;    public int Age { get; set; }&lt;br/&gt;}&lt;p&gt;当开启客户端验证后：（具体开启方法和 Unobtrusive Javascript 大同小异，请看第二部分）&lt;/p&gt;&amp;lt;label for="FirstName"&amp;gt;FirstName&amp;lt;/label&amp;gt;&lt;br/&gt;&amp;lt;input class="text-box single-line" id="FirstName" name="FirstName" type="text" value="" /&amp;gt;&lt;br/&gt;&amp;lt;span class="field-validation-valid" id="FirstName_validationMessage"&amp;gt;&amp;lt;/span&amp;gt;&lt;br/&gt; &lt;br/&gt;&amp;lt;label for="LastName"&amp;gt;LastName&amp;lt;/label&amp;gt;&lt;br/&gt;&amp;lt;input class="text-box single-line" id="LastName" name="LastName" type="text" value="" /&amp;gt;&lt;br/&gt;&amp;lt;span class="field-validation-valid" id="LastName_validationMessage"&amp;gt;&amp;lt;/span&amp;gt;&lt;br/&gt; &lt;br/&gt;&amp;lt;label for="Age"&amp;gt;Age&amp;lt;/label&amp;gt;&lt;br/&gt;&amp;lt;input class="text-box single-line" id="Age" name="Age" type="text" value="" /&amp;gt;&lt;br/&gt;&amp;lt;span class="field-validation-valid" id="Age_validationMessage"&amp;gt;&amp;lt;/span&amp;gt;&lt;br/&gt; &lt;br/&gt;&amp;lt;script type="text/javascript"&amp;gt; &lt;br/&gt;//&amp;lt;![CDATA[&lt;br/&gt;if (!window.mvcClientValidationMetadata) { window.mvcClientValidationMetadata = []; }&lt;br/&gt;window.mvcClientValidationMetadata.push({"Fields":[{"FieldName":"FirstName","ReplaceValidationMessageContents":true,"ValidationMessageId":"FirstName_validationMessage","ValidationRules":[{"ErrorMessage":"The FirstName field is required.","ValidationParameters":{},"ValidationType":"required"}]},{"FieldName":"LastName","ReplaceValidationMessageContents":true,"ValidationMessageId":"LastName_validationMessage","ValidationRules":[{"ErrorMessage":"The LastName field is required.","ValidationParameters":{},"ValidationType":"required"},{"ErrorMessage":"The field LastName must be a string with a maximum length of 60.","ValidationParameters":{"max":60},"ValidationType":"length"}]},{"FieldName":"Age","ReplaceValidationMessageContents":true,"ValidationMessageId":"Age_validationMessage","ValidationRules":[{"ErrorMessage":"The field Age must be between 1 and 130.","ValidationParameters":{"min":1,"max":130},"ValidationType":"range"},{"ErrorMessage":"The Age field is required.","ValidationParameters":{},"ValidationType":"required"},{"ErrorMessage":"The field Age must be a number.","ValidationParameters":{},"ValidationType":"number"}]}],"FormId":"form0","ReplaceValidationSummary":true,"ValidationSummaryId":"validationSummary"});&lt;br/&gt;//]]&amp;gt;&lt;br/&gt;&amp;lt;/script&amp;gt;&lt;p&gt;当 unobtrusive JavaScript 关闭后，你会看到以上代码（和 MVC 2 中相同）。&lt;/p&gt;&lt;p&gt;你会发现在后面多了一段 Javascript 代码，而这里，便是对表单验证的核心。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;依赖于 Unobtrusive JavaScript 的生成方式&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;开启 Unobtrusive Javascript 后，代码完全改变了&lt;/p&gt;&amp;lt;label for="FirstName"&amp;gt;FirstName&amp;lt;/label&amp;gt;&lt;br/&gt;&amp;lt;input class="text-box single-line" data-val="true" data-val-required="The FirstName field is required." id="FirstName" name="FirstName" type="text" value="" /&amp;gt;&lt;br/&gt;&amp;lt;span class="field-validation-valid" data-valmsg-for="FirstName" data-valmsg-replace="true"&amp;gt;&amp;lt;/span&amp;gt;&lt;br/&gt; &lt;br/&gt;&amp;lt;label for="LastName"&amp;gt;LastName&amp;lt;/label&amp;gt;&lt;br/&gt;&amp;lt;input class="text-box single-line" data-val="true" data-val-length="The field LastName must be a string with a maximum length of 60." data-val-length-max="60" data-val-required="The LastName field is required." id="LastName" name="LastName" type="text" value="" /&amp;gt;&lt;br/&gt;&amp;lt;span class="field-validation-valid" data-valmsg-for="LastName" data-valmsg-replace="true"&amp;gt;&amp;lt;/span&amp;gt;&lt;br/&gt; &lt;br/&gt;&amp;lt;label for="Age"&amp;gt;Age&amp;lt;/label&amp;gt;&lt;br/&gt;&amp;lt;input class="text-box single-line" data-val="true" data-val-number="The field Age must be a number." data-val-range="The field Age must be between 1 and 130." data-val-range-max="130" data-val-range-min="1" data-val-required="The Age field is required." id="Age" name="Age" type="text" value="" /&amp;gt;&lt;br/&gt;&amp;lt;span class="field-validation-valid" data-valmsg-for="Age" data-valmsg-replace="true"&amp;gt;&amp;lt;/span&amp;gt;&lt;p&gt;其中最大的改变就是下面的 Javascript 代码消失了，转而变为 HTML 5 的各种属性。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;属性是如何生成的&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;当表单中的一项在后端代码中有数据验证的时候，MVC 会现在 它的属性中加上&amp;nbsp; data-val="true"，并且讲所有规则以 data-val-rulename="message" 的形式，加在属性上。&lt;/p&gt;&lt;p&gt;如果想使用默认的客户端验证信息，你只要把属性值留空，那么客户端验证会自动生成形如 data-val-rulename-paramname="paramvalue" 的属性。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;桥接 HTML 和 jQuery ： 适配器&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;写一个客户端验证有两个步骤：1、为 jQuery 验证编写验证规则，2、在 HTML 代码中加上属性，并且使用适配器转换为对应的 jQuery 验证规则。（这个在非 MVC 中也适用）&lt;/p&gt;&lt;p&gt;你可以调用 jQuery.validator.unobtrusive.adapters. 来编写适配规则。&lt;/p&gt;&lt;p&gt;这里有三个方法能帮助你注册三种很常规的适配器。(addBool, addSingleVal, and addMinMax)&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;span style="color: #a5a5a5;"&gt;具体的方法大家可以看一下原文，因为 jquery.validate.unobtrusive.min.js 已经把这些适配规则都写好了，所以不加以阐述了，如果想了解原理的话可以去看一下~&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;ENDING&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;最后，还不太了解 MVC 数据验证的朋友可以看一下我的另一篇文章：&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/dozer/archive/2010/04/12/MVC-DataAnnotations.html"&gt;&lt;strong&gt;深入浅出 MVC 数据验证 2.0 [附演示源码]&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/dozer/aggbug/1874743.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/dozer/archive/2010/11/11/Unobtrusive-JavaScript-in-ASP-NET-MVC-3.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/dozer/archive/2010/10/31/1865477.html</id><title type="text">Visual Studio下的 JS &amp;amp; CSS 压缩和编辑插件</title><summary type="text">先声明一下，这个只是我的一个设想，目前还没实现JS压缩？CSS压缩？这个大家肯定都听说过，一个成熟的网站，JS压缩和CSS压缩是必须的，也是一个很好的提高网站性能的途径。但是，压缩好的JS和CSS怎么编辑呢？好吧，可以用支持JS或者CSS自动格式化的编辑器，让它还原…然后，编辑好后再压缩…不觉得很麻烦吗？Visual Studio 下的解决方案先看一张图：这是什么？一个...</summary><published>2010-10-30T22:41:00Z</published><updated>2010-10-30T22:41:00Z</updated><author><name>Dozer</name><uri>http://www.cnblogs.com/dozer/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dozer/archive/2010/10/31/1865477.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dozer/archive/2010/10/31/1865477.html"/><content type="html">&lt;p&gt;&lt;span style="color: #888888;"&gt;先声明一下，这个只是我的一个设想，目前还没实现&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;JS压缩？CSS压缩？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这个大家肯定都听说过，一个成熟的网站，JS压缩和CSS压缩是必须的，也是一个很好的提高网站性能的途径。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;但是，压缩好的JS和CSS怎么编辑呢？&lt;/p&gt;&lt;p&gt;好吧，可以用支持JS或者CSS自动格式化的编辑器，让它还原&amp;hellip;&lt;/p&gt;&lt;p&gt;然后，编辑好后再压缩&amp;hellip;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;不觉得很麻烦吗？&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Visual Studio 下的解决方案&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;先看一张图：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/dozer/Windows-Live-Writer/e00804f25a34_5ABA/image_2.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/dozer/Windows-Live-Writer/e00804f25a34_5ABA/image_thumb.png" border="0" alt="image" width="257" height="45" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;这是什么？&lt;/p&gt;&lt;p&gt;一个 .js文件&lt;/p&gt;&lt;p&gt;纳尼？&amp;hellip;&lt;/p&gt;&lt;p&gt;它可以像aspx文件一样展开！&lt;/p&gt;&lt;p&gt;还有一个和它关联的文件 .js.source！&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;是的，按照我的设想，在文件夹中会有2个文件：.js 和 .js.source&lt;/p&gt;&lt;p&gt;然后在VS里编辑的时候，编辑的是 .js.source 文件，每次保存的时候，它会自动压缩一下，放到 .js文件中&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;在网页中，引用 .js的文件即可~&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;CSS也可以用同样的方法实现&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;求合作伙伴&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;小弟不才，不懂VS插件开发，以上只是一个设想，有哪位朋友愿意合作，我们一起做一个这样的VS插件出来？&lt;/p&gt;&lt;p&gt;另外，想单独做的也和我联系下~毕竟创意也是有知识产权的~到时候引用一下我的博客就行~&lt;/p&gt;&lt;img src="http://www.cnblogs.com/dozer/aggbug/1865477.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/dozer/archive/2010/10/31/1865477.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
