??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美扣逼视频,九九热hot精品视频在线播放,成人va天堂http://www.aygfsteel.com/killme2008/category/19912.htmlzh-cnMon, 09 Apr 2007 04:35:15 GMTMon, 09 Apr 2007 04:35:15 GMT60微Y为VS.netd单元试功能http://www.aygfsteel.com/killme2008/archive/2007/04/09/109316.htmldennisdennisMon, 09 Apr 2007 00:37:00 GMThttp://www.aygfsteel.com/killme2008/archive/2007/04/09/109316.htmlhttp://www.aygfsteel.com/killme2008/comments/109316.htmlhttp://www.aygfsteel.com/killme2008/archive/2007/04/09/109316.html#Feedback0http://www.aygfsteel.com/killme2008/comments/commentRss/109316.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/109316.htmlinfoq中文?/a>


dennis 2007-04-09 08:37 发表评论
]]>
C#实现二叉查找?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/killme2008/archive/2007/04/02/108018.html</guid><wfw:comment>http://www.aygfsteel.com/killme2008/comments/108018.html</wfw:comment><comments>http://www.aygfsteel.com/killme2008/archive/2007/04/02/108018.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/killme2008/comments/commentRss/108018.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/killme2008/services/trackbacks/108018.html</trackback:ping><description><![CDATA[<p>二叉查找树(binary search tree)</p> <p>1Q概念:对于树中的每个节点nQ其左子节点中保存的所有数值都于n保存的数|叛_节点保存的数值都大于n保存的数倹{?/p> <p>2Q二叉查找树可以实现更ؓ优越的查找性能Q主要实现方式有数组和链表结构,相比较而言Q链表实现更为容易,因ؓ数组实现删除和添加功能需要移动数l元素(如填补删除空位等Q?/p> <br>今天下午在打印问题搞定后用C#实现了一下,比java版本比较有趣的用C#的delegate来代曉K历二叉树时的visitҎQ这样一来可以在遍历时对节点q行你所惌的Q何操作。我们知道C#的delegate是类型化的函数指针,而C++的函数指针可以模仿动态语a的闭包或者匿名函数。这里也有这L味道?br><br>代码如下Q只实现了整数型的,节点定义Q?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;">  </span><span style="color: #0000ff;">public</span><span style="color: #000000;">  </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> BSTIntNode<br>    {<br>        </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> value;<br>        </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> BSTIntNode left;<br>        </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> BSTIntNode right;<br><br>        </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> BSTIntNode(</span><span style="color: #0000ff;">int</span><span style="color: #000000;"> value, BSTIntNode left, BSTIntNode right)<br>        {<br>            </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.value </span><span style="color: #000000;">=</span><span style="color: #000000;"> value;<br>            </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.left </span><span style="color: #000000;">=</span><span style="color: #000000;"> left;<br>            </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.right </span><span style="color: #000000;">=</span><span style="color: #000000;"> right;<br>        }<br><br>        </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> BSTIntNode(</span><span style="color: #0000ff;">int</span><span style="color: #000000;"> value)<br>        {<br>            </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.value </span><span style="color: #000000;">=</span><span style="color: #000000;"> value;<br>            </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.left </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br>            </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.right </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br>        }<br>    }</span></div> <br>然后定义一个DelegateQ作为遍历时的访问方法:<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;"> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">delegate</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> Visit(BSTIntNode node);</span></div> <br>然后是二叉树的实现Q删除算法只实现了复制删除法Q?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;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> BSTIntTree<br>    {<br>        </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> BSTIntNode root;<br>      <br>        </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Visit visit;<br><br>        </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> BSTIntTree()<br>        {<br>            </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.root </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br>        }<br><br>        </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> BSTIntNode Search(BSTIntNode node, </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> el)<br>        {<br>            </span><span style="color: #0000ff;">while</span><span style="color: #000000;"> (node </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>            {<br>                </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (el </span><span style="color: #000000;">==</span><span style="color: #000000;"> node.value)<br>                    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> node;<br>                </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (el </span><span style="color: #000000;"><</span><span style="color: #000000;"> node.value)<br>                    node </span><span style="color: #000000;">=</span><span style="color: #000000;"> node.left;<br>                </span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>                    node </span><span style="color: #000000;">=</span><span style="color: #000000;"> node.right;<br>            }<br>            </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br>        }<br><br>        </span><span style="color: #008000;">//</span><span style="color: #008000;">查找</span><span style="color: #008000;"><br></span><span style="color: #000000;">        </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> BSTIntNode Search(</span><span style="color: #0000ff;">int</span><span style="color: #000000;"> el)<br>        {<br>            </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Search(root, el);<br>        }<br><br>        </span><span style="color: #008000;">//</span><span style="color: #008000;">q度优先遍历,利用队列实现,至上而下Q至左而右</span><span style="color: #008000;"><br></span><span style="color: #000000;">        </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> BreadthFirst()<br>        {<br>            BSTIntNode p </span><span style="color: #000000;">=</span><span style="color: #000000;"> root;<br>            Queue queue </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> ListQueue();<br>            </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (p </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>            {<br>                queue.Enqueue(p);<br>                </span><span style="color: #0000ff;">while</span><span style="color: #000000;"> (</span><span style="color: #000000;">!</span><span style="color: #000000;">queue.IsEmpty())<br>                {<br>                    p </span><span style="color: #000000;">=</span><span style="color: #000000;"> (BSTIntNode)queue.Dequeue();<br>                    visit(p);<br>                    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (p.left </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>                        queue.Enqueue(p.left);<br>                    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (p.right </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>                        queue.Enqueue(p.right);<br>                }<br>            }<br>        }<br><br>        </span><span style="color: #008000;">//</span><span style="color: #008000;">深度优先遍历Q递归实现U序Q中序和后序<br><br>        </span><span style="color: #008000;">//</span><span style="color: #008000;">先序</span><span style="color: #008000;"><br></span><span style="color: #000000;">        </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> PreOrder(BSTIntNode p)<br>        {<br>            </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (p </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>            {<br>                visit(p);<br>                PreOrder(p.left);<br>                PreOrder(p.right);<br>            }<br>        }<br><br>        </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> PreOrder()<br>        {<br>            PreOrder(root);<br>        }<br>        </span><span style="color: #008000;">//</span><span style="color: #008000;">中序</span><span style="color: #008000;"><br></span><span style="color: #000000;">        </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> InOrder(BSTIntNode p)<br>        {<br>            </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (p </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>            {<br>                InOrder(p.left);<br>                visit(p);<br>                InOrder(p.right);<br>            }<br>        }<br><br>        </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> InOrder()<br>        {<br>            InOrder(root);<br>        }<br><br>        </span><span style="color: #008000;">//</span><span style="color: #008000;">后序</span><span style="color: #008000;"><br></span><span style="color: #000000;">        </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> PostOrder(BSTIntNode p)<br>        {<br>            </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (p </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>            {<br>                PostOrder(p.left);<br>                PostOrder(p.right);<br>                visit(p);<br>            }<br>        }<br><br>        </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> PostOrder()<br>        {<br>            PostOrder(root);<br>        }<br><br>        </span><span style="color: #008000;">//</span><span style="color: #008000;">插入节点操作</span><span style="color: #008000;"><br></span><span style="color: #000000;">        </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> Insert(</span><span style="color: #0000ff;">int</span><span style="color: #000000;"> el)<br>        {<br>            BSTIntNode p </span><span style="color: #000000;">=</span><span style="color: #000000;"> root, prev </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br><br>            </span><span style="color: #008000;">//</span><span style="color: #008000;">查找节点位置</span><span style="color: #008000;"><br></span><span style="color: #000000;">            </span><span style="color: #0000ff;">while</span><span style="color: #000000;"> (p </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>            {<br>                prev </span><span style="color: #000000;">=</span><span style="color: #000000;"> p;<br>                </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (p.value </span><span style="color: #000000;"><</span><span style="color: #000000;"> el)<br>                    p </span><span style="color: #000000;">=</span><span style="color: #000000;"> p.right;<br>                </span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>                    p </span><span style="color: #000000;">=</span><span style="color: #000000;"> p.left;<br>            }<br><br>            </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (root </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #0000ff;">null</span><span style="color: #000000;">)  </span><span style="color: #008000;">//</span><span style="color: #008000;">I树</span><span style="color: #008000;"><br></span><span style="color: #000000;">                root </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> BSTIntNode(el);<br>            </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (prev.value </span><span style="color: #000000;"><</span><span style="color: #000000;"> el)   </span><span style="color: #008000;">//</span><span style="color: #008000;">大于节点Q插入右子树</span><span style="color: #008000;"><br></span><span style="color: #000000;">                prev.right </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> BSTIntNode(el);<br>            </span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>                prev.left </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> BSTIntNode(el);<br>        }<br><br>        </span><span style="color: #008000;">//</span><span style="color: #008000;">复制删除法的实现Q归q删除法可能改变树的高度</span><span style="color: #008000;"><br></span><span style="color: #000000;">        </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> Delete(</span><span style="color: #0000ff;">int</span><span style="color: #000000;"> el)<br>        {<br>            BSTIntNode node, p </span><span style="color: #000000;">=</span><span style="color: #000000;"> root, prev </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br><br>            </span><span style="color: #008000;">//</span><span style="color: #008000;">查找节点位置</span><span style="color: #008000;"><br></span><span style="color: #000000;">            </span><span style="color: #0000ff;">while</span><span style="color: #000000;"> (p </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">null</span><span style="color: #000000;">&&</span><span style="color: #000000;">p.value</span><span style="color: #000000;">!=</span><span style="color: #000000;">el)<br>            {<br>                prev </span><span style="color: #000000;">=</span><span style="color: #000000;"> p;<br>                </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (p.value </span><span style="color: #000000;"><</span><span style="color: #000000;"> el)<br>                    p </span><span style="color: #000000;">=</span><span style="color: #000000;"> p.right;<br>                </span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>                    p </span><span style="color: #000000;">=</span><span style="color: #000000;"> p.left;<br>            }<br>            node </span><span style="color: #000000;">=</span><span style="color: #000000;"> p;<br>            </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (p </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">null</span><span style="color: #000000;"> </span><span style="color: #000000;">&&</span><span style="color: #000000;"> p.value </span><span style="color: #000000;">==</span><span style="color: #000000;"> el)<br>            {<br>                </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (node.right </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>                    node </span><span style="color: #000000;">=</span><span style="color: #000000;"> node.left;<br>                </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (node.left </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>                    node </span><span style="color: #000000;">=</span><span style="color: #000000;"> node.right;<br>                </span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>                {<br>                    BSTIntNode temp </span><span style="color: #000000;">=</span><span style="color: #000000;"> node.left;<br>                    BSTIntNode previous </span><span style="color: #000000;">=</span><span style="color: #000000;"> node;<br>                    </span><span style="color: #0000ff;">while</span><span style="color: #000000;"> (temp.right </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">null</span><span style="color: #000000;">)  </span><span style="color: #008000;">//</span><span style="color: #008000;">查找左字节数的最叛_节点</span><span style="color: #008000;"><br></span><span style="color: #000000;">                    {<br>                        previous </span><span style="color: #000000;">=</span><span style="color: #000000;"> temp;<br>                        temp </span><span style="color: #000000;">=</span><span style="color: #000000;"> temp.right;<br>                    }<br>                    node.value </span><span style="color: #000000;">=</span><span style="color: #000000;"> temp.value;<br>                    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (previous </span><span style="color: #000000;">==</span><span style="color: #000000;"> node)<br>                        previous.left </span><span style="color: #000000;">=</span><span style="color: #000000;"> temp.left;<br>                    </span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>                        previous.right </span><span style="color: #000000;">=</span><span style="color: #000000;"> temp.left;<br>                }<br>                </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (p </span><span style="color: #000000;">==</span><span style="color: #000000;"> root)<br>                    root </span><span style="color: #000000;">=</span><span style="color: #000000;"> node;<br>                </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (prev.left </span><span style="color: #000000;">==</span><span style="color: #000000;"> p)<br>                    prev.left </span><span style="color: #000000;">=</span><span style="color: #000000;"> node;<br>                </span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>                    prev.right </span><span style="color: #000000;">=</span><span style="color: #000000;"> node;<br>            }<br>            </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (root </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>            {<br>                Console.WriteLine(</span><span style="color: #000000;">"</span><span style="color: #000000;">没有扑ֈ节点Q{0}</span><span style="color: #000000;">"</span><span style="color: #000000;">, el);<br>            }<br>            </span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>                Console.WriteLine(</span><span style="color: #000000;">"</span><span style="color: #000000;">树ؓI!</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>        }<br><br>    }</span></div> <br>注意Q在树中我们l持了一个Visit的delegateQ看看用方法:<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;"> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> Main(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">[] args)<br>        {<br>           BSTIntTree tree</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> BSTIntTree();<br>           </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> []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>           </span><span style="color: #0000ff;">for</span><span style="color: #000000;"> (</span><span style="color: #0000ff;">int</span><span style="color: #000000;"> i </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">; i </span><span style="color: #000000;"><</span><span style="color: #000000;"> num.Length; i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>               tree.Insert(num[i]);<br>           </span><span style="color: #008000;">//</span><span style="color: #008000;">d遍历处理函数Q可以有多个 </span><span style="color: #008000;"><br></span><span style="color: #000000;">           tree.visit </span><span style="color: #000000;">+=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Visit(printNode);<br>          <br>           Console.WriteLine(</span><span style="color: #000000;">"</span><span style="color: #000000;">q度优先遍历</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>           tree.BreadthFirst();<br>           Console.WriteLine(</span><span style="color: #000000;">"</span><span style="color: #000000;">先序</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>           tree.PreOrder();<br>           Console.WriteLine(</span><span style="color: #000000;">"</span><span style="color: #000000;">中序</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>           tree.InOrder();<br>           Console.WriteLine(</span><span style="color: #000000;">"</span><span style="color: #000000;">后序</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>           tree.PostOrder();<br><br>           tree.Delete(</span><span style="color: #000000;">8</span><span style="color: #000000;">);<br>           tree.Delete(</span><span style="color: #000000;">15</span><span style="color: #000000;">);<br>           Console.WriteLine(</span><span style="color: #000000;">"</span><span style="color: #000000;">删除后广度优先遍?/span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>           tree.BreadthFirst();<br><br>        }<br>        </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> printNode(BSTIntNode node)<br>        {<br>            Console.WriteLine(</span><span style="color: #000000;">"</span><span style="color: #000000;">讉K节点:{0}</span><span style="color: #000000;">"</span><span style="color: #000000;">, node.value);<br>        }</span></div> <br> <p>可以看到QC#的delegate机制非常有趣Q如果在java中恐怕需要用inner class来实C?br></p> <p><br></p><img src ="http://www.aygfsteel.com/killme2008/aggbug/108018.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/killme2008/" target="_blank">dennis</a> 2007-04-02 17:29 <a href="http://www.aygfsteel.com/killme2008/archive/2007/04/02/108018.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C#实现栈和队列http://www.aygfsteel.com/killme2008/archive/2007/03/30/107409.htmldennisdennisFri, 30 Mar 2007 01:44:00 GMThttp://www.aygfsteel.com/killme2008/archive/2007/03/30/107409.htmlhttp://www.aygfsteel.com/killme2008/comments/107409.htmlhttp://www.aygfsteel.com/killme2008/archive/2007/03/30/107409.html#Feedback0http://www.aygfsteel.com/killme2008/comments/commentRss/107409.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/107409.htmlC#链表的实?/a>Q实现栈和队列易如反掌?br />
栈,利用单向链表实现Q?br />
public abstract class AbstractStack
    {
        
public abstract Object Pop();
        
public abstract void Push(Object obj);
        
public abstract bool IsEmpty();
        
public abstract Object Top();
        
public abstract void Clear();
    }

    
