﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-庄周梦蝶，孰蝶是我，我是孰蝶？一梦至今，蝶我已难分-随笔分类-C#历程</title><link>http://www.blogjava.net/killme2008/category/19912.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 09 Apr 2007 04:35:15 GMT</lastBuildDate><pubDate>Mon, 09 Apr 2007 04:35:15 GMT</pubDate><ttl>60</ttl><item><title>微软为VS.net添加单元测试功能</title><link>http://www.blogjava.net/killme2008/archive/2007/04/09/109316.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Mon, 09 Apr 2007 00:37:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2007/04/09/109316.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/109316.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2007/04/09/109316.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/109316.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/109316.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 开源工具已经有NUnit，微软这次给VS增加的单元测试功能不知道是不是直接借鉴NUnit？不过总也是好事，还集成了静态分析和代码覆盖工具等，值的小小期待下。从这点上看，单元测试已经非常深入人心咯。消息来自<a  href="http://www.infoq.com/cn/news/2007/04/MS-Unit-Testing">infoq中文站</a><br><img src ="http://www.blogjava.net/killme2008/aggbug/109316.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-04-09 08:37 <a href="http://www.blogjava.net/killme2008/archive/2007/04/09/109316.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C#实现二叉查找树</title><link>http://www.blogjava.net/killme2008/archive/2007/04/02/108018.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Mon, 02 Apr 2007 09:29:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2007/04/02/108018.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/108018.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2007/04/02/108018.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/108018.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/108018.html</trackback:ping><description><![CDATA[<p>二叉查找树（binary search tree)</p>
<p>1）概念：对于树中的每个节点n，其左子节点中保存的所有数值都小于n保存的数值，右子节点保存的数值都大于n保存的数值。</p>
<p>2）二叉查找树可以实现更为优越的查找性能，主要实现方式有数组和链表结构，相比较而言，链表实现更为容易，因为数组实现删除和添加功能需要移动数组元素（如填补删除空位等）</p>
<br>今天下午在打印问题搞定后用C#实现了一下，比java版本比较有趣的使用C#的delegate来代替遍历二叉树时的visit方法，这样一来可以在遍历时对节点进行你所想要的任何操作。我们知道C#的delegate是类型化的函数指针，而C++的函数指针可以模仿动态语言的闭包或者匿名函数。这里也有这样的味道。<br><br>代码如下，只实现了整数型的，节点定义：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;BSTIntNode<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;value;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;BSTIntNode&nbsp;left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;BSTIntNode&nbsp;right;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;BSTIntNode(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;value,&nbsp;BSTIntNode&nbsp;left,&nbsp;BSTIntNode&nbsp;right)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.value&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;value;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.left&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.right&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;BSTIntNode(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;value)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.value&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;value;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.left&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.right&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br>然后定义一个Delegate，作为遍历时的访问方法：<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">delegate</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Visit(BSTIntNode&nbsp;node);</span></div>
<br>然后就是二叉树的实现，删除算法只实现了复制删除法：<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;BSTIntTree<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;BSTIntNode&nbsp;root;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Visit&nbsp;visit;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;BSTIntTree()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.root&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;BSTIntNode&nbsp;Search(BSTIntNode&nbsp;node,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;el)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(node&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(el&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;node.value)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(el&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;node.value)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;node.left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;node.right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">查找</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;BSTIntNode&nbsp;Search(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;el)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;Search(root,&nbsp;el);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">广度优先遍历,利用队列实现,至上而下，至左而右</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;BreadthFirst()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BSTIntNode&nbsp;p&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;root;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Queue&nbsp;queue&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ListQueue();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(p&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queue.Enqueue(p);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #000000;">queue.IsEmpty())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(BSTIntNode)queue.Dequeue();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;visit(p);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(p.left&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queue.Enqueue(p.left);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(p.right&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queue.Enqueue(p.right);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">深度优先遍历，递归实现线序，中序和后序<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">先序</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;PreOrder(BSTIntNode&nbsp;p)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(p&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;visit(p);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PreOrder(p.left);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PreOrder(p.right);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;PreOrder()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PreOrder(root);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">中序</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;InOrder(BSTIntNode&nbsp;p)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(p&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InOrder(p.left);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;visit(p);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InOrder(p.right);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;InOrder()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InOrder(root);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">后序</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;PostOrder(BSTIntNode&nbsp;p)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(p&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PostOrder(p.left);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PostOrder(p.right);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;visit(p);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;PostOrder()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PostOrder(root);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">插入节点操作</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Insert(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;el)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BSTIntNode&nbsp;p&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;root,&nbsp;prev&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">查找节点位置</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(p&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prev&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;p;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(p.value&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;el)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;p.right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;p.left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(root&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">空树</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;BSTIntNode(el);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(prev.value&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;el)&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">大于节点，插入右子树</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prev.right&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;BSTIntNode(el);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prev.left&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;BSTIntNode(el);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">复制删除法的实现，归并删除法可能改变树的高度</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Delete(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;el)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BSTIntNode&nbsp;node,&nbsp;p&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;root,&nbsp;prev&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">查找节点位置</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(p&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">p.value</span><span style="color: #000000;">!=</span><span style="color: #000000;">el)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prev&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;p;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(p.value&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;el)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;p.right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;p.left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;p;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(p&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;p.value&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;el)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(node.right&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;node.left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(node.left&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;node.right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BSTIntNode&nbsp;temp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;node.left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BSTIntNode&nbsp;previous&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(temp.right&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">查找左字节数的最右子节点</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;previous&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;temp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;temp.right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node.value&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;temp.value;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(previous&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;node)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;previous.left&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;temp.left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;previous.right&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;temp.left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(p&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;root)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(prev.left&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;p)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prev.left&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prev.right&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(root&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #000000;">"</span><span style="color: #000000;">没有找到节点：{0}</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;el);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #000000;">"</span><span style="color: #000000;">树为空！</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br>注意，在树中我们维持了一个Visit的delegate，看看使用方法：<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Main(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">[]&nbsp;args)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BSTIntTree&nbsp;tree</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;BSTIntTree();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;[]num</span><span style="color: #000000;">=</span><span style="color: #000000;">{</span><span style="color: #000000;">10</span><span style="color: #000000;">,</span><span style="color: #000000;">20</span><span style="color: #000000;">,</span><span style="color: #000000;">6</span><span style="color: #000000;">,</span><span style="color: #000000;">12</span><span style="color: #000000;">,</span><span style="color: #000000;">23</span><span style="color: #000000;">,</span><span style="color: #000000;">15</span><span style="color: #000000;">,</span><span style="color: #000000;">8</span><span style="color: #000000;">};<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;num.Length;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree.Insert(num[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">添加遍历处理函数，可以有多个&nbsp;</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree.visit&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Visit(printNode);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #000000;">"</span><span style="color: #000000;">广度优先遍历</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree.BreadthFirst();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #000000;">"</span><span style="color: #000000;">先序</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree.PreOrder();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #000000;">"</span><span style="color: #000000;">中序</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree.InOrder();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #000000;">"</span><span style="color: #000000;">后序</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree.PostOrder();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree.Delete(</span><span style="color: #000000;">8</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree.Delete(</span><span style="color: #000000;">15</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #000000;">"</span><span style="color: #000000;">删除后广度优先遍历</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree.BreadthFirst();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;printNode(BSTIntNode&nbsp;node)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #000000;">"</span><span style="color: #000000;">访问节点:{0}</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;node.value);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br>
<p>可以看到，C#的delegate机制非常有趣，如果在java中恐怕需要用inner class来实现了。<br></p>
<p><br></p><img src ="http://www.blogjava.net/killme2008/aggbug/108018.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-04-02 17:29 <a href="http://www.blogjava.net/killme2008/archive/2007/04/02/108018.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C#实现栈和队列</title><link>http://www.blogjava.net/killme2008/archive/2007/03/30/107409.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Fri, 30 Mar 2007 01:44:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2007/03/30/107409.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/107409.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2007/03/30/107409.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/107409.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/107409.html</trackback:ping><description><![CDATA[有了前一篇<a href="/killme2008/archive/2007/03/29/107261.html">C#链表的实现</a>，实现栈和队列易如反掌。<br /><br />栈，利用单向链表实现：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">abstract</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> AbstractStack<br />    {<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">abstract</span><span style="color: rgb(0, 0, 0);"> Object Pop();<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">abstract</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> Push(Object obj);<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">abstract</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">bool</span><span style="color: rgb(0, 0, 0);"> IsEmpty();<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">abstract</span><span style="color: rgb(0, 0, 0);"> Object Top();<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">abstract</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> Clear();<br />    }<br /><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> Stack : AbstractStack<br />    {<br />        </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> SList list;<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> Stack()<br />        {<br />            list </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> SList();<br />        }<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">override</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">bool</span><span style="color: rgb(0, 0, 0);"> IsEmpty()<br />        {<br />            </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> list.IsEmpty();<br />        }<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">override</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> Push(Object obj)<br />        {<br />            list.Push(obj);<br />        }<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">override</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">object</span><span style="color: rgb(0, 0, 0);"> Pop()<br />        {<br />            </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> list.Pop();<br />        }<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">override</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">object</span><span style="color: rgb(0, 0, 0);"> Top()<br />        {<br />            </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> list.getTail();<br />        }<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">override</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> Clear()<br />        {<br />            list.Clear(); <br />        }<br />    }</span></div><br />队列的实现，通过双向链表实现，对于环形数组的实现请参考《<a href="/killme2008/archive/2007/02/20/100239.html">数组结构之栈与链表</a>》：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">interface</span><span style="color: rgb(0, 0, 0);"> Queue<br />    {<br />        </span><span style="color: rgb(0, 0, 255);">bool</span><span style="color: rgb(0, 0, 0);"> IsEmpty();<br />        </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> Enqueue(Object obj);<br />        Object Dequeue();<br />        Object First();<br />    }<br /><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> ListQueue:Queue<br />    {<br />        </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> LinkedList list;<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> ListQueue()<br />        {<br />            list </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> LinkedList();<br />        }<br /><br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">bool</span><span style="color: rgb(0, 0, 0);"> IsEmpty()<br />        {<br />            </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> list.IsEmpty();<br />        }<br /><br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> Enqueue(Object obj)<br />        {<br />            list.Push(obj);<br />        }<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> Object Dequeue()<br />        {<br />            </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> list.Shift();<br />        }<br /><br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> Object First()<br />        {<br />            </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> list.getHead();<br />        }<br />    }<br /></span></div><br /><img src ="http://www.blogjava.net/killme2008/aggbug/107409.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-03-30 09:44 <a href="http://www.blogjava.net/killme2008/archive/2007/03/30/107409.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C#实现链表</title><link>http://www.blogjava.net/killme2008/archive/2007/03/29/107261.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Thu, 29 Mar 2007 09:02:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2007/03/29/107261.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/107261.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2007/03/29/107261.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/107261.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/107261.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: C#实现单向和双向链表。&nbsp;&nbsp;<a href='http://www.blogjava.net/killme2008/archive/2007/03/29/107261.html'>阅读全文</a><img src ="http://www.blogjava.net/killme2008/aggbug/107261.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-03-29 17:02 <a href="http://www.blogjava.net/killme2008/archive/2007/03/29/107261.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对MarshalByRefObject的解释</title><link>http://www.blogjava.net/killme2008/archive/2007/03/28/107037.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Wed, 28 Mar 2007 09:55:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2007/03/28/107037.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/107037.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2007/03/28/107037.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/107037.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/107037.html</trackback:ping><description><![CDATA[    今天看到一段介绍C#实现代理模式的代码，使用到了<span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">MarshalByRefObject</span><span style="font-size: 10pt; color: black; font-family: 宋体;">。那么</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">MarshalByRefObject</span><span style="font-size: 10pt; color: black; font-family: 宋体;">到底是什么东西呢？简单来讲，继承此类的对象</span><span style="font-size: 10pt; color: black; font-family: 宋体;">可以跨越应用程序域边界被引用，甚至被远程引用。远程调用时，将产生一个远程对象在本地的透明代理，通过此代理来进行远程调用。一篇很好的解释文章，来自http://dudu.cnblogs.com/archive/2004/03/04/2182.html<br /><br /><br /></span><div class="postText"><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><b style=""><span style="font-size: 10pt; color: black; font-family: 宋体;">问：</span></b><b style=""><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"><o:p></o:p></span></b></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体;">打扰一下，请问</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">MarshalByRefObject</span><span style="font-size: 10pt; color: black; font-family: 宋体;">中的</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">"Marshal"</span><span style="font-size: 10pt; color: black; font-family: 宋体;">应该怎样理解？</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><b style=""><span style="font-family: 宋体;">回复</span></b><span style="font-family: 宋体;">：</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="font-size: 10pt; color: black; font-family: 宋体;">按照</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">package</span><span style="font-size: 10pt; color: black; font-family: 宋体;">的意思理解</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">——</span><span style="font-size: 10pt; color: black; font-family: 宋体;">当一个对象需要长途跋涉到另一个环境中时，需要将其</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">marshal</span><span style="font-size: 10pt; color: black; font-family: 宋体;">成一个可以传输的形态（比如在</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">.NET Remoting</span><span style="font-size: 10pt; color: black; font-family: 宋体;">中对象将被打包成一个</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">serializable</span><span style="font-size: 10pt; color: black; font-family: 宋体;">的</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">ObjRef</span><span style="font-size: 10pt; color: black; font-family: 宋体;">实例</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">——</span><span style="font-size: 10pt; color: black; font-family: 宋体;">这个</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">ByRef</span><span style="font-size: 10pt; color: black; font-family: 宋体;">就是指</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">ObjRef</span><span style="font-size: 10pt; color: black; font-family: 宋体;">这种形态）；同理，当打包以后传输到目标地点，还要执行</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">unmarshal</span><span style="font-size: 10pt; color: black; font-family: 宋体;">的操作将其还原为内存中的对象。：）</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><b style=""><span style="font-size: 10pt; color: black; font-family: 宋体;">问：</span></b><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 10pt; color: black; font-family: 宋体;">谢谢！</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">MarshalByRefObject</span><span style="font-size: 10pt; color: black; font-family: 宋体;">是不是可以这样理解：对被引用的对象进行</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">Marshal</span><span style="font-size: 10pt; color: black; font-family: 宋体;">。如果按照</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">package</span><span style="font-size: 10pt; color: black; font-family: 宋体;">的意思理解，那</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">package</span><span style="font-size: 10pt; color: black; font-family: 宋体;">的过程是怎样的？</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"> <o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><b><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">MSDN</span></b><b><span style="font-size: 10pt; color: black; font-family: 宋体;">上这样讲：</span></b><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><b><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">MarshalByRefObject</span></b><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"></span><span style="font-size: 10pt; color: black; font-family: 宋体;">是通过使用</span><span style="font-size: 10pt; color: red; font-family: 宋体;">代理</span><span style="font-size: 10pt; color: black; font-family: 宋体;">交换消息来跨应用程序域边界进行通讯的对象的基类</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">.<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><b><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">MarshalByRefObject</span></b><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"></span><span style="font-size: 10pt; color: black; font-family: 宋体;">对象在本地应用程序域的边界内可直接访问。远程应用程序域中的应用程序首次访问</span><b><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">MarshalByRefObject</span></b><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"></span><span style="font-size: 10pt; color: black; font-family: 宋体;">时，会向该远程应用程序传递</span><span style="font-size: 10pt; color: red; font-family: 宋体;">代理</span><span style="font-size: 10pt; color: black; font-family: 宋体;">。对该代理后面的调用将封送回驻留在本地应用程序域中的对象。</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"> <o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体;">在</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">Marshal</span><span style="font-size: 10pt; color: black; font-family: 宋体;">中，上面所说的代理是什么？有什么用？</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"> <o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><b><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">MSDN</span></b><b><span style="font-size: 10pt; color: black; font-family: 宋体;">上还讲到：</span></b><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体;">当跨应用程序域边界使用类型时，类型必须是从</span><span style="font-size: 10pt; color: black; font-family: Verdana;"><b><span lang="EN-US">MarshalByRefObject</span></b><span lang="EN-US"></span></span><span style="font-size: 10pt; color: black; font-family: 宋体;">继承的，而且由于对象的成员在创建它们的应用程序域之外无法使用，所以</span><span style="font-size: 10pt; color: red; font-family: 宋体;">不得复制对象的状态</span><span style="font-size: 10pt; color: black; font-family: 宋体;">。</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"> <o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体;">既然对象的状态不能传递过去，那传递这个对象又有何意义？</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体;">第一次去理解</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">MarshalByRefObject</span><span style="font-size: 10pt; color: black; font-family: 宋体;">，有的问题可能提的比较肤浅，请您指点。</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><b style=""><span style="font-family: 宋体;">回复：</span></b><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">MarshalByRefObject</span><span style="font-size: 10pt; color: black; font-family: 宋体;">是所有可以在</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">AppDomain</span><span style="font-size: 10pt; color: black; font-family: 宋体;">边界外部访问的对象的基类，重心不是</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">marshal</span><span style="font-size: 10pt; color: black; font-family: 宋体;">，而是</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">object</span><span style="font-size: 10pt; color: black; font-family: 宋体;">，即</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">object that could be marshaled by reference</span><span style="font-size: 10pt; color: black; font-family: 宋体;">，也就是可以通过</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">Ref</span><span style="font-size: 10pt; color: black; font-family: 宋体;">（实际上是</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">ObjRef</span><span style="font-size: 10pt; color: black; font-family: 宋体;">对象）的机制进行</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">“</span><span style="font-size: 10pt; color: black; font-family: 宋体;">封送</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">”</span><span style="font-size: 10pt; color: black; font-family: 宋体;">（</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">MSDN</span><span style="font-size: 10pt; color: black; font-family: 宋体;">中文版对</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">marshal</span><span style="font-size: 10pt; color: black; font-family: 宋体;">一词的翻译）的对象。封送的行为是由代理来做的，这里说的代理就是我文章中讲过的</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">.NET Remoting</span><span style="font-size: 10pt; color: black; font-family: 宋体;">的真实代理（即</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">RemotingProxy</span><span style="font-size: 10pt; color: black; font-family: 宋体;">）。真实代理不是有一个</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">Invoke()</span><span style="font-size: 10pt; color: black; font-family: 宋体;">方法吗？当你透过对一个</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">MBRO</span><span style="font-size: 10pt; color: black; font-family: 宋体;">的透明代理访问该对象的方法时，透明代理将把基于堆栈的方法调用转换为方法调用消息（</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">IMethodCallMessage</span><span style="font-size: 10pt; color: black; font-family: 宋体;">）并转发给真实代理（在</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">Remoting</span><span style="font-size: 10pt; color: black; font-family: 宋体;">的场合中也即</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">RemotingProxy</span><span style="font-size: 10pt; color: black; font-family: 宋体;">），而</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">RemotingProxy</span><span style="font-size: 10pt; color: black; font-family: 宋体;">的任务就是把对象封送并连同方法调用消息一起转发给远程应用程序域；到达目的地以后的操作类似：远程应用程序域中的监听方当收到发来的方法调用消息时，先取出封送好的</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">ObjRef</span><span style="font-size: 10pt; color: black; font-family: 宋体;">（这个对象里面保存着发来调用的那个对象！），将其结封（</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">unmarshal</span><span style="font-size: 10pt; color: black; font-family: 宋体;">）为本地的对象，并获得其透明代理，然后就可以把方法调用消息在转换回基于堆栈的调用发送给这个对象。</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"> <o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体;">对象是在本地维护的，但是方法可以在远程调用。你比如说一个</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">web</span><span style="font-size: 10pt; color: black; font-family: 宋体;">应用程序，你是通过本地的浏览器远程访问这个应用程序，但是应用程序的状态不会由你的浏览器负责（所以你只是在访问这个应用程序提供给你的功能而已，你并没于拥有应用程序本身，包括其所有数据），你只是发送一个个的请求，服务器告诉你处理的结果。在</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">Remoting</span><span style="font-size: 10pt; color: black; font-family: 宋体;">中
也是一样，当你获得一个远程对象的时候，你实际上只拥有对这个对象的一个远程引用，虽然你可以调用它的方法，但实际上这些操作都是发生在远程的（就是前面
讲过的过程），你只是传入了一些参数，得到了一个结果，但对象的状态还是在远程维护的（换句话说，对象本身也就是对象的所有状态并没有被往返传递，传递的
只是传入传出的参数</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">——</span><span style="font-size: 10pt; color: black; font-family: 宋体;">当然，如果参数是一个</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">MBRO</span><span style="font-size: 10pt; color: black; font-family: 宋体;">的话，还是传递对象被封送的引用）。</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"> <o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体;">也许应该给你准备一个好理解的例子</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">……</span><span style="font-size: 10pt; color: black; font-family: 宋体;">你就会豁然开朗了。：）</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><b style=""><span style="font-size: 10pt; color: black; font-family: 宋体;">问：</span></b><b style=""><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"><o:p></o:p></span></b></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体;">我这样的理解对不对？</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体;">一般的对象与从</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">MarshalByRefObject</span><span style="font-size: 10pt; color: black; font-family: 宋体;">继承的对象区别是：</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体;">一般的对象只能在本地应用程序域之内被引用，而</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">MarshalByRefObject</span><span style="font-size: 10pt; color: black; font-family: 宋体;">对象可以跨越应用程序域边界被引用，甚至被远程引用。</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><b style=""><span style="font-family: 宋体;">回复</span></b><span style="font-family: 宋体;">：</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">Exactly! </span><span style="font-size: 10pt; color: black; font-family: 宋体;">当对象跨出</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">AppDomain</span><span style="font-size: 10pt; color: black; font-family: 宋体;">边界的时候，实际上只是它的一个引用（</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">ObjRef</span><span style="font-size: 10pt; color: black; font-family: 宋体;">）。你比如说吧：</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"> <o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">public class LocalObject<br />{</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">  public void CallRemoteObject(MarshalByRefObject mbro)<br />  {<br />    Console.WriteLine(mbro.ToString());</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">  }<br />}</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"> <o:p></o:p></span></p><span style="font-size: 10pt; color: black; font-family: 宋体;">当传入一个在本地创建的</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">mbro</span><span style="font-size: 10pt; color: black; font-family: 宋体;">对象时，</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">ToString()</span><span style="font-size: 10pt; color: black; font-family: 宋体;">方法是直接发送给对象的；而当</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">mbro</span><span style="font-size: 10pt; color: black; font-family: 宋体;">是通过</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">Remoting</span><span style="font-size: 10pt; color: black; font-family: 宋体;">创建的远程对象的话，实际上它只是一个包含有已经</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">marshal</span><span style="font-size: 10pt; color: black; font-family: 宋体;">好的</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">ObjRef</span><span style="font-size: 10pt; color: black; font-family: 宋体;">的透明代理，</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">ObjRef</span><span style="font-size: 10pt; color: black; font-family: 宋体;">里面有什么？对象实例的</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">URI</span><span style="font-size: 10pt; color: black; font-family: 宋体;">！所以当你调用这个远程对象时，相当于向这个远程端口（</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">tcp://remoteServer/xxxx.rem</span><span style="font-size: 10pt; color: black; font-family: 宋体;">）发送方法调用消息而已。只不过透明代理隐藏了对象位置的概念，而</span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">RemotingProxy</span><span style="font-size: 10pt; color: black; font-family: 宋体;">真实代理则是实际上处理远程方法调用和对象封送的中枢对象。</span></div><br /><img src ="http://www.blogjava.net/killme2008/aggbug/107037.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-03-28 17:55 <a href="http://www.blogjava.net/killme2008/archive/2007/03/28/107037.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>体验rails1.2的REST风格</title><link>http://www.blogjava.net/killme2008/archive/2007/03/20/105083.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Tue, 20 Mar 2007 12:04:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2007/03/20/105083.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/105083.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2007/03/20/105083.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/105083.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/105083.html</trackback:ping><description><![CDATA[    REST这个名词已经听过许久，在javaeye的ruby版上也看到不少的讨论，一开始是搞不明白的，似乎跟webservice有关。今天读了《RESTfull Rails Development》和几篇介绍REST的文章开始有点明白。REST 是英文 Representational State Transfer 的缩写，有中文翻译为“具象状态传输”。读这篇文章《<a href="http://www.duduwolf.com/wiki/2007/260.html">学习REST</a>》对于初次接触REST的人来说更好理解。<p>    我们在 Web 应用中处理来自客户端的请求时，通常只考虑 GET 和 POST 这两种 HTTP 请求方法。实际上，HTTP 还有
HEAD、PUT、DELETE 等请求方法。而在 REST 架构中，用不同的 HTTP 请求方法来处理对资源的
CRUD（创建、读取、更新和删除）操作：</p><ul><li>POST: 创建 </li><li>GET: 读取 </li><li>PUT: 更新 </li><li>DELETE: 删除 </li></ul><p>经过这样的一番扩展，我们对一个资源的 CRUD 操作就可以通过同一个 URI 完成了。需要注意的是REST的核心就是资源（resources）这个概念。我们所说的webservice是一种建立在http协议上的远程调用，而REST就是把远程调用抽象成对远程资源的CRUD的操作，正好可以用HTTP的PUT GET POST DELETE来对应，而不是重新发明一个协议（比如soap，简单对象访问协议）。REST与AJAX的流行，甚至远至设计模式的兴起，都充分说明一个现象，在成熟的应用的基础上创新而非扩展出复杂所谓“创新性”架构在软件行业是更为可靠。</p><p>    实战体验REST可以从IBM Developer的这篇文章开始《<a href="http://www.ibm.com/developerworks/cn/java/j-cb08016/">跨越边界：Rest On Rails</a>》。这篇文章是在Rails1.2发布之前出来的，有些地方已经可以修改的更简练，我把我的练习过程记录下，并添加了C#调用REST风格web service的例子。</p><p>    首先，你的机器上需要安装rails1.2，并且假设你对rails有基本的了解，建立一个应用叫service,命令行执行：</p><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">   <div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);"> rails service</span></div><br /></span><p>rails自动帮你生成应用的基本结构和基础代码，然后编辑config下面的database.yml设置数据库，并建立数据service_development，我用的是mysql数据库。</p><p><img src="http://www.blogjava.net/images/blogjava_net/killme2008/create.bmp" alt="create.bmp" border="0" height="400" width="640" /><br /></p><p>利用rails1.2新的scaffold命令：</p><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">ruby script</span><span style="color: rgb(128, 128, 128);">/</span><span style="color: rgb(0, 0, 0);">generate scaffold_resource person</span></div><p>这个命令将自动生成ActiveRecord,Controller以及View，在\app\models下可以发现自动生成的Model——person.rb。打开service\db\migrate下面的001_create_people.rb，编辑如下：</p><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">class CreatePeople </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);"> ActiveRecord</span><span style="color: rgb(0, 0, 0);">::</span><span style="color: rgb(0, 0, 0);">Migration<br />  def self</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">up<br />    create_table </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">people </span><span style="color: rgb(0, 0, 255);">do</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);">t</span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);"><br />     t</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">column </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">first_name</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">string</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">limit </span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 0);">40</span><span style="color: rgb(0, 0, 0);"><br />     t</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">column </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">last_name</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">string</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">limit </span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 0);">40</span><span style="color: rgb(0, 0, 0);"><br />     t</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">column </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">email</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">string</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">limit </span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 0);">40</span><span style="color: rgb(0, 0, 0);"><br />     t</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">column </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">phone</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">string</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">limit </span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 0);">15</span><span style="color: rgb(0, 0, 0);"><br />    end<br />  end<br /><br />  def self</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">down<br />    drop_table </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">people<br />  end<br />end<br /></span></div><br />利用rake命令自动建表，执行 <br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">rake db</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">migrate</span></div>rails默认表明是Model的复数形式，也就是这里将自动建立一张名叫people的表。<br /><br />OK，一切就绪，启动WEBric，访问http://localhost:3000/people，显示：<br /><img src="http://www.blogjava.net/images/blogjava_net/killme2008/rest1.bmp" alt="rest1.bmp" border="0" height="725" width="539" /><br /><br />scaffold已经帮我们自动生成了一个对person资源的crud操作，增删改查似乎跟传统的rails没有什么不同嘛。如果你认真观察在操作过程中URL的变化情况就会发现在操作过程中URL的变化很小，而且与传统rails的URL路由相比，省去了action名称。出现的变化在/people、/people/1、/people/1;edit和/people/new这几个之中。在/people的URL中隐藏这可能是http的POST或者GET的方法，前者用于create操作，而GET用于show操作，具体你可以查看app/controllers/目录下的PeopleController类，每个action的前面都注释了它们将对应哪个HTTP方法。而/people/1中的1指的是资源的标志符，比如这里person的id，通过这个ID来进行资源的操作，也许是PUT方法（更新），也许是DELETE方法（删除）。rails实现PUT和Delete是通过隐藏字段来实现的，查看编辑页面生成的html源代码，你将发现一个_method的隐藏字段，值为PUT。而另外两个URL：/people/1;edit和/people/new，这两个并非严格意义上的RESTful URL，它们只是为了显示用，显示form表单用于新建和编辑。关于RESTful风格的URL的详细讨论请见《RESTfull Rails Development》文档。<br /><br />    如果rails只是这样的威力，那就有点小提大做了，看看PeopleController的show action，它对应于http的GET请求，返回people列表：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 128, 0);">#</span><span style="color: rgb(0, 128, 0);"> GET /people/1<br />  # GET /people/1.xml</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">  def show<br />    </span><span style="color: rgb(128, 0, 128);">@person</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> Person</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">find(params[</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">id])<br /><br />    respond_to </span><span style="color: rgb(0, 0, 255);">do</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 255);">format</span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);"><br />      </span><span style="color: rgb(0, 0, 255);">format</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">html </span><span style="color: rgb(0, 128, 0);">#</span><span style="color: rgb(0, 128, 0);"> show.rhtml</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">      </span><span style="color: rgb(0, 0, 255);">format</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">xml  { render </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">xml </span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">@person</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">to_xml }<br />    end<br />  end</span></div><br />神奇的地方在respond_to方法中，根据请求文件类型（http Header的ContentType），显示html格式，或者xml格式（还有其他支持，比如json、RSS、Atom等等）。比如你添加了一个person,通过http://localhost:3000/people/1访问，可以看到这个人员的具体信息：<br /><img src="http://www.blogjava.net/images/blogjava_net/killme2008/rest2.bmp" alt="rest2.bmp" border="0" height="232" width="262" /><br />我们再通过http://localhost:3000/people/3.xml访问看到的却是一个xml文件：<br /><br /><img src="http://www.blogjava.net/images/blogjava_net/killme2008/rest3.bmp" alt="rest3.bmp" border="0" height="186" width="339" /><br /><br />不仅如此，我们也可以通过其他语言编写客户端来调用http://localhost:3000/people/1这个url，慢着，这不正是web service远程调用吗？没错，REST风格的web service相比于wsdl、soap定义的web service简单了太多太多，也更加实用。我们来编写一个java类调用http://localhost:3000/people获得所有的人员列表：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">package</span><span style="color: rgb(0, 0, 0);"> example;<br /><br /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> java.io.BufferedReader;<br /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> java.io.InputStreamReader;<br /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> java.io.OutputStreamWriter;<br /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> java.net.HttpURLConnection;<br /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> java.net.URL;<br /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> java.net.URLConnection;<br /><br /></span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> RESTDemo {<br /><br />    </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />     * </span><span style="color: rgb(128, 128, 128);">@param</span><span style="color: rgb(0, 128, 0);"> args<br />     </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> main(String[] args) {<br />        RESTDemo restDemo </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> RESTDemo();<br />            restDemo.get();<br />        <br />    }<br /><br />    </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> get() {<br /><br />        </span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);"> {<br />            URL url </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> URL(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">http://localhost:3000/people</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />            URLConnection urlConnection </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> url.openConnection();<br />            urlConnection.setRequestProperty(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">accept</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">text/xml</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />            BufferedReader in </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> BufferedReader(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> InputStreamReader(<br />                    urlConnection.getInputStream()));<br />            String str;<br /><br />            </span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);"> ((str </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> in.readLine()) </span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">) {<br />                System.out.println(str);<br />            }<br /><br />            in.close();<br />        } </span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);"> (Exception e) {<br />            System.out.println(e);<br />        }<br />    }<br />}</span></div><br />我们没有什么服务端接口class，我们也不用生成什么stub，我们调用的最常见最常见的http协议，发送的是默认的GET请求，rails自动将该请求转发给show action。注意，我们这里把<span style="color: rgb(0, 0, 0);">accept设置为text/xml，show方法根据此格式返回一个xml文档，下面是输出：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">&lt;?</span><span style="color: rgb(255, 0, 255);">xml version="1.0" encoding="UTF-8"</span><span style="color: rgb(0, 0, 255);">?&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">people</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">person</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">email</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">killme2008@gmail.com</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">email</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">first-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">dennis</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">first-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">id </span><span style="color: rgb(255, 0, 0);">type</span><span style="color: rgb(0, 0, 255);">="integer"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">id</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">last-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">zane</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">last-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">phone</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">1355XXXXXXX</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">phone</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">person</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">people</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span></div><br />如果仅仅是GET请求是不够的，我们说过，把远程调用抽象成对远程资源的CRUD操作，那么如何create、delete和update远程资源呢？同样很简单，比如我们通过C#远程调用，创建一个新person，还记的我说过吗？/people可以是POST请求，他将调用PeopleController的create方法：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">using</span><span style="color: rgb(0, 0, 0);"> System;<br /></span><span style="color: rgb(0, 0, 255);">using</span><span style="color: rgb(0, 0, 0);"> System.Net;<br /></span><span style="color: rgb(0, 0, 255);">using</span><span style="color: rgb(0, 0, 0);"> System.IO;<br /></span><span style="color: rgb(0, 0, 255);">using</span><span style="color: rgb(0, 0, 0);"> System.Text;<br /></span><span style="color: rgb(0, 0, 255);">namespace</span><span style="color: rgb(0, 0, 0);"> demo<br />{<br />    </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> RESTDemo<br />    {<br />        </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> Main(</span><span style="color: rgb(0, 0, 255);">string</span><span style="color: rgb(0, 0, 0);">[] args)<br />        {<br />            </span><span style="color: rgb(0, 0, 255);">string</span><span style="color: rgb(0, 0, 0);"> xmlText </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&lt;person&gt; </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&lt;first-name&gt;jordan&lt;/first-name&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"><br />                    </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&lt;last-name&gt;jordan&lt;/last-name&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"><br />                    </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&lt;email&gt;maggie@tate.com&lt;/email&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"><br />                    </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&lt;phone&gt;010-XXXXXXXX&lt;/phone&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&lt;/person&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />            Uri address </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Uri(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">http://localhost:3000/people</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);  <br />   <br />            </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> 创建web请求</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">            HttpWebRequest request </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> WebRequest.Create(address) </span><span style="color: rgb(0, 0, 255);">as</span><span style="color: rgb(0, 0, 0);"> HttpWebRequest;  <br />   <br />            </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> 设置请求类型为POST，调用create action</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">            request.Method </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">POST</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;  <br />            request.ContentType </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">application/xml</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br /><br />            </span><span style="color: rgb(0, 0, 255);">byte</span><span style="color: rgb(0, 0, 0);">[] xmlBytes </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> Encoding.ASCII.GetBytes(xmlText);<br /><br />            </span><span style="color: rgb(0, 0, 255);">using</span><span style="color: rgb(0, 0, 0);"> (Stream reqStream </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> request.GetRequestStream())<br />            {<br />                reqStream.Write(xmlBytes, </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">, xmlBytes.Length);<br />            }<br />            </span><span style="color: rgb(0, 0, 255);">using</span><span style="color: rgb(0, 0, 0);"> (WebResponse wr </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> request.GetResponse())<br />            {<br />                wr.<br />                </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">打印返回的http头</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">                Console.WriteLine(wr.Headers.ToString());<br />               <br />            }              <br />           <br /><br />        }<br />    }<br />}<br /></span></div><br />执行此程序，刷新http://localhost:3000/people，可以看到新建了一个人员如下<br /><br /><img src="http://www.blogjava.net/images/blogjava_net/killme2008/rest4.bmp" alt="rest4.bmp" border="0" height="156" width="558" /><br /></span><br />好极了，GET和POST都有了，那么PUT对应的更新和DELETE对应的删除又该怎么做呢，唯一的区别就是设置请求类型不同而已，java调用如下：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> put() {<br />        </span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);"> {<br />            String xmlText </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&lt;person&gt; </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&lt;first-name&gt;test&lt;/first-name&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"><br />                    </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&lt;last-name&gt;test&lt;/last-name&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"><br />                    </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&lt;email&gt;maggie@tate.com&lt;/email&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"><br />                    </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&lt;phone&gt;010-XXXXXXXX&lt;/phone&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&lt;/person&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br /><br />            URL url </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> URL(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">http://localhost:3000/people/1</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />            HttpURLConnection conn </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> (HttpURLConnection) url.openConnection();<br />            conn.setDoOutput(</span><span style="color: rgb(0, 0, 255);">true</span><span style="color: rgb(0, 0, 0);">);<br />            //设置请求为PUT<br />            conn.setRequestMethod(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">PUT</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />            conn.setRequestProperty(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Content-Type</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">text/xml</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />            OutputStreamWriter wr </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> OutputStreamWriter(conn<br />                    .getOutputStream());<br />            wr.write(xmlText);<br />            wr.flush();<br />            wr.close();<br />        } </span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);"> (Exception e) {<br />            System.out.println(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Error</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> e);<br />        }<br />    }<br /><br />    </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> delete() {<br />        </span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);"> {<br />            URL url </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> URL(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">http://localhost:3000/people/2</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />            HttpURLConnection conn </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> (HttpURLConnection) url.openConnection();<br />            conn.setDoOutput(</span><span style="color: rgb(0, 0, 255);">true</span><span style="color: rgb(0, 0, 0);">);<br />            //设置请求为DELETE<br />            conn.setRequestMethod(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">DELETE</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />            conn.setRequestProperty(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Content-Type</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">text/xml</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />            </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(conn.getResponseCode()</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">200</span><span style="color: rgb(0, 0, 0);">)<br />                System.out.println(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">删除成功！</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />        }</span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);"> (Exception e) {<br />            System.out.println(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Error</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> e);<br />        }<br />    }</span></div><br />这里的put方法将第一个人员的名字改了，而delete方法干脆将刚才C#添加的人员删除掉。异构系统的远程调用变的如此简单很轻松，把什么EJB、CORBA、SOAP统统忘掉吧。想象这样的场景，所有的网站都提供REST风格的API，这个世界将是什么模样？<br /><br />    REST带来的不仅仅是web service的改变，对MVC架构同样具有很重要的意义，过去我们的复用通常在MODEL层，我们一直希望复用业务逻辑层，却没有想过是否能复用Controller甚至View呢？REST为我们提供了可能，比如以一个很经常被提到的例子来说，用户加入某个圈子这个操作跟圈子的管理员将用户加入圈子的操作是一样，但是操作成功后的跳转显示的页面也许不同，过去也许我们是通过写两个不同的Action来实现，而现在，同一个Action（加入圈子这个操作）只负责发送数据（XML格式的文档），而页面的展示将留给客户端去选择，从而复用了Controller，减少了Action和View层的代码量。进一步，请你想象，REST与AJAX的技术结合产生多么有趣的画面。<b>REST仅用于提供数据</b>，展现更多的交给了客户端。<br /><br />    本文仅仅是我接触REST这两天的学习总结，对于REST的应用才刚刚起步，需要更多的探讨和实践。其实java实现REST也是相当简单的，servlet本身就是很好的模型，恐怕没有多人注意到HttpServlet类中的doPut和doDelete方法，我们过去太强调GET和POST，反而忽视了PUT和DELETE可能带来的改变。java开源世界中已经有了REST风格的框架，比如<a href="https://cetia4.dev.java.net/">cetia4，</a>这是一个servlet-base的REST框架，值的关注。<br /><img src ="http://www.blogjava.net/killme2008/aggbug/105083.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-03-20 20:04 <a href="http://www.blogjava.net/killme2008/archive/2007/03/20/105083.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用 HttpWebRequest 向网站提交数据</title><link>http://www.blogjava.net/killme2008/archive/2007/03/20/105023.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Tue, 20 Mar 2007 08:32:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2007/03/20/105023.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/105023.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2007/03/20/105023.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/105023.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/105023.html</trackback:ping><description><![CDATA[
		<div class="postTitle">
				<a id="viewpost1_TitleUrl" class="postTitle2" href="http://www.cnblogs.com/webman/archive/2006/11/17/564106.html">转自：http://www.cnblogs.com/webman/archive/2006/11/17/564106.html<br /></a>
		</div>
	HttpWebRequest 是 .net 基类库中的一个类，在命名空间 System.Net 下面，用来使用户通过 HTTP 协议和服务器交互。 <br /><br />HttpWebRequest 对 HTTP 协议进行了完整的封装，对 HTTP 协议中的 Header, Content, Cookie 都做了属性和方法的支持，很容易就能编写出一个模拟浏览器自动登录的程序。 <br /><br />程序使用 HTTP 协议和服务器交互主要是进行数据的提交，通常数据的提交是通过 GET 和 POST 两种方式来完成，下面对这两种方式进行一下说明： <br /><br />1. GET 
方式。 GET 方式通过在网络地址附加参数来完成数据的提交，比如在地址 http://www.google.com/webhp?hl=zh-
CN 中，前面部分 http://www.google.com/webhp 表示数据提交的网址，后面部分 hl=zh-CN 表示附加的参数，其中
 hl 表示一个键(key)， zh-CN 表示这个键对应的值(value)。程序代码如下： <br /><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">HttpWebRequest req </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> (HttpWebRequest) HttpWebRequest.Create( </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">http://www.google.com/webhp?hl=zh-CN</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> );<br />req.Method </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">GET</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br /></span><span style="color: rgb(0, 0, 255);">using</span><span style="color: rgb(0, 0, 0);"> (WebResponse wr </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> req.GetResponse())<br />{<br />   </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">在这里对接收到的页面内容进行处理</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">} <br /></span></div><br />2. POST 方式。 POST 方式通过在页面内容中填写参数的方法来完成数据的提交，参数的格式和 GET 方式一样，是类似于 hl=zh-CN&amp;newwindow=1 这样的结构。程序代码如下： <br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">string</span><span style="color: rgb(0, 0, 0);"> param </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">hl=zh-CN&amp;newwindow=1</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br /></span><span style="color: rgb(0, 0, 255);">byte</span><span style="color: rgb(0, 0, 0);">[] bs </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> Encoding.ASCII.GetBytes(param);<br /><br />HttpWebRequest req </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> (HttpWebRequest) HttpWebRequest.Create( </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">http://www.google.com/intl/zh-CN/</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> );<br />req.Method </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">POST</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />req.ContentType </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">application/x-www-form-urlencoded</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />req.ContentLength </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> bs.Length;<br /><br /></span><span style="color: rgb(0, 0, 255);">using</span><span style="color: rgb(0, 0, 0);"> (Stream reqStream </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> req.GetRequestStream())<br />{<br />   reqStream.Write(bs, </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">, bs.Length);<br />}<br /></span><span style="color: rgb(0, 0, 255);">using</span><span style="color: rgb(0, 0, 0);"> (WebResponse wr </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> req.GetResponse())<br />{<br />   </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">在这里对接收到的页面内容进行处理</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">} </span></div><br /><br />在上面的代码中，我们访问了 www.google.com 的网址，分别以 GET 和 POST 方式提交了数据，并接收了返回的页面内容。然而，如果提交的参数中含有中文，那么这样的处理是不够的，需要对其进行编码，让对方网站能够识别。 <br /><br />3. 使用 GET 方式提交中文数据。 GET 方式通过在网络地址中附加参数来完成数据提交，对于中文的编码，常用的有 gb2312 和 utf8 两种，用 gb2312 方式编码访问的程序代码如下： <br /><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">Encoding myEncoding </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> Encoding.GetEncoding(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">gb2312</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br /></span><span style="color: rgb(0, 0, 255);">string</span><span style="color: rgb(0, 0, 0);"> address  </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">http://www.baidu.com/s?</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> HttpUtility.UrlEncode(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">参数一</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, myEncoding) </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">  </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> HttpUtility.UrlEncode(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">值一</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, myEncoding);<br />HttpWebRequest req </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> (HttpWebRequest)HttpWebRequest.Create(address);<br />req.Method </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">GET</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br /></span><span style="color: rgb(0, 0, 255);">using</span><span style="color: rgb(0, 0, 0);"> (WebResponse wr </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> req.GetResponse())<br />{<br />   </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">在这里对接收到的页面内容进行处理</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">} </span></div><br /><br />在
上面的程序代码中，我们以 GET 方式访问了网址 http://www.baidu.com/s ，传递了参数“参数一=值一”，由于无法告知对方提
交数据的编码类型，所以编码方式要以对方的网站为标准。常见的网站中， www.baidu.com （百度）的编码方式是 gb2312,
 www.google.com （谷歌）的编码方式是 utf8。 <br /><br />4. 使用 POST 方式提交中文数据。 POST 方式通过在页面内容中填写参数的方法来完成数据的提交，由于提交的参数中可以说明使用的编码方式，所以理论上能获得更大的兼容性。用 gb2312 方式编码访问的程序代码如下： <br /><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">Encoding myEncoding </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> Encoding.GetEncoding(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">gb2312</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br /></span><span style="color: rgb(0, 0, 255);">string</span><span style="color: rgb(0, 0, 0);"> param  </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> HttpUtility.UrlEncode(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">参数一</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, myEncoding) </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> HttpUtility.UrlEncode (</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">值一</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, myEncoding) </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> HttpUtility.UrlEncode(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">参数二</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, myEncoding)  </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> HttpUtility.UrlEncode(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">值二</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, myEncoding);<br /><br /></span><span style="color: rgb(0, 0, 255);">byte</span><span style="color: rgb(0, 0, 0);">[] postBytes </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> Encoding.ASCII.GetBytes(param);<br /><br />HttpWebRequest req </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> (HttpWebRequest) HttpWebRequest.Create( </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">http://www.baidu.com/s</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> );<br />req.Method </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">POST</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />req.ContentType </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">application/x-www-form-urlencoded;charset=gb2312</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />req.ContentLength </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> postBytes.Length;<br /><br /></span><span style="color: rgb(0, 0, 255);">using</span><span style="color: rgb(0, 0, 0);"> (Stream reqStream </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> req.GetRequestStream())<br />{<br />   reqStream.Write(</span><span style="color: rgb(0, 0, 0);">postBytes </span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(0, 0, 0);">postBytes </span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);">.Length);<br />}<br /></span><span style="color: rgb(0, 0, 255);">using</span><span style="color: rgb(0, 0, 0);"> (WebResponse wr </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> req.GetResponse())<br />{<br />   </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">在这里对接收到的页面内容进行处理</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">} </span></div><br /><br />从上面的代码可以看出， POST 中文数据的时候，先使用 UrlEncode 方法将中文字符转换为编码后的 ASCII 码，然后提交到服务器，提交的时候可以说明编码的方式，用来使对方服务器能够正确的解析。 <br /><br />以
上列出了客户端程序使用 HTTP 协议与服务器交互的情况，常用的是 GET 和 POST 方式。现在流行的 WebService 也是通过
 HTTP 协议来交互的，使用的是 POST 方法。与以上稍有所不同的是， WebService 提交的数据内容和接收到的数据内容都是使用了
 XML 方式编码。所以， HttpWebRequest 也可以使用在调用 WebService 的情况下。<img src ="http://www.blogjava.net/killme2008/aggbug/105023.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-03-20 16:32 <a href="http://www.blogjava.net/killme2008/archive/2007/03/20/105023.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>创建型模式摘记</title><link>http://www.blogjava.net/killme2008/archive/2007/03/17/104485.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Sat, 17 Mar 2007 09:01:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2007/03/17/104485.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/104485.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2007/03/17/104485.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/104485.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/104485.html</trackback:ping><description><![CDATA[    系统的演化应当依赖于组合，而不是继承；这就提出了将类的实例化委托给一个对象的要求，因此创建型模式将变的越来越重要。<br /><div style="text-indent: 21pt;">创建型模式属于对象创建模型。所谓对象创建模型就是说将实例化的工作委托给另一个对象来做。与之相对应的是类创建模型，这是一种通过继承改变被实例化的类。</div><div><span>       </span>创建型模式有两个重要的特点：</div><div style="margin-left: 39pt; text-indent: -18pt;"><span>1） </span>客户不知道创建的具体类是什么（除非看源代码）</div><div style="margin-left: 39pt; text-indent: -18pt;"><span>2） </span>隐藏了类的实例是如何被创建和放在一起的</div><br />一。抽象工厂模式<br />1.意图：提供一个创建<b>一系列</b>相关或相互依赖对象的接口，而无需指定它们的具体的类。<br />2.适用场景：<br />1)一个系统要独立于它的产品的创建、组合和表示时<br />2）一个系统要由多个产品系列中的一个来配置时<br />3）当你要强调一系列相关的产品对象的设计以便进行联合使用时<br />4）当你提供一个产品类库，而只想显示它们的接口而不是实现时<br /><br />3.UML图——结构<br /><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/sheismylife/07cbd5dfdbdd4027a1ed513e503b1d6f.png" /><br />4.效果：<br />1）分离了具体的类，通过抽象接口将客户与具体的类分离<br />2）易于交换产品系列<br />3）有利于产品的一致性<br />4）难以支持新种类的产品，比如我们现在有一个ProductC产品，我们需要增加类AbstractProductC，增加AbstractFactory::
CreanteProductC方法，并且两个产品系列的实际创建者ConCreateFactory1、ConCreateFactor2都要实现该方
法。<div>可以通过给方法加参数的方式来指明创建的是什么产品，这样客户代码就无需改变，只要传递不同的参数。AbstractFactory类只需要提供一个CreateProduct(const string&amp; name)方法即可。<br /><br />5.代码实现，以《深入浅出设计模式(java C#)》的动物工厂为例：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">using</span><span style="color: rgb(0, 0, 0);"> System;<br /></span><span style="color: rgb(0, 0, 255);">namespace</span><span style="color: rgb(0, 0, 0);"> AnimalWorld<br />{<br />    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> 抽象大陆工厂</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">abstract</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> ContinentFactory<br />    {<br />        </span><span style="color: rgb(0, 0, 255);">abstract</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> Herbivore CreateHerbivore();<br />        </span><span style="color: rgb(0, 0, 255);">abstract</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> Carnivore CreateCarnivore();<br />    }<br />    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">非洲大陆,有角马，狮子</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> AfricaFactory : ContinentFactory<br />    {<br />        </span><span style="color: rgb(0, 0, 255);">override</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> Herbivore CreateHerbivore()<br />        {<br />            </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Wildebeest();<br />        }<br />        </span><span style="color: rgb(0, 0, 255);">override</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> Carnivore CreateCarnivore()<br />        {<br />            </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Lion();<br />        }<br />    }<br />    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> 美洲大陆,有狼,野牛</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> AmericaFactory : ContinentFactory<br />    {<br />        </span><span style="color: rgb(0, 0, 255);">override</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> Herbivore CreateHerbivore()<br />        {<br />            </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Bison();<br />        }<br />        </span><span style="color: rgb(0, 0, 255);">override</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> Carnivore CreateCarnivore()<br />        {<br />            </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Wolf();<br />        }<br />    }<br />    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">食草动物"</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">abstract</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> Herbivore<br />    {<br />    }<br />    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">肉食动物"</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">abstract</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> Carnivore<br />    {<br />        </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">猎食食草动物的方法</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">abstract</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> Eat( Herbivore h );<br />    }<br />    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">角马</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> Wildebeest : Herbivore<br />    {<br />    }<br />    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">狮子"</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> Lion : Carnivore<br />    {<br />        </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">重载猎食食草动物的方法</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">override</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> Eat( Herbivore h )<br />        {<br />            Console.WriteLine( </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> eats </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> h );<br />        }<br />    }<br />    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">野牛</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> Bison : Herbivore<br />    {<br />    }<br />    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">狼</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> Wolf : Carnivore<br />    {<br />        </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">重载猎食食草动物的方法</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">override</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> Eat( Herbivore h )<br />        {<br />            Console.WriteLine( </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> eats </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> h );<br />        }<br />    }<br />    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">动物世界类</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> AnimalWorld<br />    {<br />        </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> Herbivore herbivore;<br />        </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> Carnivore carnivore;<br />        </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> 创建两种动物分类</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> AnimalWorld( ContinentFactory factory )<br />        {<br />            carnivore </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> factory.CreateCarnivore();<br />            herbivore </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> factory.CreateHerbivore();<br />        }<br />        </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">运行食物链</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> RunFoodChain()<br />        {<br />            </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">肉食动物猎食食草动物</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">            carnivore.Eat( herbivore );<br />        }<br />    }<br />    </span><span style="color: rgb(128, 128, 128);">///</span><span style="color: rgb(0, 128, 0);"> </span><span style="color: rgb(128, 128, 128);">&lt;summary&gt;</span><span style="color: rgb(0, 128, 0);"><br />    </span><span style="color: rgb(128, 128, 128);">///</span><span style="color: rgb(0, 128, 0);"> 抽象工厂模式客户应用测试<br />    </span><span style="color: rgb(128, 128, 128);">///</span><span style="color: rgb(0, 128, 0);"> </span><span style="color: rgb(128, 128, 128);">&lt;/summary&gt;</span><span style="color: rgb(128, 128, 128);"><br /></span><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> GameApp<br />    {<br />        [STAThread]<br />        </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> Main(</span><span style="color: rgb(0, 0, 255);">string</span><span style="color: rgb(0, 0, 0);">[] args)<br />        {<br />            </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">创造并运行非洲动物世界</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">            ContinentFactory africa </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> AfricaFactory();<br />            AnimalWorld world </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> AnimalWorld( africa );<br />            world.RunFoodChain();<br />            </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">创造并运行美洲动物世界</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">            ContinentFactory america </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> AmericaFactory();<br />            world </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> AnimalWorld( america );<br />            world.RunFoodChain();<br />            Console.Read();<br />        }<br /><br />    }<br />}<br /></span></div><br />二。Builder模式<br />1.意图：将一个<b>复杂对象</b>的构建与它的表示相分离，使得同样的构建过程可以创建不同的表示（或者说产品）<br /><br />2.适用场景：<br />1）当创建复杂对象的算法应该独立于改对象的组成部分以及它们的装配方式时<br />2）当构造过程必须允许被构造的对象有不同的表示时<br /><br />3.UML图——结构<br /><br /><img src="file:///C:/DOCUME%7E1/Admin/LOCALS%7E1/Temp/moz-screenshot-2.jpg" alt="" /><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/sheismylife/c9bff79b4fbd48859316f43e1b61a265.png" /><br /><img src="file:///C:/DOCUME%7E1/Admin/LOCALS%7E1/Temp/moz-screenshot.jpg" alt="" /><img src="file:///C:/DOCUME%7E1/Admin/LOCALS%7E1/Temp/moz-screenshot-1.jpg" alt="" />Director接受一个Builder子类对象，完成创建过程，并通知Builder对象返回以及构造好的产品。<br /><br />4.效果：<br />1）可以使你改变一个对象的内部表示<br />2）构造代码和表示代码分开<br />3）可以对构造过程进行更精细的控制<br /><br />5。实现：以一个车辆建造过程为例（C#)<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">using</span><span style="color: rgb(0, 0, 0);"> System;<br /><br /></span><span style="color: rgb(0, 0, 255);">namespace</span><span style="color: rgb(0, 0, 0);"> CarShop<br />{<br />    </span><span style="color: rgb(0, 0, 255);">using</span><span style="color: rgb(0, 0, 0);"> System;<br />    </span><span style="color: rgb(0, 0, 255);">using</span><span style="color: rgb(0, 0, 0);"> System.Collections;<br />    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">指挥者,Director</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> Shop{<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> Construct( VehicleBuilder vehicleBuilder ){<br />            vehicleBuilder.BuildFrame();<br />            vehicleBuilder.BuildEngine();<br />            vehicleBuilder.BuildWheels();<br />            vehicleBuilder.BuildDoors();<br />        }<br />    }<br />    </span><span style="color: rgb(0, 128, 0);">/*</span><span style="color: rgb(0, 128, 0);"> "Builder 建造者",Builder<br />    抽象建造者具有四种方法<br />    装配框架<br />    装配发动机<br />    装配轮子<br />    装配车门<br />    </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">abstract</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> VehicleBuilder<br />    {<br />        </span><span style="color: rgb(0, 0, 255);">protected</span><span style="color: rgb(0, 0, 0);"> Vehicle vehicle;<br />        </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">返回建造完成的车辆</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> Vehicle Vehicle{<br />            </span><span style="color: rgb(0, 0, 255);">get</span><span style="color: rgb(0, 0, 0);">{ </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> vehicle; }<br />        }<br />        </span><span style="color: rgb(0, 0, 255);">abstract</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> BuildFrame();<br />        </span><span style="color: rgb(0, 0, 255);">abstract</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> BuildEngine();<br />        </span><span style="color: rgb(0, 0, 255);">abstract</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> BuildWheels();<br />        </span><span style="color: rgb(0, 0, 255);">abstract</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> BuildDoors();<br />    }<br />    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">具体建造者-摩托车车间</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> MotorCycleBuilder : VehicleBuilder<br />    {<br />        </span><span style="color: rgb(0, 0, 255);">override</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> BuildFrame(){<br />            vehicle </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Vehicle( </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">摩托车</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> );<br />            vehicle[ </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">frame</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> ] </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">MotorCycle Frame</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />        }<br /><br />        </span><span style="color: rgb(0, 0, 255);">override</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> BuildEngine(){<br />            vehicle[ </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">engine</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> ] </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">500 cc</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />        }<br /><br />        </span><span style="color: rgb(0, 0, 255);">override</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> BuildWheels(){<br />            vehicle[ </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">wheels</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> ] </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />        }<br /><br />        </span><span style="color: rgb(0, 0, 255);">override</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> BuildDoors(){<br />            vehicle[ </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">doors</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> ] </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />        }<br />    }<br />    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">具体建造者-轿车车间</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> CarBuilder : VehicleBuilder<br />    {<br />        </span><span style="color: rgb(0, 0, 255);">override</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> BuildFrame(){<br />            vehicle </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Vehicle( </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">轿车</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> );<br />            vehicle[ </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">frame</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> ] </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Car Frame</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />        }<br />        </span><span style="color: rgb(0, 0, 255);">override</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> BuildEngine(){<br />            vehicle[ </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">engine</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> ] </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">2500 cc</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />        }<br />        </span><span style="color: rgb(0, 0, 255);">override</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> BuildWheels(){<br />            vehicle[ </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">wheels</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> ] </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />        }<br />        </span><span style="color: rgb(0, 0, 255);">override</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> BuildDoors(){<br />            vehicle[ </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">doors</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> ] </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />        }<br />    }<br />    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> 具体建造者-单脚滑行车车间</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> ScooterBuilder : VehicleBuilder<br />    {<br />        </span><span style="color: rgb(0, 0, 255);">override</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> BuildFrame(){<br />            vehicle </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Vehicle( </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">单脚滑行车</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> );<br />            vehicle[ </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">frame</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> ] </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Scooter Frame</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />        }<br /><br />        </span><span style="color: rgb(0, 0, 255);">override</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> BuildEngine(){<br />            vehicle[ </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">engine</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> ] </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">none</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />        }<br /><br />        </span><span style="color: rgb(0, 0, 255);">override</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> BuildWheels(){<br />            vehicle[ </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">wheels</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> ] </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />        }<br /><br />        </span><span style="color: rgb(0, 0, 255);">override</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> BuildDoors(){<br />            vehicle[ </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">doors</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> ] </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />        }<br />    }<br />    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">车辆产品类</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> Vehicle<br />    {<br />        </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">string</span><span style="color: rgb(0, 0, 0);"> type;<br />        </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> Hashtable parts </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Hashtable();<br />        </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">筑构函数,决定类型</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> Vehicle( </span><span style="color: rgb(0, 0, 255);">string</span><span style="color: rgb(0, 0, 0);"> type ){<br />            </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.type </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> type;<br />        }<br />        </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">索引</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">object</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">[ </span><span style="color: rgb(0, 0, 255);">string</span><span style="color: rgb(0, 0, 0);"> key ]{<br />            </span><span style="color: rgb(0, 0, 255);">get</span><span style="color: rgb(0, 0, 0);">{ </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> parts[ key ]; }<br />            </span><span style="color: rgb(0, 0, 255);">set</span><span style="color: rgb(0, 0, 0);">{ parts[ key ] </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> value; }<br />        }<br />        </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">显示方法</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> Show()<br />        {<br />            Console.WriteLine( </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">\n---------------------------</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />            Console.WriteLine( </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">车辆类类型: </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> type );<br />            Console.WriteLine( </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> 框架 : </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> parts[ </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">frame</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> ] );<br />            Console.WriteLine( </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> 发动机 : </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> parts[ </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">engine</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">] );<br />            Console.WriteLine( </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> #轮子数: </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> parts[ </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">wheels</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">] );<br />            Console.WriteLine( </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> #车门数 : </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> parts[ </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">doors</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> ] );<br />        }<br />    }<br />    </span><span style="color: rgb(128, 128, 128);">///</span><span style="color: rgb(0, 128, 0);"> </span><span style="color: rgb(128, 128, 128);">&lt;summary&gt;</span><span style="color: rgb(0, 128, 0);"><br />    </span><span style="color: rgb(128, 128, 128);">///</span><span style="color: rgb(0, 128, 0);"> 建造者模式应用测试<br />    </span><span style="color: rgb(128, 128, 128);">///</span><span style="color: rgb(0, 128, 0);"> </span><span style="color: rgb(128, 128, 128);">&lt;/summary&gt;</span><span style="color: rgb(128, 128, 128);"><br /></span><span style="color: rgb(0, 0, 0);">     </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> CarShop<br />    {<br />        [STAThread]<br />        </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> Main(</span><span style="color: rgb(0, 0, 255);">string</span><span style="color: rgb(0, 0, 0);">[] args)<br />        {<br />            </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> 创造车间及车辆建造者</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">            Shop shop </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Shop();<br />            VehicleBuilder b1 </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> ScooterBuilder();<br />            VehicleBuilder b2 </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> CarBuilder();<br />            VehicleBuilder b3 </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> MotorCycleBuilder();<br />            </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> 筑构并显示车辆</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">            shop.Construct( b1 );<br />            b1.Vehicle.Show();<br />            shop.Construct( b2 );<br />            b2.Vehicle.Show();<br />            shop.Construct( b3 );<br />            b3.Vehicle.Show();<br />            Console.Read();<br /><br />        }<br />    }<br />}<br /></span></div><br /><br /><strong></strong>三。Factory Method模式<br />1.意图：定义一个用于创建对象的接口，让子类决定实例化具体的哪一个类。<br />2.适用场景：<br />1）当一个类不知道它所必须创建的对象的类的时候，让子类来决定<br />2）当一个类希望由它的子类来决定它所创建的对象的时候<br /><br />3。UML图——结构：<br /><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/sheismylife/638ccee7f75e4632a78bdda0a084690b.png" /><br />4.效果：<br />1）为子类提供回调函数<br />2）连接平行的类层次<br /><div style="margin-left: 18pt; text-indent: -18pt;"><span>3） </span>创建函数可以接收参数来决定创建什么产品</div><div>4）Factory Method容易导致创建过多的Creator的子类以对应不同的产品，这个方法可以通过模板技术来解决<br /><br />6.实现，手机工厂，产品可能是Nokia，也可能是Motorola<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">using</span><span style="color: rgb(0, 0, 0);"> System;<br /></span><span style="color: rgb(0, 0, 255);">using</span><span style="color: rgb(0, 0, 0);"> System.Collections.Generic;<br /></span><span style="color: rgb(0, 0, 255);">using</span><span style="color: rgb(0, 0, 0);"> System.Text;<br /><br /></span><span style="color: rgb(0, 0, 255);">namespace</span><span style="color: rgb(0, 0, 0);"> HandPhone<br />{<br />    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">手机接口</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">interface</span><span style="color: rgb(0, 0, 0);"> Mobile<br />    {<br />         </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> call();<br />    }<br /><br />    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">手机工厂接口</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">interface</span><span style="color: rgb(0, 0, 0);"> MobileFactory<br />    {<br />          Mobile createMobile();<br />    }<br /><br />    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">Nokia</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> Nokia:Mobile<br />    {<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> call()<br />        {<br />            Console.WriteLine(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">This is a {0} phone</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.GetType().Name);<br />        }<br />    }<br /><br />    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">Motorola</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> Motorola : Mobile<br />    {<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> call()<br />        {<br />            Console.WriteLine(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">This is a {0} phone</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.GetType().Name);<br />        }<br />    }<br /><br />    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">Motorola工厂</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> MotorolaFactory : MobileFactory<br />    {<br />         </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> Mobile createMobile()<br />        {<br />            </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Motorola();<br />        }<br />    }<br /><br />    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">Nokia工厂</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> NokiaFactroy : MobileFactory<br />    {<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> Mobile createMobile()<br />        {<br />            </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Nokia();<br />        }<br />    }<br /><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> Client<br />    {<br />        </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> Main(String []args)<br />        {<br />            MobileFactory factory</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">;<br />            Mobile mobile</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">;<br /><br />            factory</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> NokiaFactroy();<br />            mobile</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">factory.createMobile();<br />            mobile.call();<br /><br />            factory</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> MotorolaFactory();<br />            mobile</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">factory.createMobile();<br />            mobile.call();<br />            <br />        }<br />    }<br /><br />}<br /></span></div><br />四。Prototype模式<br /><br />1.意图：通过原型实例指定创建对象的种类，并通过拷贝这些原型来创建新的对象<br /><br />2.适用场景：<br />1）要实例化的类是在运行时刻指定的，比如动态装载<br />2）为了避免创建一个与产品层次平行的工厂类层次<br />3）当一个类的实例只能有几个不同的状态组合中的一种时，建立相应数目的原型并克隆它们可能比每次用合适的状态手工化该类更方便一些。<br /><br />3.UML图——结构：<br /><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/sheismylife/9767a24f6e804101a9c0ae875105f950.png" /><br /><br /></div><br />4.效果：<br />1）运行时动态增加或者删除产品<br />2）减少子类的构造数目<br />3）用类动态配置应用<br />4）动态指定新的对象，通过改变结构或者值<br />5）缺陷在于每一个Prototype的子类都需要实现clone操作<br /><br />5。实现,无论java还是C#都从语言层次内置了对prototype模式的支持。具体不再详述。<br /><br />五。singleton模式<br />1。意图：保证一个类仅有一个实例，并提供一个访问它的全局访问点<br /><br />2.适用场景：<br />1）当需要类只有一个实例，并且客户只能通过一个全局点去访问它<br />2）当这个唯一实例应该是通过子类化可扩展的，并且客户应该无需更改代码就能使用扩展的实例<br /><br />3.UML图：略<br /><br />4.效果：<br />1）对唯一实例的受控访问<br />2）缩小命名空间<br />3）允许对操作和表示的细化<br />4）允许可变数目的实例<br /><br />5实现，关于singleton在java多线程环境下的实现，请见讨论《<a id="viewpost1_TitleUrl" class="postTitle2" href="http://www.cnblogs.com/AllenYoung/archive/2006/04/14/375144.html">当Singleton遇到multi-threading</a>》，C#对singleton多线程环境下的能够正确实现Double-checked模式：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">sealed</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> Singleton<br />{<br />    </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">volatile</span><span style="color: rgb(0, 0, 0);"> Singleton instance;<br />    </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">object</span><span style="color: rgb(0, 0, 0);"> syncRoot </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Object();<br /><br />    </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> Singleton() {}<br /><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> Singleton Instance<br />    {<br />        </span><span style="color: rgb(0, 0, 255);">get</span><span style="color: rgb(0, 0, 0);"> <br />        {<br />            </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (instance </span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">) <br />            {<br />                </span><span style="color: rgb(0, 0, 255);">lock</span><span style="color: rgb(0, 0, 0);"> (syncRoot) <br />                {<br />                    </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (instance </span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">) <br />                        instance </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Singleton();<br />                }<br />            }<br /><br />            </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> instance;<br />        }<br />    }<br />}</span></div><br /><br />本文仅作速查记忆用，摘记于《设计模式——可复用面向对象软件基础》和《深入浅出设计模式（java C#)》两书<br /><br /></div><img src ="http://www.blogjava.net/killme2008/aggbug/104485.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-03-17 17:01 <a href="http://www.blogjava.net/killme2008/archive/2007/03/17/104485.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>图文并茂——使用xfire编写webservice,并通过C#调用</title><link>http://www.blogjava.net/killme2008/archive/2007/03/07/102450.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Wed, 07 Mar 2007 10:13:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2007/03/07/102450.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/102450.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2007/03/07/102450.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/102450.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/102450.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 使用MyEclipse编写web service，并通过java与C#调用&nbsp;&nbsp;<a href='http://www.blogjava.net/killme2008/archive/2007/03/07/102450.html'>阅读全文</a><img src ="http://www.blogjava.net/killme2008/aggbug/102450.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-03-07 18:13 <a href="http://www.blogjava.net/killme2008/archive/2007/03/07/102450.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C#的using语句</title><link>http://www.blogjava.net/killme2008/archive/2007/02/12/99470.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Mon, 12 Feb 2007 07:53:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2007/02/12/99470.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/99470.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2007/02/12/99470.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/99470.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/99470.html</trackback:ping><description><![CDATA[
		<span style="font-size: 12px;">C#的using语句设计的蛮贴心，比java的import有趣一点。转一篇文章.<br /><br />C#中的using除了作为命名空间指示符(using System)，类型的别名指示符(using Dos=System.Console)，还有资源管理的语句功能：<br />
using (R r1 = new R ()) {<br />
   r1.F();<br />
}<br />
在C#中被翻译为：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">R r1 </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> R();<br /></span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);"> {<br />   r1.F();<br />}<br /></span><span style="color: rgb(0, 0, 255);">finally</span><span style="color: rgb(0, 0, 0);"> {<br />   </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (r1 </span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">) ((IDisposable)r1).Dispose();<br />}<br /></span></div><br />
r1当然要支持Dispose()方法了<br /><br />再来一个例子：<br /></span>
		<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;">
				<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
				<span style="color: rgb(0, 0, 0);"># MyObject.cs<br /><br /></span>
				<span style="color: rgb(0, 0, 255);">using</span>
				<span style="color: rgb(0, 0, 0);"> System;<br /><br /> <br /><br /></span>
				<span style="color: rgb(0, 0, 255);">namespace</span>
				<span style="color: rgb(0, 0, 0);"> MyProjects<br /><br />{<br /><br />    </span>
				<span style="color: rgb(0, 0, 255);">public</span>
				<span style="color: rgb(0, 0, 0);"> </span>
				<span style="color: rgb(0, 0, 255);">class</span>
				<span style="color: rgb(0, 0, 0);"> MyObject : IDisposable<br /><br />    {<br /><br />        </span>
				<span style="color: rgb(0, 0, 255);">public</span>
				<span style="color: rgb(0, 0, 0);"> MyObject()<br /><br />        {<br /><br />        }<br /><br /> <br /><br />        </span>
				<span style="color: rgb(0, 0, 255);">public</span>
				<span style="color: rgb(0, 0, 0);"> </span>
				<span style="color: rgb(0, 0, 255);">void</span>
				<span style="color: rgb(0, 0, 0);"> Dispose ( )<br /><br />        {<br /><br />            </span>
				<span style="color: rgb(0, 128, 0);">//</span>
				<span style="color: rgb(0, 128, 0);"> Dispose</span>
				<span style="color: rgb(0, 128, 0);">
						<br />
				</span>
				<span style="color: rgb(0, 0, 0);">
						<br />            Console.WriteLine ( </span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">Disposed</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);"> ) ;<br /><br />            </span>
				<span style="color: rgb(0, 128, 0);">//</span>
				<span style="color: rgb(0, 128, 0);"> <img src="http://www.blogjava.net/images/dot.gif" /></span>
				<span style="color: rgb(0, 128, 0);">
						<br />
				</span>
				<span style="color: rgb(0, 0, 0);">
						<br />        }<br /><br />    }<br /><br />}<br /><br /> <br /><br /># Class1.cs<br /><br /></span>
				<span style="color: rgb(0, 0, 255);">using</span>
				<span style="color: rgb(0, 0, 0);"> System;<br /><br /> <br /><br /></span>
				<span style="color: rgb(0, 0, 255);">namespace</span>
				<span style="color: rgb(0, 0, 0);"> MyProjects<br /><br />{<br /><br />     </span>
				<span style="color: rgb(0, 0, 255);">public</span>
				<span style="color: rgb(0, 0, 0);"> </span>
				<span style="color: rgb(0, 0, 255);">class</span>
				<span style="color: rgb(0, 0, 0);"> Class1<br /><br />     {<br /><br />         </span>
				<span style="color: rgb(0, 0, 255);">public</span>
				<span style="color: rgb(0, 0, 0);"> Class1()<br /><br />         {<br /><br />         }<br /><br /> <br /><br />         </span>
				<span style="color: rgb(0, 0, 255);">public</span>
				<span style="color: rgb(0, 0, 0);"> </span>
				<span style="color: rgb(0, 0, 255);">static</span>
				<span style="color: rgb(0, 0, 0);"> </span>
				<span style="color: rgb(0, 0, 255);">void</span>
				<span style="color: rgb(0, 0, 0);"> Main ( </span>
				<span style="color: rgb(0, 0, 255);">string</span>
				<span style="color: rgb(0, 0, 0);">[] args )<br /><br />         {<br /><br />              </span>
				<span style="color: rgb(0, 0, 255);">using</span>
				<span style="color: rgb(0, 0, 0);"> ( MyObject myObject </span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);"> </span>
				<span style="color: rgb(0, 0, 255);">new</span>
				<span style="color: rgb(0, 0, 0);"> MyObject ( ) )<br /><br />              {<br /><br />                   Console.WriteLine ( </span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);">quit</span>
				<span style="color: rgb(0, 0, 0);">"</span>
				<span style="color: rgb(0, 0, 0);"> ) ;<br /><br />              }<br /><br />         }<br /><br />     }<br /><br />}<br /><br /> <br /></span>
		</div>
		<br />
		<span style="font-size: 9pt; font-family: 新宋体;">使用<span lang="EN-US">using</span>会自动调用<span lang="EN-US">MyObject</span>的<span lang="EN-US">Dispose</span>方法<span lang="EN-US">.</span></span>
		<br />
