<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_朱才</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/55108/rss</id><updated>2011-10-22T08:27:10Z</updated><author><name>朱才</name><uri>http://www.cnblogs.com/zhucai/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhucai/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/55108/rss"/><entry><id>http://www.cnblogs.com/zhucai/archive/2011/10/22/graph.html</id><title type="text">二维坐标图</title><summary type="text">用公式生成二维坐标图</summary><published>2011-10-22T08:27:00Z</published><updated>2011-10-22T08:27:00Z</updated><author><name>朱才</name><uri>http://www.cnblogs.com/zhucai/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhucai/archive/2011/10/22/graph.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhucai/archive/2011/10/22/graph.html"/><content type="html">&lt;html&gt;&#xD;
&lt;head&gt;&#xD;
    &lt;style&gt;&#xD;
        #mainDiv&#xD;
        {&#xD;
            width: 500px;&#xD;
            margin: 0px auto;&#xD;
        }&#xD;
        .xScope&#xD;
        {&#xD;
            width: 50px;&#xD;
        }&#xD;
    &lt;/style&gt;&#xD;
&lt;/head&gt;&#xD;
&lt;body&gt;&#xD;
    &lt;div id="mainDiv"&gt;&#xD;
        &lt;canvas id="canvas" width="500px" height="500px" style="background-color: #EEEEEE;"&gt;您的浏览器不支持html5的canvas标签！请换用Chrome或Firefox等支持canvas的浏览器浏览本页面。&lt;/canvas&gt;&#xD;
        &lt;p&gt;x取值范围： 0&lt;=x&lt;=&lt;input type="text"  id="txtXMax" value="10" onkeydown="txtKeyDown(event);" /&gt;&lt;br /&gt;&#xD;
            标注次数：&lt;input type="text" id="txtRulerCount" value="10" onkeydown="txtKeyDown(event);" /&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;y =&#xD;
            &lt;input type="text" id="txtFunction" value="sin(x)" style="width: 400px;color:#ff0000;" onkeydown="txtKeyDown(event);" /&gt;&lt;input&#xD;
                type="button" value="Enter" onclick="main()" /&gt;&lt;br /&gt;&#xD;
            y =&#xD;
            &lt;input type="text" id="txtFunction2" value="cos(x)" style="width: 400px;color:#0BBF48;" onkeydown="txtKeyDown(event);" /&gt;&lt;input&#xD;
                type="button" value="Enter" onclick="main()" /&gt;&lt;br /&gt;&#xD;
        &lt;/p&gt;&#xD;
    &lt;/div&gt;&#xD;
    &#xD;