public class Stack : AbstractStack
    {
        
private SList list;
        
public Stack()
        {
            list 
= new SList();
        }
        
public override bool IsEmpty()
        {
            
return list.IsEmpty();
        }
        
public override void Push(Object obj)
        {
            list.Push(obj);
        }
        
public override object Pop()
        {
            
return list.Pop();
        }
        
public override object Top()
        {
            
return list.getTail();
        }
        
public override void Clear()
        {
            list.Clear(); 
        }
    }

队列的实玎ͼ通过双向链表实现Q对于环形数l的实现请参考?a href="/killme2008/archive/2007/02/20/100239.html">数组l构之栈与链?/a>》:
 public interface Queue
    {
        
bool IsEmpty();
        
void Enqueue(Object obj);
        Object Dequeue();
        Object First();
    }

    
public class ListQueue:Queue
    {
        
private LinkedList list;
        
public ListQueue()
        {
            list 
= new LinkedList();
        }

        
public bool IsEmpty()
        {
            
return list.IsEmpty();
        }

        
public void Enqueue(Object obj)
        {
            list.Push(obj);
        }
        
public Object Dequeue()
        {
            
return list.Shift();
        }

        
public Object First()
        {
            
return list.getHead();
        }
    }



dennis 2007-03-30 09:44 发表评论
]]>
C#实现链表http://www.aygfsteel.com/killme2008/archive/2007/03/29/107261.htmldennisdennisThu, 29 Mar 2007 09:02:00 GMThttp://www.aygfsteel.com/killme2008/archive/2007/03/29/107261.htmlhttp://www.aygfsteel.com/killme2008/comments/107261.htmlhttp://www.aygfsteel.com/killme2008/archive/2007/03/29/107261.html#Feedback0http://www.aygfsteel.com/killme2008/comments/commentRss/107261.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/107261.html阅读全文