<img src ="http://www.blogjava.net/killme2008/aggbug/99470.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-02-12 15:53 <a href="http://www.blogjava.net/killme2008/archive/2007/02/12/99470.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C#的类型系统</title><link>http://www.blogjava.net/killme2008/archive/2007/02/12/99418.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Mon, 12 Feb 2007 04:30:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2007/02/12/99418.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/99418.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2007/02/12/99418.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/99418.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/99418.html</trackback:ping><description><![CDATA[一.C#的统一类型系统<br />1.C#的类型系统是统一的，java的类型系统分为：基本类型（原生类型）和类类型，而C#的所有类型直接或间接地从object类类型派生而来，从类型系统上来看比java更OO。<br />2.C#的类型分为三类：<br />（1）值类型，<span style="font-size: 11pt; font-family: 宋体;">一个值类型或是结构类型</span><span style="font-size: 11pt; font-family: 宋体;">，</span><span style="font-size: 11pt; font-family: 宋体;">或是枚举类型<br />（2）引用类型<br />（3）指针类型<br />值类型与</span><span style="font-size: 11pt; font-family: 宋体;">引用类型的不同在于：</span><span style="font-size: 11pt; font-family: 宋体;">值类型的变量直接包含其数据</span><span style="font-size: 11pt; font-family: 宋体;">，</span><span style="font-size: 11pt; font-family: 宋体;">而引用类型的变量存储对其数据的引用</span><span style="font-size: 11pt; font-family: 宋体;"></span><span class="Term"><span style="font-size: 11pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US">(reference)</span></span><span style="font-size: 11pt; font-family: 宋体;">，</span><span style="font-size: 11pt; font-family: 宋体;">后者称为对象</span><span style="font-size: 11pt; font-family: 宋体;"></span><span class="Term"><span style="font-size: 11pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US">(object)</span></span><span style="font-size: 11pt; font-family: 宋体;">。对于引用类型</span><span style="font-size: 11pt; font-family: 宋体;">，</span><span style="font-size: 11pt; font-family: 宋体;">两个变量可能引用同一个对象</span><span style="font-size: 11pt; font-family: 宋体;">，</span><span style="font-size: 11pt; font-family: 宋体;">因此对一个变量的操作可能影响另一个变量所引用的对象。对于值类型，每个变量都有自己的数据副本，对一个变量的操作不可能影响另一个变量。<br />二。值类型<br /></span><span style="font-size: 11pt; font-family: 宋体;">1.所有值类型从类</span><span style="font-size: 11pt; font-family: 宋体;"></span><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">System.ValueType</span></span><span style="font-size: 11pt; font-family: 宋体;" lang="EN-US"></span><span style="font-size: 11pt; font-family: 宋体;">隐式继承</span><span style="font-size: 11pt; font-family: 宋体;">，</span><span style="font-size: 11pt; font-family: 宋体;">后者又从类</span><span style="font-size: 11pt; font-family: 宋体;"></span><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">object</span></span><span style="font-size: 11pt; font-family: 宋体;" lang="EN-US"></span><span style="font-size: 11pt; font-family: 宋体;">继承。任何类型都不可能从值类型派生。<br /><br />2.</span><span style="font-family: 宋体;">所有值类型都隐式声明一个称为默认构造函数</span><span style="font-family: 宋体;"></span><span class="Term"><span lang="EN-US">(default constructor)</span></span><span style="font-family: 宋体;" lang="EN-US"></span><span style="font-family: 宋体;">的公共无参数实例构造函数。默认构造函数返回一个零初始化实例</span><span style="font-family: 宋体;">，</span><span style="font-family: 宋体;">它就是该值类型的默认值</span><span style="font-family: 宋体;"></span><span class="Term"><span lang="EN-US">(default value)</span></span><span style="font-family: 宋体;">：</span><p class="MsoListBullet" style=""><!--[if !supportLists]--><span style="font-family: Symbol;" lang="EN-US"><span style="">·<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">        
</span></span></span><!--[endif]--><span style="font-family: 宋体;">对于所有</span><span style="font-family: 宋体;"></span><span class="Production"><span lang="EN-US">simple-types</span></span><span style="font-family: 宋体;">，</span><span style="font-family: 宋体;">默认值是将其所有位都置零的位模式所形成的值</span><span style="font-family: 宋体;">：</span></p><p class="MsoListBullet2" style="margin-left: 36pt; text-indent: -18.15pt;"><!--[if !supportLists]--><span style="font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="">o<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">       
</span></span></span><!--[endif]--><span style="font-family: 宋体;">对于</span><span style="font-family: 宋体;"></span><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">sbyte</span></span><span style="font-family: 宋体;">、</span><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">byte</span></span><span style="font-family: 宋体;">、</span><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">short</span></span><span style="font-family: 宋体;">、</span><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">ushort</span></span><span style="font-family: 宋体;">、</span><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">int</span></span><span style="font-family: 宋体;">、</span><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">uint</span></span><span style="font-family: 宋体;">、</span><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">long</span></span><span style="font-family: 宋体;" lang="EN-US"></span><span style="font-family: 宋体;">和</span><span style="font-family: 宋体;"></span><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">ulong</span></span><span style="font-family: 宋体;">，</span><span style="font-family: 宋体;">默认值为</span><span style="font-family: 宋体;"></span><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">0</span></span><span style="font-family: 宋体;">。</span></p><p class="MsoListBullet2" style="margin-left: 36pt; text-indent: -18.15pt;"><!--[if !supportLists]--><span style="font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="">o<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">       
</span></span></span><!--[endif]--><span style="font-family: 宋体;">对于</span><span style="font-family: 宋体;"></span><span class="Codefragment"><span style="font-size: 10pt;">char</span></span><span style="font-family: 宋体;">，</span><span style="font-family: 宋体;">默认值为</span><span style="font-family: 宋体;"></span><span class="Codefragment"><span style="font-size: 10pt;">'\x0000'</span></span><span style="font-family: 宋体;">。</span></p><p class="MsoListBullet2" style="margin-left: 36pt; text-indent: -18.15pt;"><!--[if !supportLists]--><span style="font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="">o<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">       
</span></span></span><!--[endif]--><span style="font-family: 宋体;">对于</span><span style="font-family: 宋体;"></span><span class="Codefragment"><span style="font-size: 10pt;">float</span></span><span style="font-family: 宋体;">，</span><span style="font-family: 宋体;">默认值为</span><span style="font-family: 宋体;"></span><st1:chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="0" unitname="F"><span class="Codefragment"><span style="font-size: 10pt;">0.0f</span></span></st1:chmetcnv><span style="font-family: 宋体;">。</span></p><p class="MsoListBullet2" style="margin-left: 36pt; text-indent: -18.15pt;"><!--[if !supportLists]--><span style="font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="">o<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">       
</span></span></span><!--[endif]--><span style="font-family: 宋体;">对于</span><span style="font-family: 宋体;"></span><span class="Codefragment"><span style="font-size: 10pt;">double</span></span><span style="font-family: 宋体;">，</span><span style="font-family: 宋体;">默认值为</span><span style="font-family: 宋体;"></span><span class="Codefragment"><span style="font-size: 10pt;">0.0d</span></span><span style="font-family: 宋体;">。</span></p><p class="MsoListBullet2" style="margin-left: 36pt; text-indent: -18.15pt;"><!--[if !supportLists]--><span style="font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="">o<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">       
</span></span></span><!--[endif]--><span style="font-family: 宋体;">对于</span><span style="font-family: 宋体;"></span><span class="Codefragment"><span style="font-size: 10pt;">decimal</span></span><span style="font-family: 宋体;">，</span><span style="font-family: 宋体;">默认值为</span><span style="font-family: 宋体;"></span><st1:chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="0" unitname="m"><span class="Codefragment"><span style="font-size: 10pt;">0.0m</span></span></st1:chmetcnv><span style="font-family: 宋体;">。</span></p><p class="MsoListBullet2" style="margin-left: 36pt; text-indent: -18.15pt;"><!--[if !supportLists]--><span style="font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="">o<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">       
</span></span></span><!--[endif]--><span style="font-family: 宋体;">对于</span><span style="font-family: 宋体;"></span><span class="Codefragment"><span style="font-size: 10pt;">bool</span></span><span style="font-family: 宋体;">，</span><span style="font-family: 宋体;">默认值为</span><span style="font-family: 宋体;"></span><span class="Codefragment"><span style="font-size: 10pt;">false</span></span><span style="font-family: 宋体;">。</span></p><p class="MsoListBullet" style=""><!--[if !supportLists]--><span style="font-family: Symbol;" lang="EN-US"><span style="">·<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">        
</span></span></span><!--[endif]--><span style="font-family: 宋体;">对于</span><span style="font-family: 宋体;"></span><span class="Production"><span style="">enum-type</span></span><span style="font-family: 宋体;"></span><span class="Codefragment"><span style="font-size: 10pt;">E</span></span><span style="font-family: 宋体;">，</span><span style="font-family: 宋体;">默认值为</span><span style="font-family: 宋体;"></span><span class="Codefragment"><span style="font-size: 10pt;">0</span></span><span style="font-family: 宋体;">。</span></p><p class="MsoListBullet" style=""><!--[if !supportLists]--><span style="font-family: Symbol;" lang="EN-US"><span style="">·<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">        
</span></span></span><!--[endif]--><span style="font-family: 宋体;">对于</span><span style="font-family: 宋体;"></span><span class="Production"><span style="">struct-type</span></span><span style="font-family: 宋体;">，</span><span style="font-family: 宋体;">默认值是通过将所有值类型字段设置为它们的默认值、将所有引用类型字段设置为</span><span style="font-family: 宋体;"></span><span class="Codefragment"><span style="font-size: 10pt;">null</span></span><span style="font-family: 宋体;"></span><span style="font-family: 宋体;">而产生的值。</span></p>