&lt;/body&gt;&#xD;
&lt;/html&gt;&#xD;
&lt;img src="http://www.cnblogs.com/zhucai/aggbug/2221244.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhucai/archive/2011/10/22/graph.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhucai/archive/2011/02/16/csharp-compare-java.html</id><title type="text">C#与Java的比较</title><summary type="text">这篇文章对 .NET与Java做一个语言级的对比，方便C#转Java或Java转C#的人有个大致了解。因为 .NET主推的是C#，我也只用过C#，因此这里用C#来作为 .NET的语言与Java对比。这里大致用C#3.0与Java6.0做比较。</summary><published>2011-02-16T14:17:00Z</published><updated>2011-02-16T14:17:00Z</updated><author><name>朱才</name><uri>http://www.cnblogs.com/zhucai/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhucai/archive/2011/02/16/csharp-compare-java.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhucai/archive/2011/02/16/csharp-compare-java.html"/><content type="html">&lt;div&gt;&lt;span  style="font-size: 13px; line-height: normal; font-family: arial, sans-serif; border-collapse: collapse"&gt;这篇文章对C#与Java做一个语言级的对比，方便C#&lt;wbr&gt;转Java或Java转C#的人有个大致了解。&lt;br /&gt;&lt;/span&gt;这里大致用C#3.0与Java6.0做比较。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #808080"&gt;写完后得知维基百科里有更加全面得多的比较：&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;a href="http://en.wikipedia.org/wiki/Comparison_of_C_Sharp_and_Java" target="_blank"&gt;http://en.wikipedia.org/wiki/Comparison_of_C_Sharp_and_Java&lt;/a&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;table style="min-height: 266px; width: 702px" cellspacing="0" cellpadding="0" border="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;th&gt;.NET(C#)&lt;/th&gt;&#xD;
&lt;th&gt;&lt;/th&gt;&#xD;
&lt;th&gt;Java&lt;/th&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;基本类型&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;基本类型&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;C#中有无符号数，Java没有。&lt;br /&gt;&lt;br /&gt;C#中有值类型，且可自己定义值类型的结构体(struct)。&lt;br /&gt;Java中的基本类型(或叫基元类型)即为值类型，&lt;wbr&gt;但Java没有结构体，所以不能自定义值类型。&lt;br /&gt;C#中的值类型（包括所有基本类型）间接继承自Object，&lt;wbr&gt;有自己的方法可以调用；Java中的值类型（即基本类型）&lt;wbr&gt;不继承自Object，只是简单的数据，没有方法可以调用。&lt;br /&gt;&lt;br /&gt;C#中int等同于System.Int32，是值类型；&lt;wbr&gt;bool等同于System.Boolean；等。&lt;br /&gt;Java中int是基本类型，是值类型，&lt;wbr&gt;而Integer是引用类型，Integer是int的包装器，&lt;wbr&gt;int自身没有方法，Integer有一些方法；&lt;wbr&gt;int与Integer之间可隐式转换（导致装箱和拆箱），&lt;wbr&gt;但当Integer值为null的时候会在运行时抛出异常。&lt;wbr&gt;boolean等类似。&lt;br /&gt;&lt;br /&gt;Java中的int与Integer的对应在C#&lt;wbr&gt;中类似int和Nullable&amp;lt;int&amp;gt;的对应，&lt;wbr&gt;它们的后者都是前者的包装，且后者可以等于null。&lt;wbr&gt;但Nullable&amp;lt;int&amp;gt;实际上仍然是值类型的(&lt;wbr&gt;所以仍然很轻量级)，所以从内存上讲C#&lt;wbr&gt;中int和Object的对应更接近Java的对应一些。C#&lt;wbr&gt;中Nullable&amp;lt;int&amp;gt;到int的转换必须显式进行，&lt;wbr&gt;因为Nullable&amp;lt;int&amp;gt;&lt;wbr&gt;中的值为null时会引发运行时异常。&lt;br /&gt;其他基本类型与之类似。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;table style="min-height: 266px; width: 702px" cellspacing="0" cellpadding="0" border="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;委托,事件&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif"&gt;&lt;pre style="text-align: center"&gt;&lt;strong&gt;[无]&lt;/strong&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;C#中的委托可以认为是方法的类型化，&lt;wbr&gt;于是可以将方法放在变量里传递。事件是对委托做了一层包装。&lt;br /&gt;Java通过接口来实现C#中委托和事件的功能，&lt;wbr&gt;可通过匿名类来达到C#中匿名委托的作用（&lt;wbr&gt;同样也能实现闭包的功能）。&lt;br /&gt;另，C#中也有匿名类，但C#&lt;wbr&gt;和Java的匿名类刚好各做各的事情：&lt;wbr&gt;Java中的匿名类只有方法没有数据；C#&lt;wbr&gt;中的匿名类只有数据没有方法。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;table style="min-height: 266px; width: 702px" cellspacing="0" cellpadding="0" border="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;非托管&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif"&gt;&lt;pre style="text-align: center"&gt;&lt;strong&gt;[无]&lt;/strong&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;C#可以有非托管代码，可以有指针等。Java没有。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;table style="min-height: 266px; width: 702px" cellspacing="0" cellpadding="0" border="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;索引器&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif"&gt;&lt;pre style="text-align: center"&gt;&lt;strong&gt;[无]&lt;/strong&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;C#有索引器，可方便容器类实现类似数组的效果。Java没有，&lt;wbr&gt;Java的容器基本上用put,get,&lt;wbr&gt;set等方法达到同样效果。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;table style="min-height: 266px; width: 702px" cellspacing="0" cellpadding="0" border="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;属性&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif"&gt;&lt;pre style="text-align: center"&gt;&lt;strong&gt;[无]&lt;/strong&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;C#的属性通过在内部定义get/set方法，&lt;wbr&gt;使外部使用时像是在使用变量字段，但其实是在调用get/&lt;wbr&gt;set方法，以达到透明的封装数据的目的。&lt;br /&gt;Java没有属性的概念。&lt;wbr&gt;Java通过约定为字段XX添加getXX,&lt;wbr&gt;setXX方法达到同样的目的。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;table style="min-height: 266px; width: 702px" cellspacing="0" cellpadding="0" border="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;预编译指令&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif"&gt;&lt;pre style="text-align: center"&gt;&lt;strong&gt;[无]&lt;/strong&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;C#有预编译指令可方便调试，&lt;wbr&gt;且有ConditionalAttribute来描述方法。&lt;wbr&gt;Java没有。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;table style="min-height: 266px; width: 702px" cellspacing="0" cellpadding="0" border="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;操作符重载&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif"&gt;&lt;pre style="text-align: center"&gt;&lt;strong&gt;[无]&lt;/strong&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;C#可重载操作符。Java没有。&lt;br /&gt;&lt;br /&gt;Java自己重载了String的+和+=，但没有重载==，&lt;wbr&gt;这是我这段时间犯的最多的错误。C#中String的==&lt;wbr&gt;是比较值相等，Java中==是Object的默认行为：&lt;wbr&gt;比较引用相等，要比较值相等得用equals方法。（&lt;wbr&gt;这么多年编程以来，&lt;wbr&gt;我似乎从来没有遇到过要比较两个字符串变量的引用相等。&lt;wbr&gt;对于比较值相等来讲，==&lt;wbr&gt;符号比equals方法调用看上去优雅得多，&lt;wbr&gt;况且方法调用还得注意空指针的情况）&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;table style="min-height: 266px; width: 702px" cellspacing="0" cellpadding="0" border="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;内部类&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;内部类&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;Java的内部类可以直接访问外部类的实例成员。&lt;br /&gt;C#的不行。C#的内部类等同于Java的静态内部类。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;table style="min-height: 266px; width: 702px" cellspacing="0" cellpadding="0" border="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;goto、switch&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;[goto]、switch&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;C#允许用goto。Java的goto是保留关键字，&lt;wbr&gt;不能使用。但Java允许有标签，&lt;wbr&gt;在有嵌套循环时可以在continue、&lt;wbr&gt;break后面跟标签名。&lt;br /&gt;&lt;br /&gt;C#的switch可以使用long、String；&lt;wbr&gt;Java不可以。&lt;br /&gt;&lt;br /&gt;Java的switch中的case子句在后面没有跟break&lt;wbr&gt;的情况下直接跳到下一个case子句；&lt;br /&gt;C#&lt;wbr&gt;中只有在前一个case没有任何代码的情况下才允许不写brea&lt;wbr&gt;k直接跳到下一个case，C#&lt;wbr&gt;中可以通过goto跳转到另一case。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;table style="min-height: 266px; width: 702px" cellspacing="0" cellpadding="0" border="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;enum&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;enum&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;C#中的枚举是值类型，且其基于数值类型（默认基于int），&lt;wbr&gt;可设置枚举项对应的数字，不能在其中添加方法等任何其他成员。&lt;br /&gt;Java中的枚举是引用类型（Java除了基本类型外，&lt;wbr&gt;任何类型都是引用类型），不是基于数值类型。除了不能继承外，&lt;wbr&gt;它跟普通类差别不大，可以添加成员方法和成员变量等（&lt;wbr&gt;当然也就可以重写toString方法）。&lt;br /&gt;&lt;br /&gt;C#和Java的枚举都可以用于switch。&lt;br /&gt;&lt;br /&gt;可以将C#的枚举作为数值看待而直接进行位运算，&lt;wbr&gt;因此可以在一个变量中存储多个位标记。&lt;br /&gt;Java的枚举跟数值没有直接关系，因此不能直接这么用。&lt;wbr&gt;Java用EnumSet来存储枚举标志，&lt;wbr&gt;不需要直接使用位运算，更远离底层。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;table style="min-height: 266px; width: 702px" cellspacing="0" cellpadding="0" border="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;override&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;@Override&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;C#能被重写的方法必须添加virtual关键字声明为虚方法，&lt;wbr&gt;派生类重写子类方法时添加override关键字。&lt;br /&gt;Java默认方法都可被重写，&lt;wbr&gt;派生类和子类方法签名一样时被认为是重写。&lt;wbr&gt;要声明不能被重写的方法需在方法前加final关键字。&lt;wbr&gt;重写时可以在方法前添加标注(即C#中的定制特性)@&lt;wbr&gt;Override，&lt;wbr&gt;这样一旦此方法找不到被重写的方法时编译器会报错，&lt;wbr&gt;以防止拼写错误。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;table style="min-height: 266px; width: 702px" cellspacing="0" cellpadding="0" border="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;定制特性&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;标注&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;C#用中括号[]将定制特性括起来。Java用@打头，&lt;wbr&gt;后面跟定制特性的名字。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;table style="min-height: 266px; width: 702px" cellspacing="0" cellpadding="0" border="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;泛型&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;泛型&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;Java中泛型实现使用的擦除机制，&lt;wbr&gt;为类型参数传入类型并不导致新类型出现，&lt;wbr&gt;即传入了类型参数后在运行时仍然完全不知道类型参数的具体类型，&lt;wbr&gt;它的目的是为了兼容非泛型（&lt;wbr&gt;所以可以在泛型和非泛型之间隐式转换，&lt;wbr&gt;会有编译警告但不会有编译错误，这当然其实并不安全）；&lt;wbr&gt;这同时衍生了一系列问题：不能定义泛型类型参数的数组如T[]，&lt;wbr&gt;不能通过new T()的方式实例化泛型，等。&lt;br /&gt;Java的泛型不支持值类型（使用的话会被自动包装成引用类型）&lt;wbr&gt;。&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;table style="min-height: 266px; width: 702px" cellspacing="0" cellpadding="0" border="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;&lt;br /&gt;C#的泛型在类型参数传入类型后会产生一个新类型(&lt;wbr&gt;虽然CLR的优化机制会使引用类型共享同样的代码)，&lt;wbr&gt;可以在运行时得到类型参数的类型信息。可以定义泛型数组，&lt;wbr&gt;可以添加约束使其可以new。C#的泛型可以使用值类型(&lt;wbr&gt;不会被装箱)。&lt;br /&gt;&lt;br /&gt;对于Java的泛型，简单的讲，它的好处只在编译时，&lt;wbr&gt;运行时没有任何泛型的意义。当你在使用已有的泛型类时，&lt;wbr&gt;这通常能满足要求；但如果你要自己定义泛型类，&lt;wbr&gt;那你得知道它有多少你觉得它应该可以但事实上不可以的事情。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;table style="min-height: 266px; width: 702px" cellspacing="0" cellpadding="0" border="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;参数引用传递&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;[无]&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;C#允许使用关键字out,&lt;wbr&gt;ref显式指定参数传递方式为引用传递。&lt;br /&gt;Java只有值传递。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;table style="min-height: 266px; width: 702px" cellspacing="0" cellpadding="0" border="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;@字符串&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;[无]&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;C#在写字符串时可以在引号前加个@符号来取消/的转义作用。&lt;br /&gt;Java没有。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;table style="min-height: 266px; width: 702px" cellspacing="0" cellpadding="0" border="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;??&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;[无]&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;C#的??&lt;wbr&gt;二元操作符当前面的表达式不为null时返回前面表达式的值，&lt;wbr&gt;前面表达式为null时返回后面表达式的值。&lt;br /&gt;Java没有。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;table style="min-height: 266px; width: 702px" cellspacing="0" cellpadding="0" border="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;using&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;import&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;C#可以用using为命名空间或类指定别名。（&lt;wbr&gt;using还有Dispose的使用方式，与命名空间无关）&lt;br /&gt;Java的import可以引入类或包(即C#的命名空间)，&lt;wbr&gt;static import可以引入类的成员。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;table style="min-height: 266px; width: 702px" cellspacing="0" cellpadding="0" border="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;初始化&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;初始化&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;C#调用基类构造函数的语法为：&lt;br /&gt;SubClass() : base() { }&lt;br /&gt;Java调用基类构造函数的语法为：&lt;br /&gt;SubClass(){&lt;br /&gt;&amp;nbsp;&amp;nbsp; super();&lt;br /&gt;}&lt;br /&gt;C#和Java都可以用类似的语法调用同一个类的其他构造函数。&lt;wbr&gt;（分别将base和super换成this）&lt;br /&gt;&lt;br /&gt;Java有代码块概念，会在构造函数之前执行（&lt;wbr&gt;基类的构造函数之后）。&lt;br /&gt;&lt;br /&gt;在成员变量声明时赋值，&lt;wbr&gt;Java允许其赋值表达式中引用前面声明的另一个变量，如：&lt;br /&gt;private int x = 1;&lt;br /&gt;private int y = x + 10;&lt;br /&gt;这里变量y的赋值语句有变量x。&lt;br /&gt;C#不允许这样做。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;table style="min-height: 266px; width: 702px" cellspacing="0" cellpadding="0" border="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;interface&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;interface&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;Java的接口内允许有内部类、静态字段等。&lt;br /&gt;C#不允许。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;table style="min-height: 266px; width: 702px" cellspacing="0" cellpadding="0" border="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;readonly,const&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;final&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;C#的const是绝对的常量，必须在声明语句中同时赋值，&lt;wbr&gt;只有数值、枚举和String可以声明为const。&lt;wbr&gt;const的值会内联到各个使用的地方。&lt;br /&gt;C#&lt;wbr&gt;的readonly表示变量在构造函数执行完之后是不能再变化的&lt;wbr&gt;。它只约束变量本身，而无法约束变量引用(&lt;wbr&gt;如果它是引用类型或者有成员是引用类型)的对象。&lt;br /&gt;&lt;br /&gt;Java中的final(在约束变量的时候)&lt;wbr&gt;看上去更像readonly。&lt;br /&gt;但C#的readonly和const有个区别，&lt;wbr&gt;readonly的int是不能作为switch的case语句&lt;wbr&gt;的，const的可以。&lt;br /&gt;而Java的final则是：有时候可以有时候不可以----&lt;wbr&gt;编译时可以得到明确值的可以，反之不可以。如：&lt;br /&gt;final int x = 1;&amp;nbsp;&amp;nbsp; // 这个可以&lt;br /&gt;final int y = new Random().nextInt();&amp;nbsp;&amp;nbsp; // 这个不可以&lt;br /&gt;那么可以理解为：编译时能得到明确值的时候，&lt;wbr&gt;final等同于C#的const(&lt;wbr&gt;不清楚Java在这个情况下是否会内联，估计不会)；&lt;wbr&gt;编译时无法得到明确值的时候，final等同于C#&lt;wbr&gt;的readonly。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;table style="min-height: 266px; width: 702px" cellspacing="0" cellpadding="0" border="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;[无]&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;/td&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center"&gt;&lt;strong&gt;throws&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;Java在可能抛出异常时，&lt;wbr&gt;除了RuntimeException(包括派生类)，&lt;wbr&gt;都要么捕获，&lt;wbr&gt;要么在方法声明中用throws关键字声明出来表示继续抛出。&lt;br /&gt;C#没有采用这种强制处理机制。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;blockquote style="padding-left: 1ex; margin: 0px 0px 0px 0.8ex; border-left: #cccccc 1px solid"&gt;&lt;/blockquote&gt;&#xD;
&lt;p&gt;&lt;table style="min-height: 266px; width: 702px" cellspacing="0" cellpadding="0" border="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif; text-align: center" colspan="3"&gt;&lt;strong&gt;功能相同但语法有差异的&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="margin: 0px; font-family: arial, sans-serif" colspan="3"&gt;namespace == package (Java的package对文件结构也有要求；C#没有)&lt;br /&gt;&lt;br /&gt;internal == [默认] (Java中不写访问修饰符即表示访问权限是package；&lt;wbr&gt;C#默认是private。C#的internal protected在Java中没有。)&lt;br /&gt;&lt;br /&gt;lock == synchronized (Java中synchronized可以修饰方法，C#&lt;wbr&gt;可以用定制特性[MethodImplAttribute(&lt;wbr&gt;MethodImplOptions.&lt;wbr&gt;Synchronized)]达到同样效果)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;: == extends,implements&lt;br /&gt;&lt;br /&gt;base == super&lt;br /&gt;&lt;br /&gt;is == instanceof (C#有as，Java没有)&lt;br /&gt;&lt;br /&gt;typeof == .class&lt;br /&gt;&lt;br /&gt;[SerializableAttribute]定制特性 == Serializable接口&lt;br /&gt;&lt;br /&gt;[NonSerializedAttribute]定制特性 == transient&lt;br /&gt;&lt;br /&gt;params == ... (可变数目参数)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div&gt;&lt;span style="font-size: 13px; line-height: normal; font-family: arial, sans-serif; border-collapse: collapse"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;这个列表里，Java比C#更漂亮的地方基本上只有一处：枚举。&lt;wbr&gt;&lt;/span&gt;&lt;span style="font-size: 13px; line-height: normal; font-family: arial, sans-serif; border-collapse: collapse"&gt;Java的枚举更高层一些，更灵活。但内存代价比C#&lt;wbr&gt;&lt;/span&gt;&lt;span style="font-size: 13px; line-height: normal; font-family: arial, sans-serif; border-collapse: collapse"&gt;的枚举要高，&lt;wbr&gt;&lt;/span&gt;&lt;span style="font-size: 13px; line-height: normal; font-family: arial, sans-serif; border-collapse: collapse"&gt;这可能就是Android里仍然使用常量而不是枚举的原因吧。&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 13px; line-height: normal; font-family: arial, sans-serif; border-collapse: collapse"&gt;所以就从这次比较来讲，C#几乎完胜Java，而C#&lt;wbr&gt;&lt;/span&gt;&lt;span style="font-size: 13px; line-height: normal; font-family: arial, sans-serif; border-collapse: collapse"&gt;的新特性像完美的类型推断、动态编程特性、Lambda表达式、&lt;wbr&gt;&lt;/span&gt;&lt;span style="font-size: 13px; line-height: normal; font-family: arial, sans-serif; border-collapse: collapse"&gt;LINQ等等这里都没有列入比较。&lt;br /&gt;&#xD;
&lt;div&gt;当然，.NET和Java两大体系的比较，语言只是一个方面，还有平台、IDE、开源等其他很多方面，这里就不说了。&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/zhucai/aggbug/1956456.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhucai/archive/2011/02/16/csharp-compare-java.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhucai/archive/2010/08/02/pingpong-kinematics.html</id><title type="text">乒乓球的运动模拟</title><summary type="text">模拟乒乓球的运动，用html5的canvas做动画。</summary><published>2010-08-01T16:00:00Z</published><updated>2010-08-01T16:00:00Z</updated><author><name>朱才</name><uri>http://www.cnblogs.com/zhucai/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhucai/archive/2010/08/02/pingpong-kinematics.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhucai/archive/2010/08/02/pingpong-kinematics.html"/><content type="html">&lt;style&gt;&#xD;
p{padding:10px 0px 10px 0px;}&#xD;
&lt;/style&gt;&#xD;
&lt;span id="showNotSupportTip" style="display: none; border: 1px solid #000000;"&gt;您使用的浏览器不支持HTML5的canvas，若要测试当前程序，请使用支持canvas的浏览器，如：Chrome/Firefox&lt;/span&gt;&#xD;
&lt;p&gt;用鼠标在下面的框框中拖放：&#xD;
&lt;/p&gt;&#xD;
&lt;canvas id="canvas" width="500px" height="600px" onmousedown="canvasMouseDown(event)" style="background:#ffffff;border:1px solid #000000;"&gt;&lt;/canvas&gt;&#xD;
&lt;p&gt;这里的计算过程大致如下：&lt;br /&gt;&#xD;
1. 在鼠标事件(mousedown,mousemove)使乒乓球的位置等于鼠标位置，达到乒乓球被鼠标拖动的效果。&lt;br /&gt;&#xD;
2. 鼠标松开或碰到框边时让乒乓球&amp;#8220;脱手&amp;#8221;，此时计算乒乓球的初速度，为使初速度的计算更稳定，这里在 mousemove时维持了一个鼠标轨迹的数组，在&amp;#8220;脱手&amp;#8221;时取倒数第4个鼠标位置与当前鼠标位置的距离来计算初速度。&lt;br /&gt;&#xD;
3. 启动循环：每0.01秒执行一次loop函数。loop函数计算这0.01秒的位移情况，然后在新位置画出乒乓球，产生动画。目前主要根据初速度、重力加速度、空气阻力、弹性恢复系数、滚动摩擦这几点考虑，没有考虑其自身的滚动。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;计算时采用世界坐标，画在屏幕上时转换成屏幕坐标，世界坐标0.001米对应屏幕坐标的1个像素。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;这里使用的一些数据：&lt;br /&gt;&#xD;
乒乓球直径0.04m，重 0.0027kg，重力加速度9.8m/s，恢复系数0.92，滚动摩擦系数没有查到，这里使用的是0.8。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;在运动时由于我是使用的0.01秒为一个计算单位，于是在触碰到框边时遇到一个问题，即根据时间0.01秒的计算，运动超过了框边，该如何处理？&lt;br /&gt;&#xD;
后来我是这么解决的：当发现根据时间0.01秒计算其运动超过了框边时，则抛弃根据时间计算出的结果，而先根据当前位置到框边的距离计算运动时间，将这0.01秒分成两个时间段计算：到达框边的时间和剩下的时间。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;由于一些公式都是在网上查出，自己对这些并不是太有信心。望发现错误者指出，谢谢！&lt;br /&gt;&#xD;
另，本来准备在触碰到框边的时候产生&amp;#8220;砰&amp;#8221;的声音，声音都录好了，但使用html5的Audio时发现很不好用：没有stop方法，于是只能设置src=""来停止再设置回去，不知是不是这个原因，声音明显延迟（不这样好像也是延迟的）。而我又不想使用flash，不知哪位有没有办法通过纯html/js实现较好的实时声音播放。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;可直接查看网页源文件获取js源代码。&#xD;
&lt;/P&gt;&#xD;
&#xD;
&lt;img src="http://www.cnblogs.com/zhucai/aggbug/1789691.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhucai/archive/2010/08/02/pingpong-kinematics.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhucai/archive/2010/07/02/canvas-animate.html</id><title type="text">canvas中的动画</title><summary type="text">上篇文章生成静态图，这次用canvas生成动画。</summary><published>2010-07-01T17:06:00Z</published><updated>2010-07-01T17:06:00Z</updated><author><name>朱才</name><uri>http://www.cnblogs.com/zhucai/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhucai/archive/2010/07/02/canvas-animate.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhucai/archive/2010/07/02/canvas-animate.html"/><content type="html">&lt;p style="font-size: 11px; color: #00c213;"&gt;必须使用支持canvas的浏览器才能观看到效果，推荐firefox。(经测试，居然firefox在这里比chrome表现好得多)&#xD;
&lt;/p&gt;&#xD;
&lt;div&gt;&lt;canvas id="cvs" style="border: 1px solid #000000; width: 512px; height: 512px;" width="256px" height="256px"&gt;&lt;/canvas&gt;&lt;br /&gt;&#xD;
选择现有规则：&lt;br /&gt;&#xD;
&lt;span id="show"&gt;0&lt;/span&gt;毫秒&lt;br /&gt;&#xD;
R:&lt;input value="x*15" id="txtRed" type="text" style="width: 400px;" /&gt;&lt;br /&gt;&#xD;
G:&lt;input value="Math.cos(x*y*(t+1000))" id="txtGreen" type="text" style="width: 400px;" /&gt;&lt;br /&gt;&#xD;
B:&lt;input value="x*15" id="txtBlue" type="text" style="width: 400px;" /&gt;&lt;br /&gt;&#xD;
&lt;input onclick="start()" value="Start" type="button"&gt;&#xD;
&lt;input onclick="stop()" value="Stop" type="button"&gt;&#xD;
&lt;input type="button" value="推荐当前表达式" onclick="preRecommend()"&gt;&lt;span style="font-size: 9; color: #c98a36;"&gt;如果觉得你自己写的式子效果不错，可以推荐给大家，我会把不错的集成到下拉框。&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;div id="divPreRecommend" style="display: none;"&gt;&#xD;
介绍一下：&lt;textarea style="width: 250px; height: 50px;" id="txtSummary"&gt;&lt;/textarea&gt;&#xD;
&lt;input type="button" value="确定" onclick="recommend()"&gt;&#xD;
&lt;input type="button" value="取消" onclick="closeRecommend()"&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="font-size: 12px;"&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhucai/archive/2010/07/01/texttodelegate-demo.html" target="_blank"&gt;上篇文章&lt;/a&gt;生成静态图，这次生成动画。&lt;/p&gt;&#xD;
&lt;p&gt;大家可以选择下拉框看不同式子的不同效果。也可以自己填这三个框，生成自己的动画。R,G,B三个框表示RGB三种颜色。可输入x,y对应坐标值，取值范围是负3到正3的double型，t代表从0开始的显示次数，主要通过t生成动画，也可以使用Math.random()，每个式子里的返回值应该是0到1之间的double型，然后会将这个值乘以256得到RGB颜色值。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;下面的毫秒显示的是生成一次图片用的时间，如果大于100毫秒，则动画应该是不连贯的，如果小于50毫秒，则动画比较连贯。&#xD;
&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div style="z-index: -1; position: absolute; top: 0px; left: 0px; width: 100%; height: 862px; "&gt;&lt;/div&gt;&#xD;
&lt;div style="z-index: -1; position: absolute; top: 0px; left: 0px; width: 100%; height: 862px; "&gt;&lt;/div&gt;&#xD;
&lt;img src="http://www.cnblogs.com/zhucai/aggbug/1769592.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhucai/archive/2010/07/02/canvas-animate.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhucai/archive/2010/07/01/texttodelegate-demo.html</id><title type="text">动态计算表达式</title><summary type="text">关于动态计算表达式的介绍和一个利用canvas生成图片的例子。</summary><published>2010-07-01T07:37:00Z</published><updated>2010-07-01T07:37:00Z</updated><author><name>朱才</name><uri>http://www.cnblogs.com/zhucai/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhucai/archive/2010/07/01/texttodelegate-demo.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhucai/archive/2010/07/01/texttodelegate-demo.html"/><content type="html">&lt;div style="font-size: 12px;"&gt;&#xD;
&lt;p&gt;JavaScript中有eval函数可以在运行时编译并执行代码，而new Function()方法可以在运行时根据输入的字符串生成方法。.NET没有内置这样的支持。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;我之前写了个LambdaParser来做这样的事，因为基于&lt;a href="http://www.cnblogs.com/tianfan/archive/2010/03/05/expression-tree-basics.html" target="_blank"&gt;表达式树&lt;/a&gt;，2008不支持代码块，只支持表达式，（最明显的区别是代码块是多个句子，表达式只有一个句子），现在2010的表达式树可以表达代码块了，理论上讲这个LambdaParser便可以支持代码块了，于是我把名字改成了TextToDelegate，因为这样就不限于lambda表达式，也可以支持匿名委托。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;其实为.NET提供这样功能的模块已经有了，就是&lt;a href="http://flee.codeplex.com/" target="_blank"&gt;flee&lt;/a&gt;，它是用VB.NET写的，基于IL实现。前段时间看了它的Demo，感觉很酷，便把它剽窃过来也作为我的Demo，顺便加上了动画支持，不知是否侵权。可以在这里下载源码：&lt;a href="http://texttodelegate.codeplex.com/" target="_blank"&gt;TextToDelegate&lt;/a&gt;。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;顺便，把这个Demo也移植成js版的放在这里供大家直接玩一下，点&amp;ldquo;生成图片&amp;rdquo;就明白了(需要支持canvas的浏览器，推荐chrome)：&#xD;
&lt;/p&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&lt;canvas id="cvs" style="border: 1px solid #000000;" width="256px" height="256px"&gt;&lt;/canvas&gt;&lt;br /&gt;&lt;br /&gt;R:&lt;input style="width: 350px;" id="txtRed" value="x % y" /&gt;&lt;br /&gt;G:&lt;input style="width: 350px;" id="txtGreen" value="y % x" /&gt;&lt;br /&gt;B:&lt;input style="width: 350px;" id="txtBlue" value="x % y + 1" /&gt;&lt;br /&gt;&lt;input onclick="start()" type="button" value="生成图片" /&gt;&#xD;
&lt;input type="button" value="推荐当前表达式" onclick="preRecommend()" /&gt;如果觉得你自己写的式子效果不错，可以推荐给大家，我会把不错的集成到下拉框。&#xD;
&lt;div id="divPreRecommend" style="display: none;"&gt;&#xD;
介绍一下：&lt;textarea style="width: 250px; height: 50px;" id="txtSummary"&gt;&lt;/textarea&gt;&#xD;
&lt;input type="button" value="确定" onclick="recommend()" /&gt;&#xD;
&lt;input type="button" value="取消" onclick="closeRecommend()" /&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/zhucai/aggbug/1769217.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhucai/archive/2010/07/01/texttodelegate-demo.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhucai/archive/2010/06/18/many-chrome-extensions.html</id><title type="text">我开发的几个chrome扩展</title><summary type="text">介绍下我写的几个自己比较喜欢的扩展和其实现方式。</summary><published>2010-06-18T14:22:00Z</published><updated>2010-06-18T14:22:00Z</updated><author><name>朱才</name><uri>http://www.cnblogs.com/zhucai/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhucai/archive/2010/06/18/many-chrome-extensions.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhucai/archive/2010/06/18/many-chrome-extensions.html"/><content type="html">&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span style="font-size: 10pt;"&gt;谷歌浏览器chrome的扩展功能已经成熟，那时没事就写个扩展玩玩，写了一大堆，现在很多自己都没用了。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span style="font-size: 10pt;"&gt;现在介绍下我写的几个自己比较喜欢的扩展和其实现方式。若对chrome扩展开发不了解，可看&lt;/span&gt;&lt;/span&gt;&lt;a target="_blank" href="http://code.google.com/chrome/extensions/docs.html"&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span style="font-size: 10pt;"&gt;这里&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span style="font-size: 10pt;"&gt;的官方英文文档。而&lt;/span&gt;&lt;/span&gt;&lt;a target="_blank" href="http://www.chromi.org"&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span style="font-size: 10pt;"&gt;chrome迷&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span style="font-size: 10pt;"&gt;最近也启动了&lt;/span&gt;&lt;/span&gt;&lt;a target="_blank" href="http://www.chromi.org/archives/5176"&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span style="font-size: 10pt;"&gt;文档翻译&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span style="font-size: 10pt;"&gt;过程。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span style="font-size: 12pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 14pt;"&gt;&lt;span style="font-family: 宋体;"&gt;&lt;strong&gt;1. &lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;a target="_blank" href="https://chrome.google.com/extensions/detail/chllelencipbhdcelplgadmefkopmpgd?itemlang=zh-CN"&gt;&lt;span style="font-size: 14pt;"&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span style="font-size: 14pt;"&gt;&lt;strong&gt;中国天气预报与万年历&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: #000000; text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px;" &gt;&lt;span style="font-size: 13px; text-align: left;" &gt;&lt;span style="font-family: 宋体;"&gt;&lt;span style="font-size: 12pt;"&gt;通过名字可以看出，这个扩展为中国人服务，主要提供天气预报和万年历，万年历有农历。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: #000000; text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px;" &gt;&lt;span style="font-size: 13px; font-family: Arial, sans-serif; text-align: left;" &gt;&lt;span style="font-family: 宋体;"&gt;&lt;span style="font-size: 12pt;"&gt;这是我写的扩展里最受欢迎的一个，甚至在所有扩展的&lt;/span&gt;&lt;/span&gt;&lt;a target="_blank" href="https://chrome.google.com/extensions/list/rating?type=ext"&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span style="font-size: 12pt;"&gt;Top rated排名&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span style="font-size: 12pt;"&gt;里目前也是第5名。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: #000000; text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px;" &gt;&lt;span style="font-size: 13px; text-align: left;" &gt;&lt;span style="font-family: 宋体;"&gt;&lt;span style="font-size: 12pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span style="font-size: 12pt;"&gt;受欢迎原因我想应该是这么几个原因：&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span style="font-size: 12pt;"&gt;&amp;nbsp; 1. 预报较准确。因为用的&lt;/span&gt;&lt;/span&gt;&lt;a target="_blank" href="http://www.weather.com.cn"&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span style="font-size: 12pt;"&gt;中国天气网&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span style="font-size: 12pt;"&gt;的数据，所以估计预报国内天气是最准确的了。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span style="font-size: 12pt;"&gt;&amp;nbsp; 2. 速度快。因为我启动时去中国天气网取数据后每隔一定时间(默认20分钟)也取一次数据，于是在点击按钮时我是用的现有数据直接构造弹出页，所以非常快。(事实上，我在取数据的时候就把弹出页要显示的html已经在后台页构造好了。)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span style="font-size: 12pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 14pt;"&gt;&lt;span style="font-family: 宋体;"&gt;&lt;strong&gt;2. &lt;/strong&gt;&lt;/span&gt;&lt;a target="_blank" href="https://chrome.google.com/extensions/detail/effhomdijioeehihmoogengopdfffnkd"&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span style="font-size: 14pt;"&gt;&lt;strong&gt;眼睛&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span style="font-size: 12pt;"&gt;这个扩展只是好玩的。眼睛会随着鼠标转动，可以安装一对，&lt;/span&gt;&lt;/span&gt;&lt;a target="_blank" href="https://chrome.google.com/extensions/detail/kohaeihcfabjbjppejepohigikpgjkfa"&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span style="font-size: 12pt;"&gt;这里&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span style="font-size: 12pt;"&gt;是另一个。很久以前在linux上看到这种任务栏眼睛的，很是激动，然后便用.NET写了一个类似的任务栏眼睛跟着转的，现在chrome出来了又不忘移到chrome来。主要实现就是通过用户脚本获取鼠标位置传送给后台页，后台页计算眼睛与鼠标的距离和角度，用&lt;/span&gt;&lt;/span&gt;&lt;a target="_blank" href="http://www.w3school.com.cn/htmldom/dom_obj_canvas.asp"&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span style="font-size: 12pt;"&gt;canvas&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span style="font-size: 12pt;"&gt;画出来，最后绘到图标按钮上。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span style="font-size: 12pt;"&gt;本来打算下一步允许用户制作自己的眼睛图像的（这样便可以把自己的眼睛放上去），因为画眼睛是基于图像文件，所以做到这一点很容易，但由于使用的人一直很少，搞得自己没激情继续下去了。估计新鲜感早就过了。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;&lt;span style="font-size: 12pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 14pt;"&gt;&lt;span style="font-family: 宋体;"&gt;&lt;strong&gt;3. &lt;/strong&gt;&lt;a target="_blank" href="https://chrome.google.com/extensions/detail/gfmilenbelhfdlgmhclfpnpigneplcpi?itemlang=zh-CN"&gt;&lt;span style="font-size: 14pt;"&gt;&lt;strong&gt;搜索关键字快速定位&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;这个扩展类似于&lt;/span&gt;&lt;a target="_blank" href="https://chrome.google.com/extensions/detail/okanipcmceoeemlbjnmnbdibhgpbllgc?itemlang=zh-CN"&gt;&lt;span style="font-size: 12pt;"&gt;Google Quick Scroll&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 12pt;"&gt;扩展：&amp;ldquo;在您点击 Google 的搜索结果后，网页的右下角会显示 Google Quick Scroll，其中列出了该网页中与您的查询相关的一段或多段文字。点击文字即可转至该网页的相应部分。&amp;rdquo;只是我这个扩展不仅仅对google有效，也对baidu这些其他搜索引擎有效，也可以自定义。且我这个是基于单词的，不像Google Quick Scrool那样智能。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;这个扩展的基本原理就是通过用户脚本获取document.referrer，判断当前页是否从搜索引擎过来，如果是，获取其关键字，然后对关键字做一定解析，最后用jQuery为文档中的关键字着上色。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;在获取关键字的时候有个编码问题，utf8编码的关键字可以用decodeURIComponent方法解码，但gb2312编码的则没有相应的方法，于是我用&lt;/span&gt;&lt;a target="_blank" href="http://www.cnblogs.com/zhucai/archive/2009/12/30/js_encode_to_gb2312.html"&gt;&lt;span style="font-size: 12pt;"&gt;.NET程序生成了一个gb2312的编码表&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 12pt;"&gt;，解决像百度这种gb2312编码的问题。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 14pt;"&gt;&lt;strong&gt;4. &lt;/strong&gt;&lt;/span&gt;&lt;a target="_blank" href="https://chrome.google.com/extensions/detail/jahomhggpolhfjpomljoelcciaogmekh"&gt;&lt;span style="font-size: 14pt;"&gt;&lt;strong&gt;便利搜索扩展&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;这个扩展主要用来替代右键菜单，弹出一个自定义的搜索菜单列表。方便需要使用不同搜索引擎的人。这个扩展最近也没太维护了，用的人也不多，而对自己来讲也比较够用了。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;这个扩展也包含了&amp;ldquo;搜索关键字快速定位&amp;rdquo;的功能。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;其他还有：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a target="_blank" href="https://chrome.google.com/extensions/detail/ilmkadccccpmnjpddgaeocnmimeiglff"&gt;&lt;span style="font-size: 12pt;"&gt;ColorChooser&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 12pt;"&gt;用来快速选择颜色方便网页开发者使用。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a target="_blank" href="https://chrome.google.com/extensions/detail/ilmkadccccpmnjpddgaeocnmimeiglff"&gt;&lt;span style="font-size: 12pt;"&gt;get text size获&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 12pt;"&gt;取选中区域的文字数量。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;&lt;a target="_blank" href="https://chrome.google.com/extensions/detail/nekiplpmhokfhmonkhladgdjhaaapbcb"&gt;Format Link Target&lt;/a&gt;格式化连接目标。&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/zhucai/aggbug/1759835.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhucai/archive/2010/06/18/many-chrome-extensions.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhucai/archive/2010/05/31/lambda-parser.html</id><title type="text">LambdaParser的实现</title><summary type="text">本文主要想讲讲目前的LambdaParser的实现。</summary><published>2010-05-30T16:55:00Z</published><updated>2010-05-30T16:55:00Z</updated><author><name>朱才</name><uri>http://www.cnblogs.com/zhucai/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhucai/archive/2010/05/31/lambda-parser.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhucai/archive/2010/05/31/lambda-parser.html"/><content type="html">&lt;p&gt;&lt;span style="color: #939393;"&gt;之前在GoogleCode里创建的项目&lt;/span&gt;&lt;a target="_blank" href="http://code.google.com/p/lambda-parser/"&gt;&lt;span style="color: #939393;"&gt;LambdaParser&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #939393;"&gt;，好久没管了，前两天进去一看，居然PR值是4，很是奇怪，搜了一下，几乎没任何反向链接，搞不懂PR值为什么会这么高。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #939393;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #939393;"&gt;既然Google这么看重它，那我也不能把它荒废了：）最近.NET4.0已经出来了，Expression已经支持代码块了(以前只支持表达式，区别就是以前不能写多个语句，现在可以了)，像if、while、switch等等这些都已经支持了，那么现在的Expression理论上讲已经可以表达任何方法体了。只可惜不知微软出于什么考虑(也许是担心LINQ这边误用吧，这个功能是用来为Dynamic Language Runtime 即DLR服务的，不是LINQ)，不能直接将代码块转换成表达式树。如：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="color: #939393;"&gt;Expression&amp;lt;Action&amp;lt;string&amp;gt;&amp;gt; action = (m=&amp;gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="color: #939393;"&gt;{&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="color: #939393;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MessageBox.Show(m.Length);&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="color: #939393;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MessageBox.Show(m);&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="color: #939393;"&gt;});&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #939393;"&gt;这种写法以前不行，现在仍然不行。因为这是个代码块。(对表达式树不熟悉的可以看看这篇文章：&lt;a target="_blank" href="http://www.cnblogs.com/tianfan/archive/2010/03/05/expression-tree-basics.html"&gt;表达式树基础&lt;/a&gt;)&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #939393;"&gt;那么，想要构造代码块就得用Expression手动慢慢拼了。这是件痛苦的事情。当然，LambdaParser的下一步就是要解决它，有了BlockExpression、SwitchExpression&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #939393;"&gt;这些的东西，实现这个功能相信不是难事。如果有人愿意加入进来共同完成这个功能，可以联系我。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 18pt;"&gt;本文主要想讲讲目前的&lt;a target="_blank" href="http://www.cnblogs.com/zhucai/archive/2009/06/10/LambdaParser_Lambda_Expression_Parser.html"&gt;LambdaParser&lt;/a&gt;的实现。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 18pt;"&gt;解决方案截图：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/img/zhucai/201005/2010053100443039.png" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;ldquo;Demo&amp;rdquo;是自己用来简单试用的。&amp;ldquo;Test_Zhucai.LambdaParser&amp;rdquo;是基于VSTS的单元测试项目，新接触的人看这个比较容易理解这个项目是干什么的。&amp;ldquo;Zhucai.LambdaParser&amp;rdquo;是核心模块。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 18pt;"&gt;下面是主要的几个类：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/img/zhucai/201005/2010053100571575.png" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 14pt;"&gt;&lt;strong&gt;&lt;span style="font-size: 12pt;"&gt;CodeParser类&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;：负责解析代码。从前向后读取代码，通过ReadString方法每次读取一个代码单元。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;b&gt;代码单元&lt;/b&gt;：这是个自创的名词，用来表示代码的最小单元，如代码MessageBox.Show(m);对应的代码单元是：&lt;/p&gt;&#xD;
&lt;p&gt;1 MessageBox&lt;/p&gt;&#xD;
&lt;p&gt;2 .&lt;/p&gt;&#xD;
&lt;p&gt;3 Show&lt;/p&gt;&#xD;
&lt;p&gt;4 (&lt;/p&gt;&#xD;
&lt;p&gt;5 m&lt;/p&gt;&#xD;
&lt;p&gt;6 )&lt;/p&gt;&#xD;
&lt;p&gt;7 ;&lt;/p&gt;&#xD;
&lt;p&gt;那么ReadString方法会成功读取7次，直到第8次返回null结束。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;&lt;strong&gt;ExpressionParserCore&amp;lt;TDelegate&amp;gt;类&lt;/strong&gt;&lt;/span&gt;：这个类负责将代码解析为表达式树。它通过构造函数得到字符串代码，通过唯一的公共方法ToLambdaExpression()输出解析结果Expression。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;此类内部先通过输入的字符串代码构造一个CodeParser对象，然后通过泛型参数(将要构造出的委托类型)得到代码的参数类型，之后便开始用CodeParser对象遍历分析代码。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;分析代码&lt;/strong&gt;的过程：&lt;/p&gt;&#xD;
&lt;p&gt;1. 首先检查是否有Lambda表达式的前置符号=&amp;gt;，若有，则分析出参数列表。&lt;/p&gt;&#xD;
&lt;p&gt;2. 通过ReadExpression方法递归读取表达式。&lt;/p&gt;&#xD;
&lt;p&gt;ReadExpression方法是整个模块的核心方法，方法的大致思路如下：&lt;/p&gt;&#xD;
&lt;p&gt;将表达式看成A(+B)*n模式，即先读取表达式的A部分，再用循环读取接下来的n个+B部分。A部分表示表达式的第一个子表达式，+B部分表示一个操作符后面跟一个子表达式，而*n表示可能有0个或多个+B部分。&lt;/p&gt;&#xD;
&lt;p&gt;那么ReadExpression方法的伪代码大致便是这样：&lt;/p&gt;&#xD;
&lt;p style="padding-left: 30px;"&gt;&lt;span style="color: #008000;"&gt;读取第一个子表达式;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-left: 30px;"&gt;&lt;span style="color: #008000;"&gt;while()&lt;br /&gt;{&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-left: 60px;"&gt;&lt;span style="color: #008000;"&gt;读取二元/三元操作符；&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-left: 60px;"&gt;&lt;span style="color: #008000;"&gt;读取下一个子表达式；&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-left: 60px;"&gt;&lt;span style="color: #008000;"&gt;用指定操作符操作两个表达式，得到新表达式；&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-left: 30px;"&gt;&lt;span style="color: #008000;"&gt;}&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-left: 30px;"&gt;&lt;span style="color: #008000;"&gt;返回最新的表达式；&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;大致便是这样了，这里略去了很多需要处理的细节问题，如操作符优先级、类型判断等等。但有个问题是不能略过的，那便是子表达式又可能包含多个子表达式。&lt;/p&gt;&#xD;
&lt;p&gt;如果把平行连接的表达式操作看作横向操作，那么多层的子表达式包含便是纵向操作。横向问题是用while循环来解决，纵向问题用递归是最直观的。事实上，由于操作符优先级的问题，这里的横向操作也会有递归调用，或者说，是横向还是纵向变得不那么明确。&lt;/p&gt;&#xD;
&lt;p&gt;于是，读取子表达式的时候，调用ReadExpression来递归读取。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;最终，ReadExpression方法的函数签名是三个参数：&lt;/p&gt;&#xD;
&lt;p&gt;int priorityLevel：当前操作(或者说方法外部)的优先级。递归情况下使用。当方法内的下个操作优先级低于此值时直接返回。&lt;/p&gt;&#xD;
&lt;p&gt;string wrapStart：当前操作的前置括号。如(或[或{等。递归情况下使用。&lt;/p&gt;&#xD;
&lt;p&gt;out bool isClosedWrap：告诉方法外面是否在里面遇到了与前置括号匹配的结束符号。递归情况下使用。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;&lt;strong&gt;ExpressionParser类&lt;/strong&gt;&lt;/span&gt;：作为此模块向外暴露的接口，其内部调用ExpressionParserCore&amp;lt;TDelegate&amp;gt;类，提供一系列方法来编译执行代码。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这便是这个项目目前的大致情况。有时间了便考虑实现在.NET4.0下的代码块功能，那么这个项目也许就会有意义些了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/zhucai/aggbug/1747776.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhucai/archive/2010/05/31/lambda-parser.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhucai/archive/2010/05/28/exchange-variable.html</id><title type="text">也论不使用第三个变量交换两个变量的值[C#]</title><summary type="text">论述常见的几种交换方式。特别是x = x + y;y = x - y;x = x - y;</summary><published>2010-05-28T12:19:00Z</published><updated>2010-05-28T12:19:00Z</updated><author><name>朱才</name><uri>http://www.cnblogs.com/zhucai/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhucai/archive/2010/05/28/exchange-variable.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhucai/archive/2010/05/28/exchange-variable.html"/><content type="html">&lt;p&gt;假如有：int x = 1, y = 2;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;方法零：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;y = 2;&lt;/p&gt;&#xD;
&lt;p&gt;x = 1;&lt;/p&gt;&#xD;
&lt;p&gt;此方法纯属搞笑。请跳过阅读。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;方法一：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;x = x ^ y;&lt;br /&gt;y = x ^ y;&lt;br /&gt;x = x ^ y;&lt;br /&gt;此方法网上最常见，用二进制来看很容易理解。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;方法二：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;x = x + y;&lt;br /&gt;y = x - y;&lt;br /&gt;x = x - y;&lt;br /&gt;主要想说说此方法，因为发现网上到处都说此方法有溢出问题，即：当x + y大于int的最大值时，便会溢出。&lt;/p&gt;&#xD;
&lt;p&gt;没有错，x + y的值大于int的最大值时，的确会溢出，但这不算是个问题。&lt;/p&gt;&#xD;
&lt;p&gt;因为：x + y向上溢出后，后面的两次x - y又会向下溢出，又溢回来了：）&lt;/p&gt;&#xD;
&lt;p&gt;而&lt;a target="_blank" href="http://msdn.microsoft.com/zh-cn/library/aa691349(VS.71).aspx"&gt;MSDN&lt;/a&gt;也说得很清楚：&lt;span style="color: #808080;"&gt;对于不用任何 checked 或 unchecked 运算符或语句括起来的非常数表达式（在运行时计算的表达式），除非外部因素（如编译器开关和执行环境配置）要求 checked 计算，否则默认溢出检查上下文为 unchecked。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;即这种情况下默认是不检查溢出的，如果我们实在担心外部因素，大不了加个unchecked：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;unchecked&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;{&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp; x = x + y;&lt;br /&gt;&amp;nbsp;&amp;nbsp; y = x - y;&lt;br /&gt;&amp;nbsp;&amp;nbsp; x = x - y;&lt;br /&gt;}&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;所以：这个方法也是没问题的。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;方法三&lt;/strong&gt;：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;x = y + (y = x) * 0;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;此方法最简洁，才一句话。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;假如x和y是&lt;strong&gt;字符串&lt;/strong&gt;：string x = "x",y = "y";&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;那么&lt;strong&gt;方法一失效&lt;/strong&gt;。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;方法二&lt;/strong&gt;可以改装成：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;x = x + y;&lt;br /&gt;y = x.Substring(0, x.Length - y.Length);&lt;br /&gt;x = x.Substring(y.Length);&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;方法三&lt;/strong&gt;可以改装成：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;x = y + (y = x).Substring(0, 0);&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;或：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;x = y + (y = x) == "" ? "" : "";&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;如果x和y是&lt;strong&gt;object&lt;/strong&gt;呢？&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;那么&lt;strong&gt;方法一二都失效&lt;/strong&gt;。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;方法三&lt;/strong&gt;的关键点加号&amp;ldquo;+&amp;rdquo;在object上不可用，想了半天，没想出很完美的方法，只想出个打擦边球的方法：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;x = new object[]{y, y = x}[0];&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;这个数组临时变量应该也算是第三个变量，所以此方法应该还是不符合题意的。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;大家有更好的建议吗？&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/zhucai/aggbug/1746601.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhucai/archive/2010/05/28/exchange-variable.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhucai/archive/2010/01/25/LambdaParser.html</id><title type="text">解析字符串代码为委托：LambdaParser的更新</title><summary type="text">LambdaParser的更新：1.支持生成非强类型的委托。2.可传入默认实例。3.匿名类型传递后的属性访问。</summary><published>2010-01-25T15:12:00Z</published><updated>2010-01-25T15:12:00Z</updated><author><name>朱才</name><uri>http://www.cnblogs.com/zhucai/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhucai/archive/2010/01/25/LambdaParser.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhucai/archive/2010/01/25/LambdaParser.html"/></entry><entry><id>http://www.cnblogs.com/zhucai/archive/2009/12/30/js_encode_to_gb2312.html</id><title type="text">js中用gb2312编码解码</title><summary type="text">在js中将中文用gb2312编码。如，“我”编码后应该是“%CE%D2”。</summary><published>2009-12-30T13:55:00Z</published><updated>2009-12-30T13:55:00Z</updated><author><name>朱才</name><uri>http://www.cnblogs.com/zhucai/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhucai/archive/2009/12/30/js_encode_to_gb2312.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhucai/archive/2009/12/30/js_encode_to_gb2312.html"/></entry></feed>