dennis 2007-03-29 17:02 发表评论
]]>
对MarshalByRefObject的解?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/killme2008/archive/2007/03/28/107037.html</guid><wfw:comment>http://www.aygfsteel.com/killme2008/comments/107037.html</wfw:comment><comments>http://www.aygfsteel.com/killme2008/archive/2007/03/28/107037.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/killme2008/comments/commentRss/107037.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/killme2008/services/trackbacks/107037.html</trackback:ping><description><![CDATA[    今天看到一D介lC#实现代理模式的代码,使用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: 宋体;">到底是什么东西呢Q简单来Ԍl承此类的对?/span><span style="font-size: 10pt; color: black; font-family: 宋体;">可以跨越应用E序域边界被引用Q甚臌q程引用。远E调用时Q将产生一个远E对象在本地的透明代理Q通过此代理来q行q程调用。一很好的解释文章Q来自http://dudu.cnblogs.com/archive/2004/03/04/2182.html<br /><br /><br /></span><div id="wmqeeuq" 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: 宋体;">应该怎样理解Q?/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: 宋体;">Q?/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: 宋体;">q个</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: 宋体;">q种形态)Q同理,当打包以后传输到目标地点Q还要执?/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: 宋体;">的操作将其还原ؓ内存中的对象。:Q?/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: 宋体;">谢谢Q?/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: 宋体;">是不是可以这L解:对被引用的对象进?/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: 宋体;">的过E是怎样的?</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: 宋体;">上这栯Q?/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: 宋体;">交换消息来跨应用E序域边界进行通讯的对象的基类</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: 宋体;">对象在本地应用程序域的边界内可直接访问。远E应用程序域中的应用E序首次讉K</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: 宋体;">Ӟ会向该远E应用程序传?/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: 宋体;">中,上面所说的代理是什么?有什么用Q?/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: 宋体;">上还讲到Q?/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: 宋体;">当跨应用E序域边界用类型时Q类型必L?/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: 宋体;">l承的,而且׃对象的成员在创徏它们的应用程序域之外无法使用Q所?/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: 宋体;">既然对象的状态不能传递过去,那传递这个对象又有何意义Q?/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: 宋体;">W一ơ去理解</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: 宋体;">Q有的问题可能提的比较肤,h指点?/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: 宋体;">回复Q?/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: 宋体;">边界外部讉K的对象的基类Q重心不?/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: 宋体;">Q而是</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: 宋体;">Q即</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: 宋体;">Q也是可以通过</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: 宋体;">Q实际上?/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: 宋体;">对象Q的机制q行</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: 宋体;">Q?/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: 宋体;">一词的译Q的对象。封送的行ؓ是由代理来做的,q里说的代理是我文章中讲过?/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: 宋体;">Q。真实代理不是有一?/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: 宋体;">的透明代理讉K该对象的ҎӞ透明代理把Z堆栈的方法调用{换ؓҎ调用消息Q?/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: 宋体;">Qƈ转发l真实代理(?/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: 宋体;">Q,?/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: 宋体;">的Q务就是把对象送ƈq同Ҏ调用消息一赯{发给q程应用E序域;到达目的C后的操作cMQ远E应用程序域中的监听方当收到发来的方法调用消息时Q先取出送好?/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: 宋体;">Q这个对象里面保存着发来调用的那个对象!Q,其l封Q?/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: 宋体;">Qؓ本地的对象,q获得其透明代理Q然后就可以把方法调用消息在转换回基于堆栈的调用发送给q个对象?/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: 宋体;">对象是在本地l护的,但是Ҏ可以在远E调用。你比如说一?/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: 宋体;">应用E序Q你是通过本地的浏览器q程讉Kq个应用E序Q但是应用程序的状态不会由你的览器负责(所以你只是在访问这个应用程序提供给你的功能而已Q你q没于拥有应用程序本w,包括其所有数据)Q你只是发送一个个的请求,服务器告诉你处理的结果。在</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: 宋体;">? 也是一P当你获得一个远E对象的时候,你实际上只拥有对q个对象的一个远E引用,虽然你可以调用它的方法,但实际上q些操作都是发生在远E的Q就是前? 讲过的过E)Q你只是传入了一些参敎ͼ得到了一个结果,但对象的状态还是在q程l护的(换句话说Q对象本w也是对象的所有状态ƈ没有被往q传递,传递的 只是传入传出的参?/span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">—?/span><span style="font-size: 10pt; color: black; font-family: 宋体;">当然Q如果参数是一?/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: 宋体;">的话Q还是传递对象被送的引用Q?/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: 宋体;">也许应该l你准备一个好理解的例?/span><span style="font-size: 10pt; color: black; font-family: Arial;" lang="EN-US">…?/span><span style="font-size: 10pt; color: black; font-family: 宋体;">你就会豁然开朗了。:Q?/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: 宋体;">我这L理解对不对?</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: 宋体;">l承的对象区别是Q?/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: 宋体;">对象可以跨越应用E序域边界被引用Q甚臌q程引用?/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: 宋体;">Q?/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: 宋体;">Q。你比如说吧Q?/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: 宋体;">创徏的远E对象的话,实际上它只是一个包含有已经</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: 宋体;">的透明代理Q?/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: 宋体;">Q所以当你调用这个远E对象时Q相当于向这个远E端口(</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: 宋体;">Q发送方法调用消息而已。只不过透明代理隐藏了对象位|的概念Q?/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: 宋体;">真实代理则是实际上处理远E方法调用和对象送的中枢对象?/span></div><br /><img src ="http://www.aygfsteel.com/killme2008/aggbug/107037.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/killme2008/" target="_blank">dennis</a> 2007-03-28 17:55 <a href="http://www.aygfsteel.com/killme2008/archive/2007/03/28/107037.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>体验rails1.2的REST风格http://www.aygfsteel.com/killme2008/archive/2007/03/20/105083.htmldennisdennisTue, 20 Mar 2007 12:04:00 GMThttp://www.aygfsteel.com/killme2008/archive/2007/03/20/105083.htmlhttp://www.aygfsteel.com/killme2008/comments/105083.htmlhttp://www.aygfsteel.com/killme2008/archive/2007/03/20/105083.html#Feedback0http://www.aygfsteel.com/killme2008/comments/commentRss/105083.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/105083.html学习REST》对于初ơ接触REST的h来说更好理解?p>    我们?Web 应用中处理来自客L的请求时Q通常只考虑 GET ?POST q两U?HTTP hҎ。实际上QHTTP q有 HEAD、PUT、DELETE {请求方法。而在 REST 架构中,用不同的 HTTP hҎ来处理对资源? CRUDQ创建、读取、更新和删除Q操作:

  • POST: 创徏
  • GET: d
  • PUT: 更新
  • DELETE: 删除