3.C#中有所谓的简单类型概念（simple type），类似于java的基本类型，但又不同，C#的简单类型本质上都是结构类型（预定义集合的结构类型），所以还是值类型，从<span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">System.ValueType</span></span><span style="font-size: 11pt; font-family: 宋体;" lang="EN-US">继承而来。C#的简单类型包括：<br /></span><table class="MsoNormalTable" style="border: medium none ; margin-left: 12.5pt; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0"><tbody><tr style=""><td style="border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 109.9pt;" valign="top" width="147"><p class="Table"><b><span style="font-family: 宋体;">保留字</span><span lang="EN-US"><o:p></o:p></span></b></p></td><td style="border-style: solid solid solid none; border-color: windowtext windowtext windowtext -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0cm 5.4pt; width: 189pt;" valign="top" width="252"><p class="Table"><b><span style="font-family: 宋体;">化名的类型</span><span lang="EN-US"><o:p></o:p></span></b></p></td></tr><tr style=""><td style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 109.9pt;" valign="top" width="147"><p class="Table"><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">sbyte<o:p></o:p></span></span></p></td><td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 189pt;" valign="top" width="252"><p class="Table"><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">System.SByte<o:p></o:p></span></span></p></td></tr><tr style=""><td style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 109.9pt;" valign="top" width="147"><p class="Table"><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">byte<o:p></o:p></span></span></p></td><td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 189pt;" valign="top" width="252"><p class="Table"><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">System.Byte<o:p></o:p></span></span></p></td></tr><tr style=""><td style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 109.9pt;" valign="top" width="147"><p class="Table"><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">short<o:p></o:p></span></span></p></td><td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 189pt;" valign="top" width="252"><p class="Table"><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">System.Int16<o:p></o:p></span></span></p></td></tr><tr style=""><td style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 109.9pt;" valign="top" width="147"><p class="Table"><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">ushort<o:p></o:p></span></span></p></td><td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 189pt;" valign="top" width="252"><p class="Table"><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">System.UInt16<o:p></o:p></span></span></p></td></tr><tr style=""><td style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 109.9pt;" valign="top" width="147"><p class="Table"><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">int<o:p></o:p></span></span></p></td><td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 189pt;" valign="top" width="252"><p class="Table"><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">System.Int32<o:p></o:p></span></span></p></td></tr><tr style=""><td style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 109.9pt;" valign="top" width="147"><p class="Table"><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">uint<o:p></o:p></span></span></p></td><td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 189pt;" valign="top" width="252"><p class="Table"><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">System.UInt32<o:p></o:p></span></span></p></td></tr><tr style=""><td style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 109.9pt;" valign="top" width="147"><p class="Table"><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">long<o:p></o:p></span></span></p></td><td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 189pt;" valign="top" width="252"><p class="Table"><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">System.Int64<o:p></o:p></span></span></p></td></tr><tr style=""><td style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 109.9pt;" valign="top" width="147"><p class="Table"><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">ulong<o:p></o:p></span></span></p></td><td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 189pt;" valign="top" width="252"><p class="Table"><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">System.UInt64<o:p></o:p></span></span></p></td></tr><tr style=""><td style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 109.9pt;" valign="top" width="147"><p class="Table"><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">char<o:p></o:p></span></span></p></td><td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 189pt;" valign="top" width="252"><p class="Table"><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">System.Char<o:p></o:p></span></span></p></td></tr><tr style=""><td style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 109.9pt;" valign="top" width="147"><p class="Table"><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">float<o:p></o:p></span></span></p></td><td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 189pt;" valign="top" width="252"><p class="Table"><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">System.Single<o:p></o:p></span></span></p></td></tr><tr style=""><td style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 109.9pt;" valign="top" width="147"><p class="Table"><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">double<o:p></o:p></span></span></p></td><td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 189pt;" valign="top" width="252"><p class="Table"><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">System.Double<o:p></o:p></span></span></p></td></tr><tr style=""><td style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 109.9pt;" valign="top" width="147"><p class="Table"><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">bool<o:p></o:p></span></span></p></td><td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 189pt;" valign="top" width="252"><p class="Table"><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">System.Boolean<o:p></o:p></span></span></p></td></tr><tr style=""><td style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 109.9pt;" valign="top" width="147"><p class="Table"><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">decimal<o:p></o:p></span></span></p></td><td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 189pt;" valign="top" width="252"><p class="Table"><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">System.Decimal<o:p></o:p></span></span></p></td></tr></tbody></table>