l过q样的一番扩展,我们对一个资源的 CRUD 操作可以通过同一?URI 完成了。需要注意的是REST的核心就是资源(resourcesQ这个概c我们所说的webservice是一U徏立在http协议上的q程调用Q而REST是把远E调用抽象成对远E资源的CRUD的操作,正好可以用HTTP的PUT GET POST DELETE来对应,而不是重新发明一个协议(比如soapQ简单对象访问协议)。REST与AJAX的流行,甚至q至设计模式的兴P都充分说明一个现象,在成熟的应用的基上创新而非扩展出复杂所谓“创新性”架构在软g行业是更为可靠?/p>

    实战体验REST可以从IBM Developer的这文章开始?a >跨越边界QRest On Rails》。这文章是在Rails1.2发布之前出来的,有些地方已经可以修改的更l,我把我的l习q程记录下,q添加了C#调用REST风格web service的例子?/p>

    首先Q你的机器上需要安装rails1.2Qƈ且假设你对rails有基本的了解Q徏立一个应用叫service,命o行执行:

  
 rails service

rails自动帮你生成应用的基本结构和基础代码Q然后编辑config下面的database.yml讄数据库,q徏立数据service_developmentQ我用的是mysql数据库?/p>

create.bmp

利用rails1.2新的scaffold命oQ?/p>

ruby script/generate scaffold_resource person

q个命o自动生成ActiveRecord,Controller以及ViewQ在\app\models下可以发现自动生成的Model——person.rb。打开service\db\migrate下面?01_create_people.rbQ编辑如下:

class CreatePeople < ActiveRecord::Migration
  def self
.up
    create_table 
:people do |t|
     t
.column :first_name, :string, :limit => 40
     t
.column :last_name, :string, :limit => 40
     t
.column :email, :string, :limit => 40
     t
.column :phone, :string, :limit => 15
    end
  end

  def self
.down
    drop_table 
:people
  end
end

利用rake命o自动Q执?
rake db:migrate
rails默认表明是Model的复数Ş式,也就是这里将自动建立一张名叫people的表?br />
OKQ一切就l,启动WEBricQ访问http://localhost:3000/peopleQ显C:
rest1.bmp

scaffold已经帮我们自动生成了一个对person资源的crud操作Q增删改查似乎跟传统的rails没有什么不同嘛。如果你认真观察在操作过E中URL的变化情况就会发现在操作q程中URL的变化很,而且与传lrails的URL路由相比Q省Maction名称。出现的变化?people?people/1?people/1;edit?people/newq几个之中。在/people的URL中隐藏这可能是http的POST或者GET的方法,前者用于create操作Q而GET用于show操作Q具体你可以查看app/controllers/目录下的PeopleControllerc,每个action的前面都注释了它们将对应哪个HTTPҎ。?people/1中的1指的是资源的标志W,比如q里person的idQ通过q个ID来进行资源的操作Q也许是PUTҎQ更斎ͼQ也许是DELETEҎQ删除)。rails实现PUT和Delete是通过隐藏字段来实现的Q查看编辑页面生成的html源代码,你将发现一个_method的隐藏字D,gؓPUT。而另外两个URLQ?people/1;edit?people/newQ这两个q严格意义上的RESTful URLQ它们只是ؓ了显C用Q显Cform表单用于新徏和编辑。关于RESTful风格的URL的详l讨见《RESTfull Rails Development》文?br />
    如果rails只是q样的威力,那就有点提大做了,看看PeopleController的show actionQ它对应于http的GEThQ返回people列表Q?br />
# GET /people/1
  # GET /people/1.xml

  def show
    
@person = Person.find(params[:id])

    respond_to 
do |format|
      
format.html # show.rhtml
      format.xml  { render :xml => @person.to_xml }
    end
  end

奇的地方在respond_toҎ中,Ҏh文gcdQhttp Header的ContentTypeQ,昄html格式Q或者xml格式Q还有其他支持,比如json、RSS、Atom{等Q。比如你d了一个person,通过http://localhost:3000/people/1讉KQ可以看到这个h员的具体信息Q?br />rest2.bmp
我们再通过http://localhost:3000/people/3.xml讉K看到的却是一个xml文gQ?br />
rest3.bmp

不仅如此Q我们也可以通过其他语言~写客户端来调用http://localhost:3000/people/1q个urlQ慢着Q这不正是web serviceq程调用吗?没错QREST风格的web service相比于wsdl、soap定义的web service单了太多太多Q也更加实用。我们来~写一个javac调用http://localhost:3000/people获得所有的人员列表Q?br />
package example;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

public class RESTDemo {

    
/**
     * 
@param args
     
*/
    
public static void main(String[] args) {
        RESTDemo restDemo 
= new RESTDemo();
            restDemo.get();
        
    }

    
void get() {

        
try {
            URL url 
= new URL("http://localhost:3000/people");
            URLConnection urlConnection 
= url.openConnection();
            urlConnection.setRequestProperty(
"accept""text/xml");
            BufferedReader in 
= new BufferedReader(new InputStreamReader(
                    urlConnection.getInputStream()));
            String str;

            
while ((str = in.readLine()) != null) {
                System.out.println(str);
            }

            in.close();
        } 
catch (Exception e) {
            System.out.println(e);
        }
    }
}

我们没有什么服务端接口classQ我们也不用生成什么stubQ我们调用的最常见最常见的http协议Q发送的是默认的GEThQrails自动该h转发lshow action。注意,我们q里?span style="color: rgb(0, 0, 0);">accept讄为text/xmlQshowҎҎ此格式返回一个xml文Q下面是输出Q?br />
<?xml version="1.0" encoding="UTF-8"?>
<people>
  
<person>
    
<email>killme2008@gmail.com</email>
    
<first-name>dennis</first-name>
    
<id type="integer">1</id>
    
<last-name>zane</last-name>
    
<phone>1355XXXXXXX</phone>
  
</person>
</people>

如果仅仅是GETh是不够的Q我们说q,把远E调用抽象成对远E资源的CRUD操作Q那么如何create、delete和updateq程资源呢?同样很简单,比如我们通过C#q程调用Q创Z个新personQ还记的我说q吗Q?people可以是POSThQ他调用PeopleController的createҎQ?br />
using System;
using System.Net;
using System.IO;
using System.Text;
namespace demo
{
    
class RESTDemo
    {
        
static void Main(string[] args)
        {
            
string xmlText = "<person> " + "<first-name>jordan</first-name>"
                    
+ "<last-name>jordan</last-name>"
                    
+ "<email>maggie@tate.com</email>"
                    
+ "<phone>010-XXXXXXXX</phone>" + "</person>";
            Uri address 
= new Uri("http://localhost:3000/people");  
   
            
// 创徏webh
            HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest;  
   
            
// 讄hcd为POSTQ调用create action
            request.Method = "POST";  
            request.ContentType 
= "application/xml";

            
byte[] xmlBytes = Encoding.ASCII.GetBytes(xmlText);

            
using (Stream reqStream = request.GetRequestStream())
            {
                reqStream.Write(xmlBytes, 
0, xmlBytes.Length);
            }
            
using (WebResponse wr = request.GetResponse())
            {
                wr.
                
//打印q回的http?/span>
                Console.WriteLine(wr.Headers.ToString());
               
            }              
           

        }
    }
}

执行此程序,hhttp://localhost:3000/peopleQ可以看到新Z一个h员如?br />
rest4.bmp

好极了,GET和POST都有了,那么PUT对应的更新和DELETE对应的删除又该怎么做呢Q唯一的区别就是设|请求类型不同而已Qjava调用如下Q?br />
    void put() {
        
try {
            String xmlText 
= "<person> " + "<first-name>test</first-name>"
                    
+ "<last-name>test</last-name>"
                    
+ "<email>maggie@tate.com</email>"
                    
+ "<phone>010-XXXXXXXX</phone>" + "</person>";

            URL url 
= new URL("http://localhost:3000/people/1");
            HttpURLConnection conn 
= (HttpURLConnection) url.openConnection();
            conn.setDoOutput(
true);
            //讄h为PUT
            conn.setRequestMethod(
"PUT");
            conn.setRequestProperty(
"Content-Type""text/xml");
            OutputStreamWriter wr 
= new OutputStreamWriter(conn
                    .getOutputStream());
            wr.write(xmlText);
            wr.flush();
            wr.close();
        } 
catch (Exception e) {
            System.out.println(
"Error" + e);
        }
    }

    
void delete() {
        
try {
            URL url 
= new URL("http://localhost:3000/people/2");
            HttpURLConnection conn 
= (HttpURLConnection) url.openConnection();
            conn.setDoOutput(
true);
            //讄h为DELETE
            conn.setRequestMethod(
"DELETE");
            conn.setRequestProperty(
"Content-Type""text/xml");
            
if(conn.getResponseCode()==200)
                System.out.println(
"删除成功Q?/span>");
        }
catch (Exception e) {
            System.out.println(
"Error" + e);
        }
    }

q里的putҎ第一个h员的名字改了Q而deleteҎq脆刚才C#d的h员删除掉。异构系l的q程调用变的如此单很LQ把什么EJB、CORBA、SOAPl统忘掉吧。想象这L场景Q所有的|站都提供REST风格的APIQ这个世界将是什么模P

    REST带来的不仅仅是web service的改变,对MVC架构同样h很重要的意义Q过L们的复用通常在MODEL层,我们一直希望复用业务逻辑层,却没有想q是否能复用Controller甚至View呢?REST为我们提供了可能Q比如以一个很l常被提到的例子来说Q用户加入某个圈子这个操作跟圈子的管理员用户加入圈子的操作是一P但是操作成功后的跌{昄的页面也怸同,q去也许我们是通过写两个不同的Action来实玎ͼ而现在,同一个ActionQ加入圈子这个操作)只负责发送数据(XML格式的文)Q而页面的展示留l客L去选择Q从而复用了ControllerQ减了Action和View层的代码量。进一步,请你惌QREST与AJAX的技术结合生多么有的画面?b>REST仅用于提供数?/b>Q展现更多的交给了客L?br />
    本文仅仅是我接触RESTq两天的学习ȝQ对于REST的应用才刚刚hQ需要更多的探讨和实c其实java实现REST也是相当单的Qservlet本n是很好的模型,恐怕没有多人注意到HttpServletcM的doPut和doDeleteҎQ我们过dGET和POSTQ反而忽视了PUT和DELETE可能带来的改变。java开源世界中已经有了REST风格的框Ӟ比如cetia4Q?/a>q是一个servlet-base的REST框架Q值的x?br />

dennis 2007-03-20 20:04 发表评论
]]>
使用 HttpWebRequest 向网站提交数?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/killme2008/archive/2007/03/20/105023.html</guid><wfw:comment>http://www.aygfsteel.com/killme2008/comments/105023.html</wfw:comment><comments>http://www.aygfsteel.com/killme2008/archive/2007/03/20/105023.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/killme2008/comments/commentRss/105023.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/killme2008/services/trackbacks/105023.html</trackback:ping><description><![CDATA[ <div id="wmqeeuq" class="postTitle"> <a id="viewpost1_TitleUrl" class="postTitle2" >转自Qhttp://www.cnblogs.com/webman/archive/2006/11/17/564106.html<br /></a> </div> HttpWebRequest 是?net 基类库中的一个类Q在命名I间 System.Net 下面Q用来用户通过 HTTP 协议和服务器交互。?br /><br />HttpWebRequest 对 HTTP 协议q行了完整的装Q对 HTTP 协议中的 Header, Content, Cookie 都做了属性和Ҏ的支持,很容易就能编写出一个模拟浏览器自动d的程序。?br /><br />E序使用 HTTP 协议和服务器交互主要是进行数据的提交Q通常数据的提交是通过 GET 和 POST 两种方式来完成,下面对这两种方式q行一下说明: <br /><br />1. GET  方式。 GET 方式通过在网l地址附加参数来完成数据的提交Q比如在地址 http://www.google.com/webhp?hl=zh- CN 中,前面部分 http://www.google.com/webhp 表示数据提交的网址Q后面部分 hl=zh-CN 表示附加的参敎ͼ其中  hl 表示一个键(key)Q zh-CN 表示q个键对应的?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);">在这里对接收到的面内容q行处理</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 方式一P是类g hl=zh-CN&newwindow=1 q样的结构。程序代码如下: <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&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);">在这里对接收到的面内容q行处理</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">} </span></div><br /><br />在上面的代码中,我们讉K了 www.google.com 的网址Q分别以 GET 和 POST 方式提交了数据,q接收了q回的页面内宏V然而,如果提交的参C含有中文Q那么这L处理是不够的Q需要对其进行编码,让对方网站能够识别。?br /><br />3. 使用 GET 方式提交中文数据。 GET 方式通过在网l地址中附加参数来完成数据提交Q对于中文的~码Q常用的有 gb2312 和 utf8 两种Q用 gb2312 方式~码讉K的程序代码如下: <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);">g</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);">在这里对接收到的面内容q行处理</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">} </span></div><br /><br />? 上面的程序代码中Q我们以 GET 方式讉K了网址 http://www.baidu.com/s Q传递了参数“参C=g”,׃无法告知Ҏ? 交数据的~码cdQ所以编码方式要以对方的|站为标准。常见的|站中, www.baidu.com Q百度)的编码方式是 gb2312,  www.google.com Q谷歌)的编码方式是 utf8。?br /><br />4. 使用 POST 方式提交中文数据。 POST 方式通过在页面内容中填写参数的方法来完成数据的提交,׃提交的参C可以说明使用的编码方式,所以理Z能获得更大的兼容性。用 gb2312 方式~码讉K的程序代码如下: <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);">g</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);">=</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);">g</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);">在这里对接收到的面内容q行处理</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">} </span></div><br /><br />从上面的代码可以看出Q POST 中文数据的时候,先用 UrlEncode Ҏ中文字W{换ؓ~码后的 ASCII 码,然后提交到服务器Q提交的时候可以说明编码的方式Q用来Ҏ服务器能够正的解析。?br /><br />? 上列Z客户端程序用 HTTP 协议与服务器交互的情况,常用的是 GET 和 POST 方式。现在流行的 WebService 也是通过  HTTP 协议来交互的Q用的是 POST Ҏ。与以上E有所不同的是Q WebService 提交的数据内容和接收到的数据内容都是使用?  XML 方式~码。所以, HttpWebRequest 也可以用在调用 WebService 的情况下?img src ="http://www.aygfsteel.com/killme2008/aggbug/105023.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/killme2008/" target="_blank">dennis</a> 2007-03-20 16:32 <a href="http://www.aygfsteel.com/killme2008/archive/2007/03/20/105023.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>创徏型模式摘?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/killme2008/archive/2007/03/17/104485.html</guid><wfw:comment>http://www.aygfsteel.com/killme2008/comments/104485.html</wfw:comment><comments>http://www.aygfsteel.com/killme2008/archive/2007/03/17/104485.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/killme2008/comments/commentRss/104485.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/killme2008/services/trackbacks/104485.html</trackback:ping><description><![CDATA[    pȝ的演化应当依赖于l合Q而不是承;q就提出了将cȝ实例化委托给一个对象的要求Q因此创建型模式变的越来越重要?br /><div style="text-indent: 21pt;">创徏型模式属于对象创建模型。所谓对象创建模型就是说实例化的工作委托给另一个对象来做。与之相对应的是cd建模型,q是一U通过l承改变被实例化的类?/div><div><span>       </span>创徏型模式有两个重要的特点:</div><div style="margin-left: 39pt; text-indent: -18pt;"><span>1Q?/span>客户不知道创建的具体cL什么(除非看源代码Q?/div><div style="margin-left: 39pt; text-indent: -18pt;"><span>2Q?/span>隐藏了类的实例是如何被创建和攑֜一L</div><br />一。抽象工厂模?br />1.意图Q提供一个创?b>一pd</b>相关或相互依赖对象的接口Q而无需指定它们的具体的cR?br />2.适用场景Q?br />1)一个系l要独立于它的品的创徏、组合和表示?br />2Q一个系l要由多个品系列中的一个来配置?br />3Q当你要一pd相关的品对象的设计以便q行联合使用?br />4Q当你提供一个品类库,而只xC它们的接口而不是实现时<br /><br />3.UML䏀—结?br /><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/sheismylife/07cbd5dfdbdd4027a1ed513e503b1d6f.png" /><br />4.效果Q?br />1Q分M具体的类Q通过抽象接口客户与具体的类分离<br />2Q易于交换品系?br />3Q有利于产品的一致?br />4Q难以支持新U类的品,比如我们现在有一个ProductC产品Q我们需要增加类AbstractProductCQ增加AbstractFactory:: CreanteProductCҎQƈ且两个品系列的实际创徏者ConCreateFactory1、ConCreateFactor2都要实现该方 法?div>可以通过l方法加参数的方式来指明创徏的是什么品,q样客户代码无需改变Q只要传递不同的参数。AbstractFactorycd需要提供一个CreateProduct(const string& name)Ҏ卛_?br /><br />5.代码实现Q以《深入浅计模?java C#)》的动物工厂ZQ?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);">动物世界c?/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);">q行食物?/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);"><summary></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);"></summary></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);">创造ƈq行非洲动物世界</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);">创造ƈq行洲动物世界</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.意图Q将一?b>复杂对象</b>的构Z它的表示相分,使得同样的构E可以创Z同的表示Q或者说产品Q?br /><br />2.适用场景Q?br />1Q当创徏复杂对象的算法应该独立于改对象的l成部分以及它们的装配方式时<br />2Q当构造过E必d许被构造的对象有不同的表示?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子类对象Q完成创E,q知Builder对象q回以及构造好的品?br /><br />4.效果Q?br />1Q可以你改变一个对象的内部表示<br />2Q构造代码和表示代码分开<br />3Q可以对构造过E进行更_的控?br /><br />5。实玎ͼ以一个R辆徏造过Eؓ例(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 />    抽象建造者具有四U方?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);">q回建造完成的车辆</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);">具体建造?摩托车R?/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);">具体建造?轿R车间</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);">轿R</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);"> 具体建造?单脚滑行车R?/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);">车辆产品c?/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);">{构函数,军_cd</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);">车辆cȝ? </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);"> #车门敊W? </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);"><summary></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);"></summary></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);"> 创造R间及车辆建造?/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);"> {构q显CR?/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.意图Q定义一个用于创建对象的接口Q让子类军_实例化具体的哪一个类?br />2.适用场景Q?br />1Q当一个类不知道它所必须创徏的对象的cȝ时候,让子cL军_<br />2Q当一个类希望由它的子cL军_它所创徏的对象的时?br /><br />3。UML䏀—结构:<br /><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/sheismylife/638ccee7f75e4632a78bdda0a084690b.png" /><br />4.效果Q?br />1Qؓ子类提供回调函数<br />2Q连接^行的cd?br /><div style="margin-left: 18pt; text-indent: -18pt;"><span>3Q?/span>创徏函数可以接收参数来决定创Z么?/div><div>4QFactory MethodҎD创徏q多的Creator的子cM对应不同的品,q个Ҏ可以通过模板技术来解决<br /><br />6.实现Q手机工厂,产品可能是NokiaQ也可能是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.意图Q通过原型实例指定创徏对象的种c,q过拯q些原型来创建新的对?br /><br />2.适用场景Q?br />1Q要实例化的cL在运行时L定的Q比如动态装?br />2Qؓ了避免创Z个与产品层次q的工厂类层次<br />3Q当一个类的实例只能有几个不同的状态组合中的一U时Q徏立相应数目的原型q克隆它们可能比每次用合适的状态手工化该类更方便一些?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.效果Q?br />1Q运行时动态增加或者删除?br />2Q减子cȝ构造数?br />3Q用cd态配|应?br />4Q动态指定新的对象,通过改变l构或者?br />5Q缺陷在于每一个Prototype的子c都需要实现clone操作<br /><br />5。实?无论javaq是C#都从语言层次内置了对prototype模式的支持。具体不再详q?br /><br />五。singleton模式<br />1。意图:保证一个类仅有一个实例,q提供一个访问它的全局讉K?br /><br />2.适用场景Q?br />1Q当需要类只有一个实例,q且客户只能通过一个全局点去讉K?br />2Q当q个唯一实例应该是通过子类化可扩展的,q且客户应该无需更改代码p使用扩展的实?br /><br />3.UML图:?br /><br />4.效果Q?br />1Q对唯一实例的受控访?br />2Q羃命名空?br />3Q允许对操作和表C的l化<br />4Q允许可变数目的实例<br /><br />5实现Q关于singleton在java多线E环境下的实玎ͼ误讨论?a id="viewpost1_TitleUrl" class="postTitle2" >当Singleton遇到multi-threading</a>》,C#对singleton多线E环境下的能够正实现Double-checked模式Q?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 />本文仅作速查记忆用,摘记于《设计模式——可复用面向对象软g基础》和《深入浅计模式(java C#)》两?br /><br /></div><img src ="http://www.aygfsteel.com/killme2008/aggbug/104485.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/killme2008/" target="_blank">dennis</a> 2007-03-17 17:01 <a href="http://www.aygfsteel.com/killme2008/archive/2007/03/17/104485.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>图文q茂——用xfire~写webservice,q过C#调用http://www.aygfsteel.com/killme2008/archive/2007/03/07/102450.htmldennisdennisWed, 07 Mar 2007 10:13:00 GMThttp://www.aygfsteel.com/killme2008/archive/2007/03/07/102450.htmlhttp://www.aygfsteel.com/killme2008/comments/102450.htmlhttp://www.aygfsteel.com/killme2008/archive/2007/03/07/102450.html#Feedback9http://www.aygfsteel.com/killme2008/comments/commentRss/102450.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/102450.html阅读全文