这些简单类型都是System命名空间中预定义结构类型的别名（ruby的别名实在贴心）<br /><br />4.枚举类型，<span style="font-size: 11pt; font-family: 宋体;">枚举类型是具有命名常量的独特的类型。每个枚举类型都有一个基础类型，该基础类型必须为
</span><span class="Codefragment"><span style="font-size: 10pt;">byte</span></span><span style="font-size: 11pt; font-family: 宋体;">、</span><span class="Codefragment"><span style="font-size: 10pt;">sbyte</span></span><span style="font-size: 11pt; font-family: 宋体;">、</span><span class="Codefragment"><span style="font-size: 10pt;">short</span></span><span style="font-size: 11pt; font-family: 宋体;">、</span><span class="Codefragment"><span style="font-size: 10pt;">ushort</span></span><span style="font-size: 11pt; font-family: 宋体;">、</span><span class="Codefragment"><span style="font-size: 10pt;">int</span></span><span style="font-size: 11pt; font-family: 宋体;">、</span><span class="Codefragment"><span style="font-size: 10pt;">uint</span></span><span style="font-size: 11pt; font-family: 宋体;">、</span><span class="Codefragment"><span style="font-size: 10pt;">long</span></span><span style="font-size: 11pt; font-family: 宋体;"> 或 </span><span class="Codefragment"><span style="font-size: 10pt;">ulong</span></span><span style="font-size: 11pt; font-family: 宋体;">。如果没有为枚举类型中的元素指定基础值，默认是从0开始逐一递增。<br /><br />三。引用类型<br /></span><p class="MsoNormal"><span style="font-family: 宋体;">1.引用类型是类类型、接口类型、数组类型或委托类型。</span></p><p class="MsoNormal"><span style="font-family: 宋体;">2.类类型：包括预定义的类类型和用户通过class关键字的自定义类类型</span></p><p class="MsoNormal"><span style="font-family: 宋体;">3.对象类型：</span></p><p class="MsoNormal"><span class="Codefragment"><span style="font-size: 10pt; letter-spacing: 0.2pt;" lang="EN-US">object</span></span><span style="font-family: 宋体; letter-spacing: 0.2pt;" lang="EN-US"></span><span style="font-family: 宋体; letter-spacing: 0.2pt;">类类型是所有其他类型的最终基类。</span><span style="letter-spacing: 0.2pt;" lang="EN-US">C# </span><span style="font-family: 宋体; letter-spacing: 0.2pt;" lang="EN-US"><span style=""> </span>中的每种类型都是直接或间接从</span><span style="font-family: 宋体; letter-spacing: 0.2pt;"></span><span class="Codefragment"><span style="font-size: 10pt; letter-spacing: 0.2pt;" lang="EN-US">object</span></span><span style="font-family: 宋体; letter-spacing: 0.2pt;" lang="EN-US"></span><span style="font-family: 宋体; letter-spacing: 0.2pt;">类类型派生的。</span><span style="letter-spacing: 0.2pt;" lang="EN-US"><o:p></o:p></span></p><p class="MsoNormal"><span style="font-family: 宋体;">关键字</span><span style="font-family: 宋体;"></span><span class="Codefragment"><span style="font-size: 10pt;">object</span></span><span style="font-family: 宋体;"></span><span style="font-family: 宋体;">只是预定义类</span><span style="font-family: 宋体;"></span><span class="Codefragment"><span style="font-size: 10pt;">System.Object</span></span><span style="font-family: 宋体;"></span><span style="font-family: 宋体;">的别名。</span></p>