dennis 2007-03-07 18:13 发表评论
]]>
C#的using语句http://www.aygfsteel.com/killme2008/archive/2007/02/12/99470.htmldennisdennisMon, 12 Feb 2007 07:53:00 GMThttp://www.aygfsteel.com/killme2008/archive/2007/02/12/99470.htmlhttp://www.aygfsteel.com/killme2008/comments/99470.htmlhttp://www.aygfsteel.com/killme2008/archive/2007/02/12/99470.html#Feedback0http://www.aygfsteel.com/killme2008/comments/commentRss/99470.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/99470.htmlC#的using语句设计的蛮贴心Q比java的import有趣一炏V{一文?

C#中的using除了作ؓ命名I间指示W?using System)Q类型的别名指示W?using Dos=System.Console)Q还有资源管理的语句功能Q?br /> using (R r1 = new R ()) {
   r1.F();
}
在C#中被译为:
R r1 = new R();
try {
   r1.F();
}
finally {
   
if (r1 != null) ((IDisposable)r1).Dispose();
}

r1当然要支持Dispose()Ҏ?br />
再来一个例子:
# MyObject.cs

using  System;

 

namespace  MyProjects

{

    
public   class  MyObject : IDisposable

    {

        
public  MyObject()

        {

        }

 

        
public   void  Dispose ( )

        {

            
//  Dispose

            Console.WriteLine ( 
" Disposed "  ) ;

            
//  

        }

    }

}

 

# Class1.cs

using  System;

 

namespace  MyProjects

{

     
public   class  Class1

     {

         
public  Class1()

         {

         }

 

         
public   static   void  Main (  string [] args )

         {

              
using  ( MyObject myObject  =   new  MyObject ( ) )

              {

                   Console.WriteLine ( 
" quit "  ) ;

              }

         }

     }

}

 

使用using会自动调?span lang="EN-US">MyObject?span lang="EN-US">DisposeҎ.


dennis 2007-02-12 15:53 发表评论
]]>
C#的类型系l?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/killme2008/archive/2007/02/12/99418.html</guid><wfw:comment>http://www.aygfsteel.com/killme2008/comments/99418.html</wfw:comment><comments>http://www.aygfsteel.com/killme2008/archive/2007/02/12/99418.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/killme2008/comments/commentRss/99418.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/killme2008/services/trackbacks/99418.html</trackback:ping><description><![CDATA[一.C#的统一cdpȝ<br />1.C#的类型系l是l一的,java的类型系l分为:基本cdQ原生类型)和类cdQ而C#的所有类型直接或间接Cobjectcȝ型派生而来Q从cdpȝ上来看比java更OO?br />2.C#的类型分Zc:<br />Q?Q值类型,<span style="font-size: 11pt; font-family: 宋体;">一个值类型或是结构类?/span><span style="font-size: 11pt; font-family: 宋体;">Q?/span><span style="font-size: 11pt; font-family: 宋体;">或是枚Dcd<br />Q?Q引用类?br />Q?Q指针类?br />值类型与</span><span style="font-size: 11pt; font-family: 宋体;">引用cd的不同在于:</span><span style="font-size: 11pt; font-family: 宋体;">值类型的变量直接包含其数?/span><span style="font-size: 11pt; font-family: 宋体;">Q?/span><span style="font-size: 11pt; font-family: 宋体;">而引用类型的变量存储对其数据的引?/span><span style="font-size: 11pt; font-family: 宋体;"></span><span id="wmqeeuq" class="Term"><span style="font-size: 11pt; font-family: "Times New Roman";" lang="EN-US">(reference)</span></span><span style="font-size: 11pt; font-family: 宋体;">Q?/span><span style="font-size: 11pt; font-family: 宋体;">后者称为对?/span><span style="font-size: 11pt; font-family: 宋体;"></span><span id="wmqeeuq" class="Term"><span style="font-size: 11pt; font-family: "Times New Roman";" lang="EN-US">(object)</span></span><span style="font-size: 11pt; font-family: 宋体;">。对于引用类?/span><span style="font-size: 11pt; font-family: 宋体;">Q?/span><span style="font-size: 11pt; font-family: 宋体;">两个变量可能引用同一个对?/span><span style="font-size: 11pt; font-family: 宋体;">Q?/span><span style="font-size: 11pt; font-family: 宋体;">因此对一个变量的操作可能影响另一个变量所引用的对象。对于值类型,每个变量都有自己的数据副本,对一个变量的操作不可能媄响另一个变量?br />二。值类?br /></span><span style="font-size: 11pt; font-family: 宋体;">1.所有值类型从c?/span><span style="font-size: 11pt; font-family: 宋体;"></span><span id="wmqeeuq" 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: 宋体;">隐式l承</span><span style="font-size: 11pt; font-family: 宋体;">Q?/span><span style="font-size: 11pt; font-family: 宋体;">后者又从类</span><span style="font-size: 11pt; font-family: 宋体;"></span><span id="wmqeeuq" 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: 宋体;">l承。Q何类型都不可能从值类型派生?br /><br />2.</span><span style="font-family: 宋体;">所有值类型都隐式声明一个称为默认构造函?/span><span style="font-family: 宋体;"></span><span id="wmqeeuq" 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: 宋体;">Q?/span><span style="font-family: 宋体;">它就是该值类型的默认?/span><span style="font-family: 宋体;"></span><span id="wmqeeuq" class="Term"><span lang="EN-US">(default value)</span></span><span style="font-family: 宋体;">Q?/span><p class="MsoListBullet" style=""><!--[if !supportLists]--><span style="font-family: Symbol;" lang="EN-US"><span style="">·<span style="font-family: "Times New Roman"; 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 id="wmqeeuq" class="Production"><span lang="EN-US">simple-types</span></span><span style="font-family: 宋体;">Q?/span><span style="font-family: 宋体;">默认值是其所有位都置零的位模式所形成的?/span><span style="font-family: 宋体;">Q?/span></p><p class="MsoListBullet2" style="margin-left: 36pt; text-indent: -18.15pt;"><!--[if !supportLists]--><span style="font-family: "Courier New";" lang="EN-US"><span style="">o<span style="font-family: "Times New Roman"; 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 id="wmqeeuq" class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">sbyte</span></span><span style="font-family: 宋体;">?/span><span id="wmqeeuq" class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">byte</span></span><span style="font-family: 宋体;">?/span><span id="wmqeeuq" class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">short</span></span><span style="font-family: 宋体;">?/span><span id="wmqeeuq" class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">ushort</span></span><span style="font-family: 宋体;">?/span><span id="wmqeeuq" class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">int</span></span><span style="font-family: 宋体;">?/span><span id="wmqeeuq" class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">uint</span></span><span style="font-family: 宋体;">?/span><span id="wmqeeuq" 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 id="wmqeeuq" class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">ulong</span></span><span style="font-family: 宋体;">Q?/span><span style="font-family: 宋体;">默认gؓ</span><span style="font-family: 宋体;"></span><span id="wmqeeuq" 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: "Courier New";" lang="EN-US"><span style="">o<span style="font-family: "Times New Roman"; 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 id="wmqeeuq" class="Codefragment"><span style="font-size: 10pt;">char</span></span><span style="font-family: 宋体;">Q?/span><span style="font-family: 宋体;">默认gؓ</span><span style="font-family: 宋体;"></span><span id="wmqeeuq" 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: "Courier New";" lang="EN-US"><span style="">o<span style="font-family: "Times New Roman"; 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 id="wmqeeuq" class="Codefragment"><span style="font-size: 10pt;">float</span></span><span style="font-family: 宋体;">Q?/span><span style="font-family: 宋体;">默认gؓ</span><span style="font-family: 宋体;"></span><st1:chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="0" unitname="F"><span id="wmqeeuq" 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: "Courier New";" lang="EN-US"><span style="">o<span style="font-family: "Times New Roman"; 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 id="wmqeeuq" class="Codefragment"><span style="font-size: 10pt;">double</span></span><span style="font-family: 宋体;">Q?/span><span style="font-family: 宋体;">默认gؓ</span><span style="font-family: 宋体;"></span><span id="wmqeeuq" 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: "Courier New";" lang="EN-US"><span style="">o<span style="font-family: "Times New Roman"; 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 id="wmqeeuq" class="Codefragment"><span style="font-size: 10pt;">decimal</span></span><span style="font-family: 宋体;">Q?/span><span style="font-family: 宋体;">默认gؓ</span><span style="font-family: 宋体;"></span><st1:chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="0" unitname="m"><span id="wmqeeuq" 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: "Courier New";" lang="EN-US"><span style="">o<span style="font-family: "Times New Roman"; 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 id="wmqeeuq" class="Codefragment"><span style="font-size: 10pt;">bool</span></span><span style="font-family: 宋体;">Q?/span><span style="font-family: 宋体;">默认gؓ</span><span style="font-family: 宋体;"></span><span id="wmqeeuq" 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: "Times New Roman"; 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 id="wmqeeuq" class="Production"><span style="">enum-type</span></span><span style="font-family: 宋体;"></span><span id="wmqeeuq" class="Codefragment"><span style="font-size: 10pt;">E</span></span><span style="font-family: 宋体;">Q?/span><span style="font-family: 宋体;">默认gؓ</span><span style="font-family: 宋体;"></span><span id="wmqeeuq" 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: "Times New Roman"; 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 id="wmqeeuq" class="Production"><span style="">struct-type</span></span><span style="font-family: 宋体;">Q?/span><span style="font-family: 宋体;">默认值是通过所有值类型字D设|ؓ它们的默认倹{将所有引用类型字D设|ؓ</span><span style="font-family: 宋体;"></span><span id="wmqeeuq" class="Codefragment"><span style="font-size: 10pt;">null</span></span><span style="font-family: 宋体;"></span><span style="font-family: 宋体;">而生的倹{?/span></p> 3.C#中有所谓的单类型概念(simple typeQ,cM于java的基本类型,但又不同QC#的简单类型本质上都是l构cdQ预定义集合的结构类型)Q所以还是值类型,?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">l承而来。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 id="wmqeeuq" 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 id="wmqeeuq" 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 id="wmqeeuq" 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 id="wmqeeuq" 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 id="wmqeeuq" 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 id="wmqeeuq" 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 id="wmqeeuq" 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 id="wmqeeuq" 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 id="wmqeeuq" 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 id="wmqeeuq" 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 id="wmqeeuq" 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 id="wmqeeuq" 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 id="wmqeeuq" 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 id="wmqeeuq" 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 id="wmqeeuq" 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 id="wmqeeuq" 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 id="wmqeeuq" 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 id="wmqeeuq" 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 id="wmqeeuq" 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 id="wmqeeuq" 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 id="wmqeeuq" 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 id="wmqeeuq" 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 id="wmqeeuq" 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 id="wmqeeuq" 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 id="wmqeeuq" 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 id="wmqeeuq" class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">System.Decimal<o:p></o:p></span></span></p></td></tr></tbody></table> q些单类型都是System命名I间中预定义l构cd的别名(ruby的别名实在脓心)<br /><br />4.枚DcdQ?span style="font-size: 11pt; font-family: 宋体;">枚Dcd是具有命名常量的独特的类型。每个枚丄型都有一个基cdQ该基础cd必须? </span><span id="wmqeeuq" class="Codefragment"><span style="font-size: 10pt;">byte</span></span><span style="font-size: 11pt; font-family: 宋体;">?/span><span id="wmqeeuq" class="Codefragment"><span style="font-size: 10pt;">sbyte</span></span><span style="font-size: 11pt; font-family: 宋体;">?/span><span id="wmqeeuq" class="Codefragment"><span style="font-size: 10pt;">short</span></span><span style="font-size: 11pt; font-family: 宋体;">?/span><span id="wmqeeuq" class="Codefragment"><span style="font-size: 10pt;">ushort</span></span><span style="font-size: 11pt; font-family: 宋体;">?/span><span id="wmqeeuq" class="Codefragment"><span style="font-size: 10pt;">int</span></span><span style="font-size: 11pt; font-family: 宋体;">?/span><span id="wmqeeuq" class="Codefragment"><span style="font-size: 10pt;">uint</span></span><span style="font-size: 11pt; font-family: 宋体;">?/span><span id="wmqeeuq" class="Codefragment"><span style="font-size: 10pt;">long</span></span><span style="font-size: 11pt; font-family: 宋体;"> ?</span><span id="wmqeeuq" class="Codefragment"><span style="font-size: 10pt;">ulong</span></span><span style="font-size: 11pt; font-family: 宋体;">。如果没有ؓ枚Dcd中的元素指定基础|默认是从0开始逐一递增?br /><br />三。引用类?br /></span><p class="MsoNormal"><span style="font-family: 宋体;">1.引用cd是类cd、接口类型、数l类型或委托cd?/span></p><p class="MsoNormal"><span style="font-family: 宋体;">2.cȝ型:包括预定义的cȝ型和用户通过class关键字的自定义类cd</span></p><p class="MsoNormal"><span style="font-family: 宋体;">3.对象cdQ?/span></p><p class="MsoNormal"><span id="wmqeeuq" 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;">cȝ型是所有其他类型的最l基cR?/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>中的每种cd都是直接或间接从</span><span style="font-family: 宋体; letter-spacing: 0.2pt;"></span><span id="wmqeeuq" 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;">cȝ型派生的?/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 id="wmqeeuq" 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 id="wmqeeuq" class="Codefragment"><span style="font-size: 10pt;">System.Object</span></span><span style="font-family: 宋体;"></span><span style="font-family: 宋体;">的别名?/span></p> 4.stringcd:<br /><span id="wmqeeuq" 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: 宋体;">cd是直接从</span><span style="font-size: 11pt; font-family: 宋体;"></span><span id="wmqeeuq" 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: 宋体;">l承的密类cd?/span><span style="font-size: 11pt; font-family: 宋体;">关键?/span><span style="font-size: 11pt; font-family: 宋体;"></span><span id="wmqeeuq" 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 id="wmqeeuq" 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.接口cdQ?br />与java中的接口概念基本一_可以变相实现多重l承?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: 宋体;">cȝ?/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 id="wmqeeuq" 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: 宋体;">所有其他类型的最l基cR?/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 id="wmqeeuq" 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>语言的字W串cd?/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 id="wmqeeuq" 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 id="wmqeeuq" 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 id="wmqeeuq" 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: 宋体;">所有数l类型的基类?/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 id="wmqeeuq" 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 id="wmqeeuq" 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.装箱和拆q概念?/span><span style="font-size: 11pt; font-family: 宋体;"></span><span style="font-size: 11pt; font-family: "Times New Roman";" lang="EN-US">C# </span><span style="font-size: 11pt; font-family: 宋体;" lang="EN-US"><span style=""> </span>的类型系l的核心。它?</span><span id="wmqeeuq" class="Production"><span style="font-size: 11pt;">value-type</span></span><span style="font-size: 11pt; font-family: 宋体;"> ?</span><span id="wmqeeuq" class="Production"><span style="font-size: 11pt;">reference-type</span></span><span style="font-size: 11pt; font-family: 宋体;"> 之间的架起了一座桥梁,使得M </span><span id="wmqeeuq" class="Production"><span style="font-size: 11pt;">value-type</span></span><span style="font-size: 11pt; font-family: 宋体;"> 的值都可以转换?</span><span id="wmqeeuq" class="Codefragment"><span style="font-size: 10pt;">object</span></span><span style="font-size: 11pt; font-family: 宋体;"> cd的|反过来{换也可以?br />2.装箱Q?/span><span style="font-size: 11pt; font-family: 宋体;">装箱转换允许?/span><span style="font-size: 11pt; font-family: 宋体;"></span><span id="wmqeeuq" 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 id="wmqeeuq" class="Production"><span style="font-size: 11pt;">reference-type</span></span><span style="font-size: 11pt; font-family: 宋体;">?br />装箱的行为可以用下面的过E描qͼ<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;">Q?/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 id="wmqeeuq" 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.拆箱Q?/span><span style="font-size: 11pt; font-family: 宋体;">拆箱转换允许?/span><span style="font-size: 11pt; font-family: 宋体;"></span><span id="wmqeeuq" 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 id="wmqeeuq" 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 id="wmqeeuq" 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 id="wmqeeuq" 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 id="wmqeeuq" 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: 宋体;">的拆p{换相当于执行表达?/span><span style="font-size: 11pt; font-family: 宋体;"></span><span id="wmqeeuq" class="Codefragment"><span style="font-size: 10pt;" lang="EN-US">((T_Box)box).value</span></span><br /><img src ="http://www.aygfsteel.com/killme2008/aggbug/99418.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/killme2008/" target="_blank">dennis</a> 2007-02-12 12:30 <a href="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/killme2008/archive/2007/02/10/99151.html</guid><wfw:comment>http://www.aygfsteel.com/killme2008/comments/99151.html</wfw:comment><comments>http://www.aygfsteel.com/killme2008/archive/2007/02/10/99151.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/killme2008/comments/commentRss/99151.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/killme2008/services/trackbacks/99151.html</trackback:ping><description><![CDATA[    |上到处充斥qc#与javaҎ的文章,看了看,q是觉的MSDN上的一文章很全面和客观。?a >针对JAVA开发h员的C#~程语言</a>》?br /><br />    我的W一天C#学习QM感觉C#在语a层面上保留了更多C++/C的特点,比如virtual,override关键字的使用Q比如结构(值类型,存储在栈上)Q比如delegateQ类似函数指针)。比较感兴趣的也是delegate、事件和attribute斚w。C#某种意义上讲比javaE微复杂Q比C++单?br /><br />    参照语言规范写的例子Q抽象类、承的例子Q可以扩展成一个简单计器Q?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 />再来一个委托的例子Q函C为变量的传递和使用Q对有C++l验或者动态语al验的h来说不会奇怪:<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);"><</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.aygfsteel.com/killme2008/aggbug/99151.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/killme2008/" target="_blank">dennis</a> 2007-02-10 17:39 <a href="http://www.aygfsteel.com/killme2008/archive/2007/02/10/99151.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我的W一个C#E序http://www.aygfsteel.com/killme2008/archive/2007/02/09/98934.htmldennisdennisFri, 09 Feb 2007 02:38:00 GMThttp://www.aygfsteel.com/killme2008/archive/2007/02/09/98934.htmlhttp://www.aygfsteel.com/killme2008/comments/98934.htmlhttp://www.aygfsteel.com/killme2008/archive/2007/02/09/98934.html#Feedback0http://www.aygfsteel.com/killme2008/comments/commentRss/98934.htmlhttp://www.aygfsteel.com/killme2008/services/trackbacks/98934.html
using System;