4.string类型:<br /><span class="Codefragment"><span style="font-size: 10pt;">string</span></span><span style="font-size: 11pt; font-family: 宋体;"></span><span style="font-size: 11pt; font-family: 宋体;">类型是直接从</span><span style="font-size: 11pt; font-family: 宋体;"></span><span class="Codefragment"><span style="font-size: 10pt;">object</span></span><span style="font-size: 11pt; font-family: 宋体;"></span><span style="font-size: 11pt; font-family: 宋体;">继承的密封类类型。</span><span style="font-size: 11pt; font-family: 宋体;">关键字</span><span style="font-size: 11pt; font-family: 宋体;"></span><span class="Codefragment"><span style="font-size: 10pt;">string</span></span><span style="font-size: 11pt; font-family: 宋体;"></span><span style="font-size: 11pt; font-family: 宋体;">只是预定义类</span><span style="font-size: 11pt; font-family: 宋体;"></span><span class="Codefragment"><span style="font-size: 10pt;">System.String</span></span><span style="font-size: 11pt; font-family: 宋体;"></span><span style="font-size: 11pt; font-family: 宋体;">的别名.<br />5.接口类型：<br />与java中的接口概念基本一致，可以变相实现多重继承。<br /></span><table class="MsoNormalTable" style="border: medium none ; margin-left: 18pt; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0"><tbody><tr style=""><td style="border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 4cm;" valign="top" width="151"><p class="Table"><b><span style="font-family: 宋体;">类类型</span></b><span lang="EN-US"><o:p></o:p></span></p></td><td style="border-style: solid solid solid none; border-color: windowtext windowtext windowtext -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0cm 5.4pt; width: 274.5pt;" valign="top" width="366"><p class="Table"><b><span style="font-family: 宋体;">说明</span></b><span lang="EN-US"><o:p></o:p></span></p></td></tr><tr style=""><td style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 4cm;" valign="top" width="151"><p class="Table"><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">System.Object<o:p></o:p></span></span></p></td><td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 274.5pt;" valign="top" width="366"><p class="Table"><span style="font-family: 宋体;">所有其他类型的最终基类。</span><span style="font-family: 宋体;"></span><span lang="EN-US"><o:p></o:p></span></p></td></tr><tr style=""><td style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 4cm;" valign="top" width="151"><p class="Table"><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">System.String<o:p></o:p></span></span></p></td><td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 274.5pt;" valign="top" width="366"><p class="Table"><span lang="EN-US">C# </span><span style="font-family: 宋体;" lang="EN-US"><span style=""> </span>语言的字符串类型。</span><span style="font-family: 宋体;"></span><span lang="EN-US"><o:p></o:p></span></p></td></tr><tr style=""><td style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 4cm;" valign="top" width="151"><p class="Table"><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">System.ValueType<o:p></o:p></span></span></p></td><td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 274.5pt;" valign="top" width="366"><p class="Table"><span style="font-family: 宋体;">所有值类型的基类。</span><span style="font-family: 宋体;"></span><span lang="EN-US"><o:p></o:p></span></p></td></tr><tr style=""><td style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 4cm;" valign="top" width="151"><p class="Table"><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">System.Enum<o:p></o:p></span></span></p></td><td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 274.5pt;" valign="top" width="366"><p class="Table"><span style="font-family: 宋体;">所有枚举类型的基类。</span><span style="font-family: 宋体;"></span><span lang="EN-US"><o:p></o:p></span></p></td></tr><tr style=""><td style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 4cm;" valign="top" width="151"><p class="Table"><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">System.Array<o:p></o:p></span></span></p></td><td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 274.5pt;" valign="top" width="366"><p class="Table"><span style="font-family: 宋体;">所有数组类型的基类。</span><span style="font-family: 宋体;"></span><span lang="EN-US"><o:p></o:p></span></p></td></tr><tr style=""><td style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 4cm;" valign="top" width="151"><p class="Table"><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">System.Delegate<o:p></o:p></span></span></p></td><td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 274.5pt;" valign="top" width="366"><p class="Table"><span style="font-family: 宋体;">所有委托类型的基类。</span><span style="font-family: 宋体;"></span><span lang="EN-US"><o:p></o:p></span></p></td></tr><tr style=""><td style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 4cm;" valign="top" width="151"><p class="Table"><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">System.Exception<o:p></o:p></span></span></p></td><td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 274.5pt;" valign="top" width="366"><p class="Table"><span style="font-family: 宋体;">所有异常类型的基类。</span><span style="font-family: 宋体;"></span><span lang="EN-US"><o:p></o:p></span></p></td></tr></tbody></table><br />四。装箱、拆箱概念<br /><span style="font-size: 11pt; font-family: 宋体;">1.装箱和拆箱的概念是</span><span style="font-size: 11pt; font-family: 宋体;"></span><span style="font-size: 11pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US">C# </span><span style="font-size: 11pt; font-family: 宋体;" lang="EN-US"><span style=""> </span>的类型系统的核心。它在 </span><span class="Production"><span style="font-size: 11pt;">value-type</span></span><span style="font-size: 11pt; font-family: 宋体;"> 和 </span><span class="Production"><span style="font-size: 11pt;">reference-type</span></span><span style="font-size: 11pt; font-family: 宋体;"> 之间的架起了一座桥梁，使得任何 </span><span class="Production"><span style="font-size: 11pt;">value-type</span></span><span style="font-size: 11pt; font-family: 宋体;"> 的值都可以转换为 </span><span class="Codefragment"><span style="font-size: 10pt;">object</span></span><span style="font-size: 11pt; font-family: 宋体;"> 类型的值，反过来转换也可以。<br />2.装箱：</span><span style="font-size: 11pt; font-family: 宋体;">装箱转换允许将</span><span style="font-size: 11pt; font-family: 宋体;"></span><span class="Production"><span style="font-size: 11pt;">value-type</span></span><span style="font-size: 11pt; font-family: 宋体;"></span><span style="font-size: 11pt; font-family: 宋体;">隐式转换为</span><span style="font-size: 11pt; font-family: 宋体;"></span><span class="Production"><span style="font-size: 11pt;">reference-type</span></span><span style="font-size: 11pt; font-family: 宋体;">。<br />装箱的行为可以用下面的过程描述：<br /></span><p class="Code"><span lang="EN-US">sealed class T_Box: System.ValueType<br />
{<br /><span style=""></span>T value;</span></p><p class="Code"><span lang="EN-US"><span style=""></span></span><span style="" lang="DE">public T_Box(T t) {<br /><span style="">     </span>value = t;<br /><span style=""></span>}<br />
}<o:p></o:p></span></p><span style="font-size: 11pt; font-family: 宋体; letter-spacing: -0.3pt;">分配一个对象实例</span><span style="font-size: 11pt; font-family: 宋体; letter-spacing: -0.3pt;">，</span><span style="font-size: 11pt; font-family: 宋体; letter-spacing: -0.3pt;">然后将</span><span style="font-size: 11pt; font-family: 宋体; letter-spacing: -0.3pt;"></span><span class="Production"><span style="font-size: 11pt; letter-spacing: -0.3pt;" lang="EN-US">value-type</span></span><span style="font-size: 11pt; font-family: 宋体; letter-spacing: -0.3pt;" lang="EN-US"></span><span style="font-size: 11pt; font-family: 宋体; letter-spacing: -0.3pt;">的值复制到该实例中<br />3.拆箱：</span><span style="font-size: 11pt; font-family: 宋体;">拆箱转换允许将</span><span style="font-size: 11pt; font-family: 宋体;"></span><span class="Production"><span style="font-size: 11pt;">reference-type</span></span><span style="font-size: 11pt; font-family: 宋体;"></span><span style="font-size: 11pt; font-family: 宋体;">显式转换为</span><span style="font-size: 11pt; font-family: 宋体;"></span><span class="Production"><span style="font-size: 11pt;">value-type</span></span><span style="font-size: 11pt; font-family: 宋体;">。<br /></span><span style="font-size: 11pt; font-family: 宋体;">从对象</span><span style="font-size: 11pt; font-family: 宋体;"></span><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">box</span></span><span style="font-size: 11pt; font-family: 宋体;" lang="EN-US"></span><span style="font-size: 11pt; font-family: 宋体;">到</span><span style="font-size: 11pt; font-family: 宋体;"></span><span class="Production"><span style="font-size: 11pt;" lang="EN-US">value-type</span></span><span style="font-size: 11pt; font-family: 宋体;" lang="EN-US"></span><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">T</span></span><span style="font-size: 11pt; font-family: 宋体;" lang="EN-US"></span><span style="font-size: 11pt; font-family: 宋体;">的拆箱转换相当于执行表达式</span><span style="font-size: 11pt; font-family: 宋体;"></span><span class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">((T_Box)box).value</span></span><br /><img src ="http://www.blogjava.net/killme2008/aggbug/99418.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-02-12 12:30 <a href="http://www.blogjava.net/killme2008/archive/2007/02/12/99418.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C#与java的异同</title><link>http://www.blogjava.net/killme2008/archive/2007/02/10/99151.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Sat, 10 Feb 2007 09:39:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2007/02/10/99151.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/99151.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2007/02/10/99151.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/99151.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/99151.html</trackback:ping><description><![CDATA[    网上到处充斥这c#与java对比的文章，看了看，还是觉的MSDN上的一篇文章很全面和客观。《<a href="http://www.microsoft.com/china/msdn/library/langtool/vcsharp/Usgettingstartedcsharpforjava.mspx?mfr=true">针对JAVA开发人员的C#编程语言</a>》。<br /><br />    我的第一天C#学习，总体感觉C#在语言层面上保留了更多C++/C的特点，比如virtual,override关键字的使用，比如结构（值类型，存储在栈上），比如delegate（类似函数指针）。比较感兴趣的也就是delegate、事件和attribute方面。C#某种意义上讲比java稍微复杂，比C++简单。<br /><br />    参照语言规范写的例子，抽象类、继承的例子，可以扩展成一个简单计算器：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">using</span><span style="color: rgb(0, 0, 0);"> System;<br /></span><span style="color: rgb(0, 0, 255);">using</span><span style="color: rgb(0, 0, 0);"> System.Collections;<br /><br /></span><span style="color: rgb(0, 0, 255);">namespace</span><span style="color: rgb(0, 0, 0);"> VirtualDemo<br />{<br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">abstract</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> Expression<br />    {<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">abstract</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);"> Evaluate(Hashtable vars);<br />        <br />    }<br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> Constant : Expression<br />    {<br />        </span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);"> value;<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> Constant(</span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);"> value)<br />        {<br />            </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.value </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> value;<br />        }<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">override</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);"> Evaluate(Hashtable vars)<br />        {<br />            </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> value;<br />        }<br />    }<br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> VariableReference : Expression<br />    {<br />        </span><span style="color: rgb(0, 0, 255);">string</span><span style="color: rgb(0, 0, 0);"> name;<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> VariableReference(</span><span style="color: rgb(0, 0, 255);">string</span><span style="color: rgb(0, 0, 0);"> name)<br />        {<br />            </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.name </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> name;<br />        }<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">override</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);"> Evaluate(Hashtable vars)<br />        {<br />            </span><span style="color: rgb(0, 0, 255);">object</span><span style="color: rgb(0, 0, 0);"> value </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> vars[name];<br />            </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (value </span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">)<br />            {<br />                </span><span style="color: rgb(0, 0, 255);">throw</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Exception(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Unknown variable: </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> name);<br />            }<br />            </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> Convert.ToDouble(value);<br />        }<br />    }<br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> Operation : Expression<br />    {<br />        Expression left;<br />        </span><span style="color: rgb(0, 0, 255);">char</span><span style="color: rgb(0, 0, 0);"> op;<br />        Expression right;<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> Operation(Expression left, </span><span style="color: rgb(0, 0, 255);">char</span><span style="color: rgb(0, 0, 0);"> op, Expression right)<br />        {<br />            </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.left </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> left;<br />            </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.op </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> op;<br />            </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.right </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> right;<br />        }<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">override</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);"> Evaluate(Hashtable vars)<br />        {<br />            </span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);"> x </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> left.Evaluate(vars);<br />            </span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);"> y </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> right.Evaluate(vars);<br />            </span><span style="color: rgb(0, 0, 255);">switch</span><span style="color: rgb(0, 0, 0);"> (op)<br />            {<br />                </span><span style="color: rgb(0, 0, 255);">case</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">: </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> x </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> y;<br />                </span><span style="color: rgb(0, 0, 255);">case</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">: </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> x </span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> y;<br />                </span><span style="color: rgb(0, 0, 255);">case</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">: </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> x </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> y;<br />                </span><span style="color: rgb(0, 0, 255);">case</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">: </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> x </span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);"> y;<br />            }<br />            </span><span style="color: rgb(0, 0, 255);">throw</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Exception(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Unknown operator</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />        }<br />    }<br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> Test<br />    {<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> Main(</span><span style="color: rgb(0, 0, 255);">string</span><span style="color: rgb(0, 0, 0);"> []args)<br />        {<br />            Expression e </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Operation(<br />            </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> VariableReference(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">x</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">),<br />            </span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,<br />            </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Operation(<br />                </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> VariableReference(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">y</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">),<br />                </span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,<br />                </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Constant(</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">)<br />            )<br />        );<br />        Hashtable vars </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Hashtable();<br />        vars[</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">x</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">] </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">3</span><span style="color: rgb(0, 0, 0);">;<br />        vars[</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">y</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">] </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">5</span><span style="color: rgb(0, 0, 0);">;<br />        Console.WriteLine(e.Evaluate(vars));        </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> Outputs "21"</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">        vars[</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">x</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">] </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1.5</span><span style="color: rgb(0, 0, 0);">;<br />        vars[</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">y</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">] </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">9</span><span style="color: rgb(0, 0, 0);">;<br />        Console.WriteLine(e.Evaluate(vars));        </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> Outputs "16.5"</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);"><br />        }<br />    }<br /><br />}<br /></span></div><br />再来一个委托的例子，函数作为变量的传递和使用，对有C++经验或者动态语言经验的人来说不会奇怪：<br /><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">using</span><span style="color: rgb(0, 0, 0);"> System;<br /></span><span style="color: rgb(0, 0, 255);">namespace</span><span style="color: rgb(0, 0, 0);"> DelegateDemo<br />{<br />    </span><span style="color: rgb(0, 0, 255);">delegate</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);"> Function(</span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);"> x);<br />    </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> Multiplier<br />    {<br />        </span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);"> factor;<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> Multiplier(</span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);"> factor)<br />        {<br />            </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.factor </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> factor;<br />        }<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);"> Multiply(</span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);"> x)<br />        {<br />            </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> x </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> factor;<br />        }<br />    }<br /><br />    </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> Test<br />    {<br />        </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);"> Square(</span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);"> x)<br />        {<br />            </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> x </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> x;<br />        }<br />        </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);">[] Apply(</span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);">[] a, Function f)<br />        {<br />            </span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);">[] result </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);">[a.Length];<br />            //直接通过f()调用<br />            </span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> i </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">; i </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);"> a.Length; i</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">) result[i] </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> f(a[i]);<br />            </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> result;<br />        }<br />        </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> Main()<br />        {<br />            </span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);">[] a </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> { </span><span style="color: rgb(0, 0, 0);">0.0</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(0, 0, 0);">0.5</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(0, 0, 0);">1.0</span><span style="color: rgb(0, 0, 0);"> };<br />            //delegate Function分别赋予了不同的方法<br />            </span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);">[] squares </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> Apply(a, </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Function(Square));<br />            </span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);">[] sines </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> Apply(a, </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Function(Math.Sin));<br />            Multiplier m </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Multiplier(</span><span style="color: rgb(0, 0, 0);">2.0</span><span style="color: rgb(0, 0, 0);">);<br />            </span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);">[] doubles </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> Apply(a, </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Function(m.Multiply));<br />            </span><span style="color: rgb(0, 0, 255);">foreach</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);"> b </span><span style="color: rgb(0, 0, 255);">in</span><span style="color: rgb(0, 0, 0);"> doubles)<br />            {<br />                Console.WriteLine(b);<br />            }<br />        }<br /><br />    }<br />}<br /></span></div><br /><img src ="http://www.blogjava.net/killme2008/aggbug/99151.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-02-10 17:39 <a href="http://www.blogjava.net/killme2008/archive/2007/02/10/99151.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我的第一个C#程序</title><link>http://www.blogjava.net/killme2008/archive/2007/02/09/98934.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Fri, 09 Feb 2007 02:38:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2007/02/09/98934.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/98934.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2007/02/09/98934.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/98934.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/98934.html</trackback:ping><description><![CDATA[    我得老实承认，我很早就想好好学习下C#，学习下ASP.NET。因为我听说ASP.NET的开发速度很让人羡慕，听说C#也是蛮有趣的语言。装了.net Framework2.0，下了C#的语言规范（本来想找本书，发现网上的电子书都做的很糟糕，还是看语言规范得了），写第一个Hello World。<br /><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">using</span><span style="color: rgb(0, 0, 0);"> System;<br /><br /></span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> HelloWorld<br />{<br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> Main()<br />    {<br />        Console.WriteLine(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Hello World</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />    }<br /><br />    <br />}</span></div><br />    存为hello.cs。配置好环境变量，在命令行运行:csc hello.cs。在目录下会生成一个hello.exe,直接运行hello。打印：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">Hello World</span></div><br />    看起来跟java确实没什么不同，除了字母的大小写，和java默认引入java.lang包，而这里需要using System;<br />    稍微复杂点的例子，我们写一个库文件stack.dll，或者说一个程序集（java中包的概念）：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">using</span><span style="color: rgb(0, 0, 0);"> System;<br /><br /></span><span style="color: rgb(0, 0, 255);">namespace</span><span style="color: rgb(0, 0, 0);"> Acme.Collections<br />{<br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> Stack<br />    {<br />        Entry top;<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> push(</span><span style="color: rgb(0, 0, 255);">object</span><span style="color: rgb(0, 0, 0);"> data)<br />        {<br />            top </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Entry(top, data);<br />          <br /><br />        }<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">object</span><span style="color: rgb(0, 0, 0);"> pop()<br />        {<br />            </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (top </span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">) </span><span style="color: rgb(0, 0, 255);">throw</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> InvalidOperationException();<br />            </span><span style="color: rgb(0, 0, 255);">object</span><span style="color: rgb(0, 0, 0);"> result </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> top.data;<br />            top </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> top.next;<br />            </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> result;<br /><br />        }<br />        </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> Stack()<br />        {<br />      </span><span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">        }<br />        </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> Entry<br />        {<br />            </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> Entry next;<br />            </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">object</span><span style="color: rgb(0, 0, 0);"> data;<br />            </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> Entry(Entry next, </span><span style="color: rgb(0, 0, 255);">object</span><span style="color: rgb(0, 0, 0);"> data)<br />            {<br />                </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.next </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> next;<br />                </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.data </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> data;<br />            }<br />        }<br />    }<br />}<br /></span></div><br />    代码很明显，一个简单的栈结构，我们把Stack类放在命名空间<span style="color: rgb(0, 0, 0);">Acme.Collections中。</span>运行：csc /t:library stack.cs，在应用目录下生成一个stack.dll。我们怎么调用这个链接库呢？写个测试类：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">using</span><span style="color: rgb(0, 0, 0);"> System;<br /></span><span style="color: rgb(0, 0, 255);">using</span><span style="color: rgb(0, 0, 0);"> Acme.Collections;<br /></span><span style="color: rgb(128, 128, 128);"></span><span style="color: rgb(128, 128, 128);"></span><span style="color: rgb(128, 128, 128);"></span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> Test<br />{<br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> Main()<br />    {<br />        Stack stack </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Stack();<br />        stack.push(</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">);<br />        stack.push(</span><span style="color: rgb(0, 0, 0);">10</span><span style="color: rgb(0, 0, 0);">);<br />        stack.push(</span><span style="color: rgb(0, 0, 0);">100</span><span style="color: rgb(0, 0, 0);">);<br />                    <br />        Console.WriteLine(stack.pop());<br />        Console.WriteLine(stack.pop());<br />        Console.WriteLine(stack.pop());<br />    }<br />}</span></div><br />    很明显，只是把java的import换成了using，而且不需要通配符。编译test.cs:csc /r:stack.dll test.cs。<br />    C#和ruby将是我07年主要的学习计划，另外就是J2EE深入技术方面的掌握和理解,特别是模式、工作流和Portal方面。<br /><br /><br /><img src ="http://www.blogjava.net/killme2008/aggbug/98934.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2007-02-09 10:38 <a href="http://www.blogjava.net/killme2008/archive/2007/02/09/98934.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>