public class HelloWorld
{
    
public static void Main()
    {
        Console.WriteLine(
"Hello World");
    }

    
}

    存ؓhello.cs。配|好环境变量Q在命o行运?csc hello.cs。在目录下会生成一个hello.exe,直接q行hello。打华ͼ
Hello World

    看v来跟java实没什么不同,除了字母的大写Q和java默认引入java.lang包,而这里需要using System;
    E微复杂点的例子Q我们写一个库文gstack.dllQ或者说一个程序集Qjava中包的概念)Q?br />
using System;

namespace Acme.Collections
{
    
public class Stack
    {
        Entry top;
        
public void push(object data)
        {
            top 
= new Entry(top, data);
          

        }
        
public object pop()
        {
            
if (top == nullthrow new InvalidOperationException();
            
object result = top.data;
            top 
= top.next;
            
return result;

        }
        
public Stack()
        {
     

        }
        
class Entry
        {
            
public Entry next;
            
public object data;
            
public Entry(Entry next, object data)
            {
                
this.next = next;
                
this.data = data;
            }
        }
    }
}

    代码很明显,一个简单的栈结构,我们把StackcL在命名空?span style="color: rgb(0, 0, 0);">Acme.Collections中?/span>q行Qcsc /t:library stack.csQ在应用目录下生成一个stack.dll。我们怎么调用q个链接库呢Q写个测试类Q?br />
using System;
using Acme.Collections;
public class Test
{
    
public static void Main()
    {
        Stack stack 
= new Stack();
        stack.push(
1);
        stack.push(
10);
        stack.push(
100);
                    
        Console.WriteLine(stack.pop());
        Console.WriteLine(stack.pop());
        Console.WriteLine(stack.pop());
    }
}

    很明显,只是把java的import换成了usingQ而且不需要通配W。编译test.cs:csc /r:stack.dll test.cs?br />    C#和ruby是?7q主要的学习计划Q另外就是J2EE深入技术方面的掌握和理?特别是模式、工作流和Portal斚w?br />



dennis 2007-02-09 10:38 发表评论
]]>
վ֩ģ壺 ȫ| | °Ͷ| ¡| | | | | | Ű| | | μ| | | | ɾ| ̨| | ¯| | ʯ| ϴ| ָɽ| | | н| | ұ| | ɽ| ɳ| ͨ| | | | | | | ̨| ̫ԭ|