﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-专家区</title><link>http://www.cnblogs.com/expert/</link><description>程序员的网上家园</description><language>zh-cn</language><lastBuildDate>Fri, 10 Feb 2012 09:35:26 GMT</lastBuildDate><pubDate>Fri, 10 Feb 2012 09:35:26 GMT</pubDate><ttl>60</ttl><item><title>TX Text Control文字处理教程（11）使用文本框</title><link>http://www.cnblogs.com/powertoolsteam/archive/2012/02/10/2345523.html</link><dc:creator>葡萄城控件技术团队博客</dc:creator><author>葡萄城控件技术团队博客</author><pubDate>Fri, 10 Feb 2012 07:36:00 GMT</pubDate><guid>http://www.cnblogs.com/powertoolsteam/archive/2012/02/10/2345523.html</guid><description><![CDATA[<p><p>本章主要讲述如何利用文本框控件来控制和操作文本。相应的源代码可以在TX Text Control.NET的安装目录中找到： <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Samples\WinForms\VB.NET\ Text Frames <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Samples\WinForms\CSharp\ Text Frames <br /><strong>第一步：插入文本框</strong> <br />插入文本框操作首先需要创建一个 TextFrame 的实例， 然后将其添加到 TextFrameCollection集合对象中。</p>
<div class="cnblogs_code">
<pre>[C#] <br />TXTextControl.TextFrame newFrame = <span style="color: #0000ff;">new</span> TXTextControl.TextFrame(<span style="color: #0000ff;">new</span> Size(<span style="color: #800080;">1000</span>,<span style="color: #800080;">1000</span>)); <br />textControl1.TextFrames.Add (newFrame, TXTextControl.HorizontalAlignment.Left, <br />    -<span style="color: #800080;">1</span>,TXTextControl.TextFrameInsertionMode.DisplaceText);</pre>
</div>
<p><br /><br /></p>
<p>插入文本框之后，可以通过单击它的边框来选择该文本框，然后通过鼠标拖动它的边框来移动或者改变其大小。Text Control 还提供了一个内置的集成对话框，可以通过它来设置文本框的外观属性，在代码中可以通过TextFrameAttributesDialog来显示该对话框：</p>
<div class="cnblogs_code">
<pre>[C#] <br />textControl1.TextFrameAttributesDialog();</pre>
</div>
<p><br />在示例程序中，调用该对话框的代码是单击菜单项来调用的，而对于的菜单项是否可用需要以下代码来控制：</p>
<div class="cnblogs_code">
<pre>[C#] <br />mnuTextFrame_Properties.Enabled = (textControl1.TextFrames.GetItem() != <span style="color: #0000ff;">null</span>);</pre>
</div>
<p><br /><br /></p>
<p><strong>第二步：标签打印机</strong> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面演示如何快速插入多个文本框，程序中结合标签打印来说明这样操作，标签打印常用于地址或者徽章标签打印，程序的源代码可以在TextFrames\Printing Address Lables目录下找到。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 示例程序中包含一个对话框，用户可以在对话框中输入标签的相关信息，比如：数量、大小等。 <br /><img src="http://gcdn.grapecity.com/attachment.aspx?attachmentid=1777" alt="" /> <br />依照以上对话框中的设置可以创建相应的文本框。 <br /><img src="http://gcdn.grapecity.com/attachment.aspx?attachmentid=1778" alt="" width="600" /> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以上创建的文本框可以通过手动输入、从文件或者数据库中取值的方式来添加相应的文本信息。示例程序中当点击Fill菜单时，程序会根据文本框的域标识来填充相应&ldquo;Address no.&rdquo;文本。为了演示从文件中加载文本信息，需要用Selection.Load来代替Selection.Text属性：</p>
<div class="cnblogs_code">
<pre>[C#] <br /><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">void</span> mnuLabel_FillIn_Click(<span style="color: #0000ff;">object</span> sender, System.EventArgs e) <br />{ <br />    <span style="color: #0000ff;">int</span> n = <span style="color: #800080;">0</span>; <br />    <span style="color: #0000ff;">foreach</span> (TXTextControl.TextFrame frame <span style="color: #0000ff;">in</span> textControl1.TextFrames) <br />    { <br />        frame.Selection.Text = <span style="color: #800000;">"</span><span style="color: #800000;">Text Frame #</span><span style="color: #800000;">"</span> + Convert.ToString(n++); <br />    } <br />}</pre>
</div>
<p><br /><br /></p>
<p><a href="http://gcdn.grapecity.com/showforum-100.aspx?from=cnblog"><strong>TX Text Control试用版下载</strong></a></p><img src="aggbug/2345523.html?type=0" width="1" height="1" alt=""/><p>作者: <a href="" target="_blank">葡萄城控件技术团队博客</a> 发表于 2012-02-10 15:36 <a href="http://www.cnblogs.com/powertoolsteam/archive/2012/02/10/2345523.html" target="_blank">原文链接</a></p><p>评论: 0　<a href="http://www.cnblogs.com/powertoolsteam/archive/2012/02/10/2345523.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/powertoolsteam/archive/2012/02/10/2345523.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/130752/" target="_blank">苹果征集iPad 3发布会演示应用 重点是图形应用</a><span style="color:gray">(2012-02-10 17:23)</span><br/>· <a href="http://news.cnblogs.com/n/130751/" target="_blank">京东商城涉足汽车销售 将上线售车频道</a><span style="color:gray">(2012-02-10 17:21)</span><br/>· <a href="http://news.cnblogs.com/n/130748/" target="_blank">亚马逊新广告挑衅苹果：一个iPad可买三台kindle</a><span style="color:gray">(2012-02-10 17:20)</span><br/>· <a href="http://news.cnblogs.com/n/130750/" target="_blank">动视暴雪确认今年第二季度推出《暗黑破坏神3》</a><span style="color:gray">(2012-02-10 16:59)</span><br/>· <a href="http://news.cnblogs.com/n/130749/" target="_blank">官方承认 Google Bar 逆行倒施</a><span style="color:gray">(2012-02-10 16:55)</span><br/></p><p>编辑推荐：<a href="http://kb.cnblogs.com/page/130672/" target="_blank">高级编程语言的发展历程</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">我的园子</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://q.cnblogs.com/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>android UI进阶之实现listview的分页加载</title><link>http://www.cnblogs.com/noTice520/archive/2012/02/10/2345057.html</link><dc:creator>noTice501</dc:creator><author>noTice501</author><pubDate>Fri, 10 Feb 2012 03:26:00 GMT</pubDate><guid>http://www.cnblogs.com/noTice520/archive/2012/02/10/2345057.html</guid><description><![CDATA[<p><img src="http://www.cnblogs.com/noTice520/aggbug/2345057.html?type=1" width="1" height="1" alt=""/><p>作者: <a href="http://www.cnblogs.com/noTice520/" target="_blank">noTice501</a> 发表于 2012-02-10 11:26 <a href="http://www.cnblogs.com/noTice520/archive/2012/02/10/2345057.html" target="_blank">原文链接</a></p><p>评论: 0　<a href="http://www.cnblogs.com/noTice520/archive/2012/02/10/2345057.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/noTice520/archive/2012/02/10/2345057.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/130752/" target="_blank">苹果征集iPad 3发布会演示应用 重点是图形应用</a><span style="color:gray">(2012-02-10 17:23)</span><br/>· <a href="http://news.cnblogs.com/n/130751/" target="_blank">京东商城涉足汽车销售 将上线售车频道</a><span style="color:gray">(2012-02-10 17:21)</span><br/>· <a href="http://news.cnblogs.com/n/130748/" target="_blank">亚马逊新广告挑衅苹果：一个iPad可买三台kindle</a><span style="color:gray">(2012-02-10 17:20)</span><br/>· <a href="http://news.cnblogs.com/n/130750/" target="_blank">动视暴雪确认今年第二季度推出《暗黑破坏神3》</a><span style="color:gray">(2012-02-10 16:59)</span><br/>· <a href="http://news.cnblogs.com/n/130749/" target="_blank">官方承认 Google Bar 逆行倒施</a><span style="color:gray">(2012-02-10 16:55)</span><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">我的园子</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://q.cnblogs.com/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>[WCF REST] 通过ASP.NET Output Caching实现声明式缓存</title><link>http://www.cnblogs.com/artech/archive/2012/02/10/wcf-rest-output-caching.html</link><dc:creator>Artech</dc:creator><author>Artech</author><pubDate>Fri, 10 Feb 2012 00:58:00 GMT</pubDate><guid>http://www.cnblogs.com/artech/archive/2012/02/10/wcf-rest-output-caching.html</guid><description><![CDATA[<p><p>ASP.NET的输出缓存（Output Caching）机制允许我们针对整个Web页面或者页面的某个部分（主要针对用户控件）最终呈现的HTML进行缓存。对于后续针对相同资源的请求，只需要直接将缓存的HTML予以回复而无须按照页面处理生命周期对每次请求进行重复处理。WCF通过操作行为<a title="AspNetCacheProfileAttribute Class" href="http://msdn2.microsoft.com/ee474746.aspx">AspNetCacheProfileAttribute</a>利用ASP.NET的输出缓存提供一种针对于某个操作的声明式缓存机制。[源代码从<a href="http://files.cnblogs.com/artech/output.caching.rar">这里</a>下载]</p>  <h1><font size="4"><font style="font-weight: bold">一、AspNetCacheProfileAttribute</font></font></h1>  <p>WCF对ASP.NET缓存的支持是通过AspNetCacheProfileAttribute特性来实现的。通过如下的代码我们不难看出AspNetCacheProfileAttribute是实现了IOperationBehavior接口的操作行为，我们可以直接将其应用到契约接口/类中的某个具有缓存需要的操作方法上。</p>  <div id="codeSnippetWrapper">   <div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">     <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum1">   1:</span> [AttributeUsage(AttributeTargets.Method)]</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum2">   2:</span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">sealed</span> <span style="color: #0000ff">class</span> AspNetCacheProfileAttribute : Attribute, IOperationBehavior</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum3">   3:</span> {</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum4">   4:</span>     <span style="color: #008000">//其他成员</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum5">   5:</span>     <span style="color: #0000ff">public</span> AspNetCacheProfileAttribute(<span style="color: #0000ff">string</span> cacheProfileName);</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum6">   6:</span>     <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> CacheProfileName { get; }</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum7">   7:</span> }</pre>
<!--CRLF--></div>
</div>

<p>AspNetCacheProfileAttribute构造函数参数cacheProfileName表示的CacheProfile的配置名称，目标操作按照定义在相应CacheProfile的缓存策略实施缓存。CacheProfile配置在&lt;system.web&gt;/&lt;caching&gt;/&lt;outputCacheSettings&gt;/&lt;outputCacheProfiles&gt;节点下。</p>

<div id="codeSnippetWrapper">
  <div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">
    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum1">   1:</span> <span style="color: #0000ff">&lt;</span><span style="color: #800000">configuration</span><span style="color: #0000ff">&gt;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum2">   2:</span>   <span style="color: #0000ff">&lt;</span><span style="color: #800000">connectionStrings</span><span style="color: #0000ff">&gt;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum3">   3:</span>     <span style="color: #0000ff">&lt;</span><span style="color: #800000">add</span> <span style="color: #ff0000">name</span><span style="color: #0000ff">=&quot;localDb&quot;</span> </pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum4">   4:</span>          <span style="color: #ff0000">connectionString</span><span style="color: #0000ff">=&quot;Server=.; Database=TestDb; Uid=sa; Pwd=password&quot;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum5">   5:</span>          <span style="color: #ff0000">providerName</span><span style="color: #0000ff">=&quot;System.Data.SqlClient&quot;</span><span style="color: #0000ff">/&gt;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum6">   6:</span>   <span style="color: #0000ff">&lt;/</span><span style="color: #800000">connectionStrings</span><span style="color: #0000ff">&gt;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum7">   7:</span>   <span style="color: #0000ff">&lt;</span><span style="color: #800000">system.web</span><span style="color: #0000ff">&gt;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum8">   8:</span>     <span style="color: #0000ff">&lt;</span><span style="color: #800000">caching</span><span style="color: #0000ff">&gt;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum9">   9:</span>       <span style="color: #0000ff">&lt;</span><span style="color: #800000">outputCacheSettings</span><span style="color: #0000ff">&gt;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum10">  10:</span>         <span style="color: #0000ff">&lt;</span><span style="color: #800000">outputCacheProfiles</span><span style="color: #0000ff">&gt;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum11">  11:</span>           <span style="color: #0000ff">&lt;</span><span style="color: #800000">add</span> <span style="color: #ff0000">name</span><span style="color: #0000ff">=&quot;default&quot;</span> </pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum12">  12:</span>                <span style="color: #ff0000">duration</span><span style="color: #0000ff">=&quot;60&quot;</span> </pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum13">  13:</span>                <span style="color: #ff0000">varyByParam</span><span style="color: #0000ff">=&quot;none&quot;</span> </pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum14">  14:</span>                <span style="color: #ff0000">sqlDependency</span><span style="color: #0000ff">=&quot;TestDb: TestTable&quot;</span><span style="color: #0000ff">/&gt;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum15">  15:</span>         <span style="color: #0000ff">&lt;/</span><span style="color: #800000">outputCacheProfiles</span><span style="color: #0000ff">&gt;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum16">  16:</span>       <span style="color: #0000ff">&lt;/</span><span style="color: #800000">outputCacheSettings</span><span style="color: #0000ff">&gt;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum17">  17:</span>       <span style="color: #0000ff">&lt;</span><span style="color: #800000">sqlCacheDependency</span><span style="color: #0000ff">&gt;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum18">  18:</span>         <span style="color: #0000ff">&lt;</span><span style="color: #800000">databases</span><span style="color: #0000ff">&gt;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum19">  19:</span>           <span style="color: #0000ff">&lt;</span><span style="color: #800000">add</span> <span style="color: #ff0000">name</span><span style="color: #0000ff">=&quot;TestDb&quot;</span> <span style="color: #ff0000">connectionStringName</span><span style="color: #0000ff">=&quot;localDb&quot;</span><span style="color: #0000ff">/&gt;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum20">  20:</span>         <span style="color: #0000ff">&lt;/</span><span style="color: #800000">databases</span><span style="color: #0000ff">&gt;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum21">  21:</span>       <span style="color: #0000ff">&lt;/</span><span style="color: #800000">sqlCacheDependency</span><span style="color: #0000ff">&gt;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum22">  22:</span>     <span style="color: #0000ff">&lt;/</span><span style="color: #800000">caching</span><span style="color: #0000ff">&gt;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum23">  23:</span>   <span style="color: #0000ff">&lt;/</span><span style="color: #800000">system.web</span><span style="color: #0000ff">&gt;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum24">  24:</span> <span style="color: #0000ff">&lt;/</span><span style="color: #800000">configuration</span><span style="color: #0000ff">&gt;</span></pre>
<!--CRLF--></div>
</div>

<p>在如上所示的配置片断中，我们定义了一个名称为default的CacheProfile。代表缓存时间的duration属性被设置为60，意味着缓存项在被存储之后1分钟之后实失效；属性varyByParam被设置为none表示缓存项与请求的查询字符串无关。此外，该CacheProfile还设置针对某个本地数据库中的TestTable表的SQL依赖（SQL Dependency）。关于CacheProfile的配置属于ASP.NET的范畴，在这里我们不会作过多的讨论。</p>

<p>既然是采用ASP.NET输出缓存，WCF服务自然需要采用IIS寄宿并采用ASP.NET 兼容模式。值得一提的是，基于AspNetCacheProfileAttribute的输出缓存仅仅针对<font color="#ff0000">HTTP-GET</font>。</p>

<h1><font size="4"><font style="font-weight: bold">二、实例演示：创建采用输出缓存的服务</font></font></h1>

<p>接下来我们通过一个简单的实例来演示如何通过操作行为对某个操作的返回值实施缓存，为此我们创建一个用于返回当前时间的服务。如下所示的是作为服务契约的ITime接口的定义，AspNetCacheProfileAttribute特性被应用到了用于返回当前时间的操作方法GetCurrentTime上。</p>

<div id="codeSnippetWrapper">
  <div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">
    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum1">   1:</span> <span style="color: #0000ff">using</span> System;</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum2">   2:</span> <span style="color: #0000ff">using</span> System.ServiceModel;</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum3">   3:</span> <span style="color: #0000ff">using</span> System.ServiceModel.Web;</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum4">   4:</span> <span style="color: #0000ff">namespace</span> Artech.WcfServices.Service.Interface</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum5">   5:</span> {</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum6">   6:</span>     [ServiceContract(Namespace = <span style="color: #006080">&quot;http://www.artech.com/&quot;</span>)]</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum7">   7:</span>     <span style="color: #0000ff">public</span> <span style="color: #0000ff">interface</span> ITime</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum8">   8:</span>     {</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum9">   9:</span>         [WebGet(UriTemplate = <span style="color: #006080">&quot;/current&quot;</span>)]</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum10">  10:</span>         [AspNetCacheProfile(<span style="color: #006080">&quot;default&quot;</span>)]</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum11">  11:</span>         DateTime GetCurrentTime();</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum12">  12:</span>     }</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum13">  13:</span> }</pre>
<!--CRLF--></div>
</div>

<p>实现了契约接口ITime的服务类型TimeService定义如下。我们将AspNetCompatibilityRequirementsAttribute特性应用在服务类型上并将RequirementsMode属性设置为Allowed以提供对ASP.NET兼容模式的支持。</p>

<div id="codeSnippetWrapper">
  <div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">
    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum1">   1:</span> <span style="color: #0000ff">using</span> System;</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum2">   2:</span> <span style="color: #0000ff">using</span> System.ServiceModel.Activation;</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum3">   3:</span> <span style="color: #0000ff">using</span> Artech.WcfServices.Service.Interface;</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum4">   4:</span> <span style="color: #0000ff">namespace</span> Artech.WcfServices.Service</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum5">   5:</span> {</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum6">   6:</span>&#160;&#160;&#160;&#160; [AspNetCompatibilityRequirements(</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum7">   7:</span>&#160;&#160;&#160;&#160;&#160; RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum8">   8:</span>     <span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> TimeService : ITime</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum9">   9:</span>     {</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum10">  10:</span>         <span style="color: #0000ff">public</span> DateTime GetCurrentTime()</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum11">  11:</span>         {</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum12">  12:</span>             <span style="color: #0000ff">return</span> DateTime.Now;</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum13">  13:</span>         }</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum14">  14:</span>     }</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum15">  15:</span> }</pre>
<!--CRLF--></div>
</div>

<p>在一个Web项目中我们为通过IIS寄宿的服务TimeService添加一个对应的.svc文件（TimeService.svc），如下所示的是&lt;%@ServiceHost%&gt;指令的定义。表示ServiceHostFactory类型的指令属性Factory被设置为System.ServiceModel.Activation.WebServiceHostFactory.</p>

<div id="codeSnippetWrapper">
  <div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">
    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum1">   1:</span> <span style="background-color: #ffff00">&lt;%@ ServiceHost Service=&quot;Artech.WcfServices.Service.TimeService&quot; Factory=&quot;System.ServiceModel.Activation.WebServiceHostFactory&quot;%&gt;</span></pre>
<!--CRLF--></div>
</div>

<p>我们在作为服务宿主的Web项目下添加一个配置文件（Web.config）并定义如下的配置。除了服务寄宿的基本配置外，我们将&lt;system.serviceModel&gt;/&lt;serviceHostingEnvironment &gt;配置节的aspNetCompatibilityEnabled属性设置为True以开启ASP.NET兼容模式。应用在操作方法GetCurrentTime上的AspNetCacheProfileAttribute特性中指定的名称为default的CacheProfile定义在该配置中，duration和varyByParam分别被设置为60和none。</p>

<div id="codeSnippetWrapper">
  <div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">
    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum1">   1:</span> <span style="color: #0000ff">&lt;</span><span style="color: #800000">configuration</span><span style="color: #0000ff">&gt;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum2">   2:</span>     <span style="color: #0000ff">&lt;</span><span style="color: #800000">system.serviceModel</span><span style="color: #0000ff">&gt;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum3">   3:</span>         <span style="color: #0000ff">&lt;</span><span style="color: #800000">services</span><span style="color: #0000ff">&gt;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum4">   4:</span>             <span style="color: #0000ff">&lt;</span><span style="color: #800000">service</span> <span style="color: #ff0000">name</span><span style="color: #0000ff">=&quot;Artech.WcfServices.Service.TimeService&quot;</span><span style="color: #0000ff">&gt;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum5">   5:</span>                 <span style="color: #0000ff">&lt;</span><span style="color: #800000">endpoint</span> <span style="color: #ff0000">binding</span><span style="color: #0000ff">=&quot;webHttpBinding&quot;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum6">   6:</span>                           <span style="color: #ff0000">contract</span><span style="color: #0000ff">=&quot;Artech.WcfServices.Service.Interface.ITime&quot;</span><span style="color: #0000ff">/&gt;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum7">   7:</span>             <span style="color: #0000ff">&lt;/</span><span style="color: #800000">service</span><span style="color: #0000ff">&gt;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum8">   8:</span>         <span style="color: #0000ff">&lt;/</span><span style="color: #800000">services</span><span style="color: #0000ff">&gt;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum9">   9:</span>       <span style="color: #0000ff">&lt;</span><span style="color: #800000">serviceHostingEnvironment</span> <span style="color: #ff0000">aspNetCompatibilityEnabled</span><span style="color: #0000ff">=&quot;true&quot;</span> <span style="color: #0000ff">/&gt;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum10">  10:</span>     <span style="color: #0000ff">&lt;/</span><span style="color: #800000">system.serviceModel</span><span style="color: #0000ff">&gt;</span>  </pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum11">  11:</span>   <span style="color: #0000ff">&lt;</span><span style="color: #800000">system.web</span><span style="color: #0000ff">&gt;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum12">  12:</span>     <span style="color: #0000ff">&lt;</span><span style="color: #800000">caching</span><span style="color: #0000ff">&gt;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum13">  13:</span>       <span style="color: #0000ff">&lt;</span><span style="color: #800000">outputCacheSettings</span><span style="color: #0000ff">&gt;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum14">  14:</span>         <span style="color: #0000ff">&lt;</span><span style="color: #800000">outputCacheProfiles</span><span style="color: #0000ff">&gt;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum15">  15:</span>           <span style="color: #0000ff">&lt;</span><span style="color: #800000">add</span> <span style="color: #ff0000">name</span><span style="color: #0000ff">=&quot;default&quot;</span> <span style="color: #ff0000">duration</span><span style="color: #0000ff">=&quot;60&quot;</span> <span style="color: #ff0000">varyByParam</span><span style="color: #0000ff">=&quot;none&quot;</span><span style="color: #0000ff">/&gt;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum16">  16:</span>         <span style="color: #0000ff">&lt;/</span><span style="color: #800000">outputCacheProfiles</span><span style="color: #0000ff">&gt;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum17">  17:</span>       <span style="color: #0000ff">&lt;/</span><span style="color: #800000">outputCacheSettings</span><span style="color: #0000ff">&gt;</span>      </pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum18">  18:</span>     <span style="color: #0000ff">&lt;/</span><span style="color: #800000">caching</span><span style="color: #0000ff">&gt;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum19">  19:</span>   <span style="color: #0000ff">&lt;/</span><span style="color: #800000">system.web</span><span style="color: #0000ff">&gt;</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum20">  20:</span> <span style="color: #0000ff">&lt;/</span><span style="color: #800000">configuration</span><span style="color: #0000ff">&gt;</span></pre>
<!--CRLF--></div>
</div>

<p>作为客户端的控制台程序在进行了相应配置之后通过如下的代码进行服务的调用。在这段代码中，我们通过创建的服务代理进行了5次服务调用，并将获取的时间打印出来。每次服务的时间间隔为1秒。</p>

<div id="codeSnippetWrapper">
  <div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">
    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum1">   1:</span> <span style="color: #0000ff">using</span> (ChannelFactory&lt;ITime&gt; channelFactory =  <span style="color: #0000ff">new</span> ChannelFactory&lt;ITime&gt;(<span style="color: #006080">&quot;timeService&quot;</span>))</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum2">   2:</span> {</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum3">   3:</span>     ITime proxy = channelFactory.CreateChannel();</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum4">   4:</span>     <span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> i = 0; i &lt; 5; i++)</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum5">   5:</span>     { </pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum6">   6:</span>         Console.WriteLine(proxy.GetCurrentTime().ToLongTimeString());</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum7">   7:</span>         Thread.Sleep(1000);</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum8">   8:</span>     }</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum9">   9:</span> }</pre>
<!--CRLF--></div>
</div>

<p>客户端代码执行之后会在控制台上输出如下的结果。由于服务端通过ASP.NET的输出缓存对第一次执行GetCurrentTime操作的结果进行了缓存，所以客户端返回的时间都是相同的。</p>

<div id="codeSnippetWrapper">
  <div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">
    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum1">   1:</span> 4:48:43 PM</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum2">   2:</span> 4:48:43 PM</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum3">   3:</span> 4:48:43 PM</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum4">   4:</span> 4:48:43 PM</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum5">   5:</span> 4:48:43 PM</pre>
<!--CRLF--></div>
</div>

<br />

<h1><font size="4"><font style="font-weight: bold">三、 AspNetCacheProfileAttribute是如何实现输出缓存的？</font></font></h1>

<p>既然我们采用ASP.NET兼容模式来寄宿服务，意味着我们调用某个服务与访问某个页面没有本质的区别，所以基于Web页面的输出缓存能够应用于基于某个服务操作的调用就不足为奇了。现在有这么一个问题：通过AspNetCacheProfileAttribute特性指定CacheProfile是如何生效的？</p>

<p>如果对ASP.NET具有一定的了解，应该知道可以通过当前HttpResponse（HttpContext.Current.Response）的Cache属性表示的HttpCachePolicy对象来控制当前输出缓存的基本策略。实际上AspNetCacheProfileAttribute就是通过这种方式将定义在指定CacheProfile的缓存策略应用到针对当前操作的调用上的。</p>

<p>具体来说，AspNetCacheProfileAttribute针对输出缓存策略的控制是通过一个实现了接口IParameterInspector的自定义参数检验器实现的，这是一个名称为CachingParameterInspector的内部类型。操作行为AspNetCacheProfileAttribute通过实现的ApplyDispatchBehavior方法将针对某个CacheProfile创建的CachingParameterInspector对象添加到当前分发操作（DispatchOperation）的参数检验器列表中。</p>

<div id="codeSnippetWrapper">
  <div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">
    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum1">   1:</span> <span style="color: #0000ff">internal</span> <span style="color: #0000ff">class</span> CachingParameterInspector : IParameterInspector</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum2">   2:</span> {</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum3">   3:</span>     <span style="color: #0000ff">public</span> CachingParameterInspector(<span style="color: #0000ff">string</span> cacheProfileName);</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum4">   4:</span>     <span style="color: #0000ff">public</span> <span style="color: #0000ff">object</span> BeforeCall(<span style="color: #0000ff">string</span> operationName, <span style="color: #0000ff">object</span>[] inputshens);</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum5">   5:</span>     <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> AfterCall(<span style="color: #0000ff">string</span> operationName, <span style="color: #0000ff">object</span>[] outputs, <span style="color: #0000ff">object</span> returnValue, <span style="color: #0000ff">object</span> correlationState)</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum6">   6:</span>     {</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum7">   7:</span>         <span style="color: #008000">//将指定CacheProfile的输出缓存策略应用到当前HttpResponse</span></pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum8">   8:</span>     }</pre>
<!--CRLF-->

    <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum9">   9:</span> }</pre>
<!--CRLF--></div>
</div>

<p>如上面的代码片断所示，当AfterCall方法被执行的之后，在构造函数中指定的CacheProfile定义的输出缓存策略应用到当前HttpResponse。而AfterCall会在操作执行之后，回复消息序列化之前被执行。</p><img src="aggbug/2344806.html?type=0" width="1" height="1" alt=""/><p>作者: <a href="" target="_blank">Artech</a> 发表于 2012-02-10 08:58 <a href="http://www.cnblogs.com/artech/archive/2012/02/10/wcf-rest-output-caching.html" target="_blank">原文链接</a></p><p>评论: 10　<a href="http://www.cnblogs.com/artech/archive/2012/02/10/wcf-rest-output-caching.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/artech/archive/2012/02/10/wcf-rest-output-caching.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/130752/" target="_blank">苹果征集iPad 3发布会演示应用 重点是图形应用</a><span style="color:gray">(2012-02-10 17:23)</span><br/>· <a href="http://news.cnblogs.com/n/130751/" target="_blank">京东商城涉足汽车销售 将上线售车频道</a><span style="color:gray">(2012-02-10 17:21)</span><br/>· <a href="http://news.cnblogs.com/n/130748/" target="_blank">亚马逊新广告挑衅苹果：一个iPad可买三台kindle</a><span style="color:gray">(2012-02-10 17:20)</span><br/>· <a href="http://news.cnblogs.com/n/130750/" target="_blank">动视暴雪确认今年第二季度推出《暗黑破坏神3》</a><span style="color:gray">(2012-02-10 16:59)</span><br/>· <a href="http://news.cnblogs.com/n/130749/" target="_blank">官方承认 Google Bar 逆行倒施</a><span style="color:gray">(2012-02-10 16:55)</span><br/></p><p>编辑推荐：<a href="http://kb.cnblogs.com/page/130672/" target="_blank">高级编程语言的发展历程</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">我的园子</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://q.cnblogs.com/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>深入理解JavaScript系列（20）：《你真懂JavaScript吗？》答案详解</title><link>http://www.cnblogs.com/TomXu/archive/2012/02/10/2342098.html</link><dc:creator>汤姆大叔</dc:creator><author>汤姆大叔</author><pubDate>Fri, 10 Feb 2012 00:54:00 GMT</pubDate><guid>http://www.cnblogs.com/TomXu/archive/2012/02/10/2342098.html</guid><description><![CDATA[<p><h1>介绍</h1>
<p>昨天发的<a href="http://www.cnblogs.com/TomXu/archive/2012/02/09/2330578.html" target="_blank">《大叔手记（19）：你真懂JavaScript吗？》</a>里面的5个题目，有很多回答，发现强人还是很多的，很多人都全部答对了。</p>
<p>今天我们来对这5个题目详细分析一下，希望对大家有所帮助。</p>
<p>注：</p>
<div class="cnblogs_code">
<pre>问题来自大名鼎鼎的前端架构师Baranovskiy的帖子《<a href="http://dmitry.baranovskiy.com/post/91403200" target="_blank">So, you think you know JavaScript?</a>》。<br />答案也是来自大名鼎鼎的JS牛人Nicholas C. Zakas的帖子《<a href="http://www.nczonline.net/blog/2010/01/26/answering-baranovskiys-javascript-quiz/" target="_blank">Answering Baranovskiy&rsquo;s JavaScript quiz</a>》&mdash;&mdash;《JavaScript高级程序设计》一书的原作者<br />(但题目2的解释貌似有点问题）</pre>
</div>
<p>OK，我们先看第一题</p>
<h1>题目1</h1>
<div class="cnblogs_code">
<pre><span style="color: #0000ff;">if</span> (!("a" <span style="color: #0000ff;">in</span> window)) {<br />    <span style="color: #0000ff;">var</span> a = 1;<br />}<br />alert(a);</pre>
</div>
<p>代码看起来是想说：如果window不包含属性a，就声明一个变量a，然后赋值为1。</p>
<p>你可能认为alert出来的结果是1，然后实际结果是&ldquo;undefined&rdquo;。要了解为什么，我们需要知道JavaScript里的3个概念。</p>
<p>首先，所有的全局变量都是window的属性，语句 var a = 1;等价于window.a = 1; 你可以用如下方式来检测全局变量是否声明：</p>
<div class="cnblogs_code">
<pre>"变量名称" <span style="color: #0000ff;">in</span> window</pre>
</div>
<p>第二，所有的变量声明都在范围作用域的顶部，看一下相似的例子：</p>
<div class="cnblogs_code">
<pre>alert("a" <span style="color: #0000ff;">in</span> window);<br /><span style="color: #0000ff;">var</span> a;</pre>
</div>
<p>此时，尽管声明是在alert之后，alert弹出的依然是true，这是因为JavaScript引擎首先会扫墓所有的变量声明，然后将这些变量声明移动到顶部，最终的代码效果是这样的：</p>
<div class="cnblogs_code">
<pre><span style="color: #0000ff;">var</span> a;<br />alert("a" <span style="color: #0000ff;">in</span> window);</pre>
</div>
<p>这样看起来就很容易解释为什么alert结果是true了。</p>
<p>第三，你需要理解该题目的意思是，变量声明被提前了，但变量赋值没有，因为这行代码包括了变量声明和变量赋值。</p>
<p>你可以将语句拆分为如下代码：</p>
<div class="cnblogs_code">
<pre><span style="color: #0000ff;">var</span> a;    <span style="color: #008000;">//</span><span style="color: #008000;">声明</span><span style="color: #008000;"><br /></span>a = 1;    <span style="color: #008000;">//</span><span style="color: #008000;">初始化赋值</span></pre>
</div>
<p>当变量声明和赋值在一起用的时候，JavaScript引擎会自动将它分为两部以便将变量声明提前，不将赋值的步骤提前是因为他有可能影响代码执行出不可预期的结果。</p>
<p>所以，知道了这些概念以后，重新回头看一下题目的代码，其实就等价于：</p>
<div class="cnblogs_code">
<pre><span style="color: #0000ff;">var</span> a;<br /><span style="color: #0000ff;">if</span> (!("a" <span style="color: #0000ff;">in</span> window)) {<br />    a = 1;<br />}<br />alert(a);</pre>
</div>
<p>这样，题目的意思就非常清楚了：首先声明a，然后判断a是否在存在，如果不存在就赋值为1，很明显a永远在window里存在，这个赋值语句永远不会执行，所以结果是undefined。</p>
<p>大叔注：<em><strong>提前</strong></em>这个词语显得有点迷惑了，其实就是执行上下文的关系，因为执行上下文分2个阶段：进入执行上下文和执行代码，在进入执行上下文的时候，创建变量对象VO里已经有了：函数的所有形参、所有的函数声明、所有的变量声明</p>
<div class="cnblogs_code">
<pre>VO(global) = {<br />    a: undefined<br />}</pre>
</div>
<p>这个时候a已经有了；</p>
<p>然后执行代码的时候才开始走if语句，详细信息请查看<a href="http://www.cnblogs.com/TomXu/archive/2012/01/16/2309728.html" target="_blank">《深入理解JavaScript系列（12）：变量对象（Variable Object）》</a>中的处理上下文代码的2个阶段小节。</p>
<p>大叔注：相信很多人都是认为a在里面不可访问，结果才是undefined的吧，其实是已经有了，只不过初始值是undefined，而不是不可访问。</p>
<h1>题目2</h1>
<div class="cnblogs_code">
<pre><span style="color: #0000ff;">var</span> a = 1,<br />    b = <span style="color: #0000ff;">function</span> a(x) {<br />        x &amp;&amp; a(--x);<br />    };<br />alert(a);</pre>
</div>
<p>这个题目看起来比实际复杂，alert的结果是1；这里依然有3个重要的概念需要我们知道。</p>
<p>首先，在题目1里我们知道了变量声明在进入执行上下文就完成了；第二个概念就是函数声明也是提前的，所有的函数声明都在执行代码之前都已经完成了声明，和变</p>
<p>量声明一样。澄清一下，函数声明是如下这样的代码：</p>
<div class="cnblogs_code">
<pre><span style="color: #0000ff;">function</span> functionName(arg1, arg2){<br />    <span style="color: #008000;">//</span><span style="color: #008000;">函数体</span><span style="color: #008000;"><br /></span>}</pre>
</div>
<p>如下不是函数，而是函数表达式，相当于变量赋值：</p>
<div class="cnblogs_code">
<pre><span style="color: #0000ff;">var</span> functionName = <span style="color: #0000ff;">function</span>(arg1, arg2){<br />    <span style="color: #008000;">//</span><span style="color: #008000;">函数体</span><span style="color: #008000;"><br /></span>};</pre>
</div>
<p>澄清一下，函数表达式没有提前，就相当于平时的变量赋值。</p>
<p>第三需要知道的是，函数声明会覆盖变量声明，但不会覆盖变量赋值，为了解释这个，我们来看一个例子：</p>
<div class="cnblogs_code">
<pre><span style="color: #0000ff;">function</span> value(){<br />    <span style="color: #0000ff;">return</span> 1;<br />}<br /><span style="color: #0000ff;">var</span> value;<br />alert(<span style="color: #0000ff;">typeof</span> value);    <span style="color: #008000;">//</span><span style="color: #008000;">"function"</span></pre>
</div>
<p>尽快变量声明在下面定义，但是变量value依然是function，也就是说这种情况下，函数声明的优先级高于变量声明的优先级，但如果该变量value赋值了，那结果就完全不一样了：</p>
<div class="cnblogs_code">
<pre><span style="color: #0000ff;">function</span> value(){<br />    <span style="color: #0000ff;">return</span> 1;<br />}<br /><span style="color: #0000ff;">var</span> value = 1;<br />alert(<span style="color: #0000ff;">typeof</span> value);    <span style="color: #008000;">//</span><span style="color: #008000;">"number"</span></pre>
</div>
<p>该value赋值以后，变量赋值初始化就覆盖了函数声明。</p>
<p>重新回到题目，这个函数其实是一个有名函数表达式，函数表达式不像函数声明一样可以覆盖变量声明，但你可以注意到，变量b是包含了该函数表达式，而该函数表达式的名字是a；不同的浏览器对a这个名词处理有点不一样，在IE里，会将a认为函数声明，所以它被变量初始化覆盖了，就是说如果调用a(--x)的话就会出错，而其它浏览器在允许在函数内部调用a(--x)，因为这时候a在函数外面依然是数字。基本上，IE里调用b(2)的时候会出错，但其它浏览器则返回undefined。</p>
<p>理解上述内容之后，该题目换成一个更准确和更容易理解的代码应该像这样：</p>
<div class="cnblogs_code">
<pre><span style="color: #0000ff;">var</span> a = 1,<br />    b = <span style="color: #0000ff;">function</span>(x) {<br />        x &amp;&amp; b(--x);<br />    };<br />alert(a);</pre>
</div>
<p>这样的话，就很清晰地知道为什么alert的总是1了，详细内容请参考<a href="http://www.cnblogs.com/TomXu/archive/2011/12/29/2290308.html" target="_blank">《深入理解JavaScript系列（2）：揭秘命名函数表达式》</a>中的内容。</p>
<p><span style="color: #ff6600;">大叔注：安装ECMAScript规范，作者对函数声明覆盖变量声明的解释其实不准确的，正确的理解应该是如下：</span></p>
<p><strong>进入执行上下文</strong>： 这里出现了名字一样的情况，一个是函数申明，一个是变量申明。那么，根据<a href="http://www.cnblogs.com/TomXu/archive/2012/01/16/2309728.html" target="_blank">深入理解JavaScript系列（12）：变量对象（Variable Object）</a>介绍的，填充VO的顺序是: 函数的形参 -&gt; 函数申明 -&gt; 变量申明。<br />上述例子中，变量a在函数a后面，那么，变量a遇到函数a怎么办呢？还是根据变量对象中介绍的，当变量申明遇到VO中已经有同名的时候，不会影响已经存在的属性。而函数表达式不会影响VO的内容，所以b只有在执行的时候才会触发里面的内容。</p>
<h1>题目3</h1>
<div class="cnblogs_code">
<pre><span style="color: #0000ff;">function</span> a(x) {<br />    <span style="color: #0000ff;">return</span> x * 2;<br />}<br /><span style="color: #0000ff;">var</span> a;<br />alert(a);</pre>
</div>
<p>这个题目就是题目2里的大叔加的注释了，也就是函数声明和变量声明的关系和影响，遇到同名的函数声明，VO不会重新定义，所以这时候全局的VO应该是如下这样的：</p>
<div class="cnblogs_code">
<pre>VO(global) = {<br />    a: 引用了函数声明&ldquo;a&rdquo;<br />}</pre>
</div>
<p>而执行a的时候，相应地就弹出了函数a的内容了。</p>
<h1>题目4</h1>
<div class="cnblogs_code">
<pre><span style="color: #0000ff;">function</span> b(x, y, a) {<br />    arguments[2] = 10;<br />    alert(a);<br />}<br />b(1, 2, 3);</pre>
</div>
<p>关于这个题目，NC搬出了262-3的规范出来解释，其实从《<a id="ctl02_lnkTitle" href="http://www.cnblogs.com/TomXu/archive/2012/01/16/2309728.html" target="_blank">深入理解JavaScript系列（12）：变量对象（Variable Object）</a>》中的函数上下文中的变量对象一节就可以清楚地知道，活动对象是在进入函数上下文时刻被创建的，它通过函数的arguments属性初始化。arguments属性的值是Arguments对象：</p>
<div class="cnblogs_code">
<pre>AO = {<br />  arguments: &lt;ArgO&gt;<br />};</pre>
</div>
<p>Arguments对象是活动对象的一个属性，它包括如下属性：</p>
<ol>
<li>callee &mdash; 指向当前函数的引用</li>
<li>length &mdash; 真正传递的参数个数</li>
<li>properties-indexes (字符串类型的整数) 属性的值就是函数的参数值(按参数列表从左到右排列)。 properties-indexes内部元素的个数等于arguments.length. properties-indexes 的值和实际传递进来的参数之间是<strong><span style="color: #ff6600;">共享</span></strong>的。</li>
</ol>
<p>这个共享其实不是真正的共享一个内存地址，而是2个不同的内存地址，使用JavaScript引擎来保证2个值是随时一样的，当然这也有一个前提，那就是这个索引值要小于你传入的参数个数，也就是说如果你只传入2个参数，而还继续使用arguments[2]赋值的话，就会不一致，例如：</p>
<div class="cnblogs_code">
<pre><span style="color: #0000ff;">function</span> b(x, y, a) {<br />    arguments[2] = 10;<br />    alert(a);<br />}<br />b(1, 2);</pre>
</div>
<p>这时候因为没传递第三个参数a，所以赋值10以后，alert(a)的结果依然是undefined，而不是10，但如下代码弹出的结果依然是10，因为和a没有关系。</p>
<div class="cnblogs_code">
<pre><span style="color: #0000ff;">function</span> b(x, y, a) {<br />    arguments[2] = 10;<br />    alert(arguments[2]);<br />}<br />b(1, 2);</pre>
</div>
<h1>题目5</h1>
<div class="cnblogs_code">
<pre><span style="color: #0000ff;">function</span> a() {<br />    alert(<span style="color: #0000ff;">this</span>);<br />}<br />a.call(<span style="color: #0000ff;">null</span>);</pre>
</div>
<p>这个题目可以说是最简单的，也是最诡异的，因为如果没学到它的定义的话，打死也不会知道结果的，关于这个题目，我们先来了解2个概念。</p>
<p>首先，就是this值是如何定义的，当一个方法在对象上调用的时候，this就指向到了该对象上，例如：</p>
<div class="cnblogs_code">
<pre><span style="color: #0000ff;">var</span> object = {<br />    method: <span style="color: #0000ff;">function</span>() {<br />        alert(<span style="color: #0000ff;">this</span> === object);    <span style="color: #008000;">//</span><span style="color: #008000;">true</span><span style="color: #008000;"><br /></span>    }<br />}<br />object.method(); </pre>
</div>
<p>上面的代码，调用method()的时候this被指向到调用它的object对象上，但在全局作用域里，this是等价于window（浏览器中，非浏览器里等价于global），在如果一个function的定义不是属于一个对象属性的时候（也就是单独定义的函数），函数内部的this也是等价于window的，例如：</p>
<div class="cnblogs_code">
<pre><span style="color: #0000ff;">function</span> method() {<br />    alert(<span style="color: #0000ff;">this</span> === window);    <span style="color: #008000;">//</span><span style="color: #008000;">true</span><span style="color: #008000;"><br /></span>}<br />method(); </pre>
</div>
<p>了解了上述概念之后，我们再来了解一下call()是做什么的，call方法作为一个function执行代表该方法可以让另外一个对象作为调用者来调用，call方法的第一个参数是对象调用者，随后的其它参数是要传给调用method的参数（如果声明了的话），例如：</p>
<div class="cnblogs_code">
<pre><span style="color: #0000ff;">function</span> method() {<br />    alert(<span style="color: #0000ff;">this</span> === window);<br />}<br />method();    <span style="color: #008000;">//</span><span style="color: #008000;">true</span><span style="color: #008000;"><br /></span>method.call(document);   <span style="color: #008000;">//</span><span style="color: #008000;">false</span></pre>
</div>
<p>第一个依然是true没什么好说的，第二个传入的调用对象是document，自然不会等于window，所以弹出了false。</p>
<p>另外，根据ECMAScript262规范规定：如果第一个参数传入的对象调用者是null或者undefined的话，call方法将把全局对象（也就是window）作为this的值。所以，不管你什么时候传入null，其this都是全局对象window，所以该题目可以理解成如下代码：</p>
<div class="cnblogs_code">
<pre><span style="color: #0000ff;">function</span> a() {<br />    alert(<span style="color: #0000ff;">this</span>);<br />}<br />a.call(window);</pre>
</div>
<p>所以弹出的结果是[object Window]就很容易理解了。</p>
<h1>总结</h1>
<p>这5个题目虽然貌似有点偏，但实际上考察的依然是基本概念，只有熟知了这些基本概念才能写出高质量代码。</p>
<p>关于JavaScript的基本核心内容和理解基本上在该系列就到此为止了，接下来的章节除了把五大原则剩余的2篇补全依然，会再加两篇关于DOM的文章，然后就开始转向整理关于JavaScript模式与设计模式相关的文章了（大概10篇左右），随后再会花几个章节来一个实战系列。</p>
<h1>更多题目</h1>
<p>如果大家有兴趣，可以继续研究下面的一些题目，详细通过这些题目也可以再次加深对JavaScript基础核心特性的理解。</p>
<p><span style="color: #ff6600;">大叔注：这些题目也是来自出这5个题目的人，当然如果你能答对4个及以上并且想拿高工资的话，请联系我。</span></p>
<ol>
<li>找出数字数组中最大的元素（使用Match.max函数）</li>
<li>转化一个数字数组为function数组（每个function都弹出相应的数字）</li>
<li>给object数组进行排序（排序条件是每个元素对象的属性个数）</li>
<li>利用JavaScript打印出Fibonacci数（不使用全局变量）</li>
<li>实现如下语法的功能：var a = (5).plus(3).minus(6); //2</li>
<li>实现如下语法的功能：var a = add(2)(3)(4); //9</li>
</ol>
<h1>同步与推荐</h1>
<p>本文已同步至目录索引：<span style="font-size: 14pt;"><a href="http://www.cnblogs.com/TomXu/archive/2011/12/15/2288411.html" target="_blank">深入理解JavaScript系列</a></span></p>
<p>深入理解JavaScript系列文章，包括了原创，翻译，转载等各类型的文章，如果对你有用，请推荐支持一把，给大叔写作的动力。</p><img src="aggbug/2342098.html?type=0" width="1" height="1" alt=""/><p>作者: <a href="" target="_blank">汤姆大叔</a> 发表于 2012-02-10 08:54 <a href="http://www.cnblogs.com/TomXu/archive/2012/02/10/2342098.html" target="_blank">原文链接</a></p><p>评论: 42　<a href="http://www.cnblogs.com/TomXu/archive/2012/02/10/2342098.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/TomXu/archive/2012/02/10/2342098.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/130752/" target="_blank">苹果征集iPad 3发布会演示应用 重点是图形应用</a><span style="color:gray">(2012-02-10 17:23)</span><br/>· <a href="http://news.cnblogs.com/n/130751/" target="_blank">京东商城涉足汽车销售 将上线售车频道</a><span style="color:gray">(2012-02-10 17:21)</span><br/>· <a href="http://news.cnblogs.com/n/130748/" target="_blank">亚马逊新广告挑衅苹果：一个iPad可买三台kindle</a><span style="color:gray">(2012-02-10 17:20)</span><br/>· <a href="http://news.cnblogs.com/n/130750/" target="_blank">动视暴雪确认今年第二季度推出《暗黑破坏神3》</a><span style="color:gray">(2012-02-10 16:59)</span><br/>· <a href="http://news.cnblogs.com/n/130749/" target="_blank">官方承认 Google Bar 逆行倒施</a><span style="color:gray">(2012-02-10 16:55)</span><br/></p><p>编辑推荐：<a href="http://kb.cnblogs.com/page/130672/" target="_blank">高级编程语言的发展历程</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">我的园子</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://q.cnblogs.com/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>淘宝API开发系列---淘宝API的测试及使用2</title><link>http://www.cnblogs.com/wuhuacong/archive/2012/02/10/2344722.html</link><dc:creator>伍华聪</dc:creator><author>伍华聪</author><pubDate>Thu, 09 Feb 2012 23:36:00 GMT</pubDate><guid>http://www.cnblogs.com/wuhuacong/archive/2012/02/10/2344722.html</guid><description><![CDATA[<p><p>继续前面一篇随笔《<span class="Apple-style-span" style="font-family: verdana, Arial, Helvetica, sans-serif; line-height: 18px; "><a class="titlelnk" href="http://www.cnblogs.com/wuhuacong/archive/2012/02/09/2344703.html" target="_blank" style="color: red; font-size: 14px; font-weight: bold; text-decoration: underline; "><span>淘宝API开发系列---淘宝API的测试及使用</span></a></span>》，来继续介绍淘宝API的具体代码开发部分，上篇主要是介绍淘宝SDK开发的一些流程及必备的信息，以及掌握如何学会利用API文档、淘宝API测试工具来获取我们所需的数据，其中我一般倾向于获取Json数据，然后进行分析，其中Json数据可以通过JsonView工具（<a href="http://jsonviewer.codeplex.com/">http://jsonviewer.codeplex.com/</a>）进行格式化显示，方便我们了解和区分各个属性的信息。另外淘宝的SDK里面，封装了很多对象，我们通过数据就可以获取到相关的信息了，不过注意的就是，我们每个接口调用，都要传入Fields的属性，如果我们没有指定相应的属性字段，那么接口返回的数据，就没有这项的，淘宝SDK的对象属性就会为空。</p><p><img src="http://images.cnblogs.com/cnblogs_com/wuhuacong/taobao/taobaoJsonData.png" width="712" height="580" alt="" />&nbsp;</p><p>&nbsp;通过以上的工具，我们就能可视化属性的信息了，对接口数据的理解就更加清晰，首先我们来看看我测试例子的运行效果如下所示。</p><p>&nbsp;<img src="http://images.cnblogs.com/cnblogs_com/wuhuacong/taobao/taobaoSDKSample.png" width="952" height="471" alt="" /></p><p>&nbsp;其中上面例子的代码如下所示。</p><div class="cnblogs_code"><div>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="color: #0000FF;">private</span>&nbsp;<span style="color: #0000FF;">void</span>&nbsp;TestUserGet()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">单独用户的信息</span><span style="color: #008000;"><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(<span style="color: #800000;">"</span><span style="color: #800000;">单独用户的信息</span><span style="color: #800000;">"</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UserGetRequest&nbsp;req&nbsp;=&nbsp;<span style="color: #0000FF;">new</span>&nbsp;UserGetRequest();&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">实例化具体API对应的Request类</span><span style="color: #008000;"><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req.Fields&nbsp;=&nbsp;<span style="color: #800000;">"</span><span style="color: #800000;">user_id,nick,created,buyer_credit,type,sex</span><span style="color: #800000;">"</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req.Nick&nbsp;=&nbsp;<span style="color: #800000;">"</span><span style="color: #800000;">wuhuacong</span><span style="color: #800000;">"</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UserGetResponse&nbsp;rsp&nbsp;=&nbsp;myclient.Execute(req);<span style="color: #008000;">//</span><span style="color: #008000;">执行API请求并将该类转换为response对象</span><span style="color: #008000;"><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(rsp.Body);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">if</span>&nbsp;(rsp.User&nbsp;!=&nbsp;<span style="color: #0000FF;">null</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">Console.WriteLine(rsp.User.Nick);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">Console.WriteLine(ObjectToString(rsp.User));</span><span style="color: #008000;"><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;User&gt;&nbsp;list&nbsp;=&nbsp;<span style="color: #0000FF;">new</span>&nbsp;List&lt;User&gt;();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.Add(rsp.User);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">this</span>.winGridView1.DisplayColumns&nbsp;=&nbsp;req.Fields.Replace(<span style="color: #800000;">"</span><span style="color: #800000;">_</span><span style="color: #800000;">"</span>,&nbsp;<span style="color: #800000;">""</span>);<span style="color: #008000;">//</span><span style="color: #008000;">对应字段的属性没有&#8220;_&#8221;字符的</span><span style="color: #008000;"><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">this</span>.winGridView1.DataSource&nbsp;=&nbsp;list;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">private</span>&nbsp;<span style="color: #0000FF;">void</span>&nbsp;TestItemGet()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">单独商品的信息</span><span style="color: #008000;"><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(<span style="color: #800000;">"</span><span style="color: #800000;">单独商品的信息</span><span style="color: #800000;">"</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ItemGetRequest&nbsp;req&nbsp;=&nbsp;<span style="color: #0000FF;">new</span>&nbsp;ItemGetRequest();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req.Fields&nbsp;=&nbsp;<span style="color: #800000;">"</span><span style="color: #800000;">num_iid,title,nick,pic_path,cid,price,type,location.city,delist_time,post_fee</span><span style="color: #800000;">"</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req.NumIid&nbsp;=&nbsp;<span style="color: #800080;">3838293428L</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ItemGetResponse&nbsp;itemRsp&nbsp;=&nbsp;myclient.Execute(req);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">if</span>&nbsp;(itemRsp&nbsp;!=&nbsp;<span style="color: #0000FF;">null</span>&nbsp;&amp;&amp;&nbsp;itemRsp.Item&nbsp;!=&nbsp;<span style="color: #0000FF;">null</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">Console.WriteLine(itemRsp.Item.Nick);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">Console.WriteLine(ObjectToString(itemRsp.Item));</span><span style="color: #008000;"><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;Item&gt;&nbsp;list&nbsp;=&nbsp;<span style="color: #0000FF;">new</span>&nbsp;List&lt;Item&gt;();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.Add(itemRsp.Item);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">this</span>.winGridView1.DisplayColumns&nbsp;=&nbsp;req.Fields.Replace(<span style="color: #800000;">"</span><span style="color: #800000;">_</span><span style="color: #800000;">"</span>,&nbsp;<span style="color: #800000;">""</span>);<span style="color: #008000;">//</span><span style="color: #008000;">对应字段的属性没有&#8220;_&#8221;字符的</span><span style="color: #008000;"><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">this</span>.winGridView1.DataSource&nbsp;=&nbsp;list;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">private</span>&nbsp;<span style="color: #0000FF;">void</span>&nbsp;TestItemSearch()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">查询商品信息（不含类别）</span><span style="color: #008000;"><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(<span style="color: #800000;">"</span><span style="color: #800000;">查询商品信息（不含类别）</span><span style="color: #800000;">"</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ItemsGetRequest&nbsp;req&nbsp;=&nbsp;<span style="color: #0000FF;">new</span>&nbsp;ItemsGetRequest();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req.Fields&nbsp;=&nbsp;<span style="color: #800000;">"</span><span style="color: #800000;">num_iid,title,nick,pic_url,cid,price,type,delist_time,post_fee,score,volume</span><span style="color: #800000;">"</span>;<span style="color: #008000;">//</span><span style="color: #008000;">,location.city,location.state";</span><span style="color: #008000;"><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req.Q&nbsp;=&nbsp;<span style="color: #800000;">"</span><span style="color: #800000;">笔记本</span><span style="color: #800000;">"</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">itemReq.Cid&nbsp;=&nbsp;"14";</span><span style="color: #008000;"><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req.OrderBy&nbsp;=&nbsp;<span style="color: #800000;">"</span><span style="color: #800000;">volume:desc</span><span style="color: #800000;">"</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req.PageNo&nbsp;=&nbsp;<span style="color: #800080;">1</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req.PageSize&nbsp;=&nbsp;<span style="color: #800080;">40</span>;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">显示列表信息</span><span style="color: #008000;"><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ItemsGetResponse&nbsp;itemRsp&nbsp;=&nbsp;myclient.Execute(req);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">if</span>&nbsp;(itemRsp&nbsp;!=&nbsp;<span style="color: #0000FF;">null</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">Console.WriteLine(itemRsp.TotalResults);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">foreach&nbsp;(Item&nbsp;item&nbsp;in&nbsp;itemRsp.Items)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(ObjectToString(item));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">}</span><span style="color: #008000;"><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">this</span>.winGridView1.DisplayColumns&nbsp;=&nbsp;req.Fields.Replace(<span style="color: #800000;">"</span><span style="color: #800000;">_</span><span style="color: #800000;">"</span>,&nbsp;<span style="color: #800000;">""</span>);<span style="color: #008000;">//</span><span style="color: #008000;">对应字段的属性没有&#8220;_&#8221;字符的</span><span style="color: #008000;"><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">this</span>.winGridView1.DataSource&nbsp;=&nbsp;itemRsp.Items;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</div></div><p><span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px; line-height: 19px; ">&nbsp; &nbsp; &nbsp; &nbsp; }</span>&nbsp;</p><p>对于需要获取用户私密信息，如买入卖出等重要信息，还需要获取用户的SessionKey的，我们可以通过下面接口函数，弹出登录窗口，然后登录后，定位到对应的App应用页面，然后页面加载的时候，获取到对应的SessionKey、</p><p><span class="Apple-style-span" style="font-family: Arial; line-height: 25px; "><img src="http://images.cnblogs.com/cnblogs_com/wuhuacong/taobao/login.png" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; " /></span>&nbsp;</p><p>&nbsp;</p><div style="display: inline-block; "></div><span class="Apple-style-span" style="font-family: Arial; line-height: 25px; "><img src="http://images.cnblogs.com/cnblogs_com/wuhuacong/taobao/GetSessionKey.png" width="585" height="485" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; " />&nbsp;</span><p>&nbsp;</p><div class="cnblogs_code"><div>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;判断是否顺利获取SessionKey<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;returns&gt;&lt;/returns&gt;</span><span style="color: #808080;"><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">private</span>&nbsp;<span style="color: #0000FF;">string</span>&nbsp;GetAuthorizeCode(<span style="color: #0000FF;">string</span>&nbsp;appKey)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">string</span>&nbsp;authorizeCode&nbsp;=&nbsp;<span style="color: #800000;">""</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FrmAuthorized&nbsp;dlg&nbsp;=&nbsp;<span style="color: #0000FF;">new</span>&nbsp;FrmAuthorized();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dlg.AppKey&nbsp;=&nbsp;appkey;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">if</span>&nbsp;(dlg.ShowDialog()&nbsp;==&nbsp;DialogResult.OK)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;authorizeCode&nbsp;=&nbsp;dlg.AuthrizeCode;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">if</span>&nbsp;(<span style="color: #0000FF;">string</span>.IsNullOrEmpty(authorizeCode))&nbsp;<span style="color: #0000FF;">return</span>&nbsp;<span style="color: #0000FF;">null</span>;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">string</span>&nbsp;sessionKeyUrl&nbsp;=&nbsp;<span style="color: #0000FF;">string</span>.Format(TOP_AUTH_URL,&nbsp;authorizeCode);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpHelper&nbsp;helper&nbsp;=&nbsp;<span style="color: #0000FF;">new</span>&nbsp;HttpHelper();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">string</span>&nbsp;html&nbsp;=&nbsp;helper.GetHtml(sessionKeyUrl);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">格式<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">top_appkey=1142&amp;top_parameters=xxx&amp;top_session=xxx&amp;top_sign=xxx&amp;encode=utf-8</span><span style="color: #008000;"><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">string</span>&nbsp;reg&nbsp;=&nbsp;<span style="color: #800000;">"</span><span style="color: #800000;">.*?&amp;top_session=(?&lt;session&gt;.*?)&amp;top_sign</span><span style="color: #800000;">"</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">string</span>&nbsp;sessionKey&nbsp;=&nbsp;CRegex.GetText(html,&nbsp;reg,&nbsp;<span style="color: #800080;">1</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">return</span>&nbsp;sessionKey;</div></div><p><span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px; line-height: 19px; ">&nbsp; &nbsp; &nbsp; &nbsp; }</span>&nbsp;</p><p>&nbsp;最后我们看看其中获取已买记录的接口实现如下所示。</p><div class="cnblogs_code"><div>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="color: #0000FF;">private</span>&nbsp;<span style="color: #0000FF;">void</span>&nbsp;TestBuyInfo()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">if</span>&nbsp;(<span style="color: #0000FF;">string</span>.IsNullOrEmpty(sessionKey))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sessionKey&nbsp;=&nbsp;GetAuthorizeCode(<span style="color: #0000FF;">this</span>.appkey);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">买入交易</span><span style="color: #008000;"><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(<span style="color: #800000;">"</span><span style="color: #800000;">买入交易</span><span style="color: #800000;">"</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TradesBoughtGetRequest&nbsp;req&nbsp;=&nbsp;<span style="color: #0000FF;">new</span>&nbsp;TradesBoughtGetRequest();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">req.Fields&nbsp;=&nbsp;"tid,title,price,type,num_iid,seller_nick,buyer_nick,status";</span><span style="color: #008000;"><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req.Fields&nbsp;=&nbsp;<span style="color: #800000;">"</span><span style="color: #800000;">tid,title,price,type,num_iid,seller_nick,buyer_nick,status,receiver_state,receiver_city,receiver_district,receiver_address</span><span style="color: #800000;">"</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req.PageNo&nbsp;=&nbsp;<span style="color: #800080;">1L</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req.PageSize&nbsp;=&nbsp;<span style="color: #800080;">40L</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TradesBoughtGetResponse&nbsp;rsp&nbsp;=&nbsp;myclient.Execute(req,&nbsp;sessionKey);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">if</span>&nbsp;(rsp&nbsp;!=&nbsp;<span style="color: #0000FF;">null</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">Console.WriteLine(rsp.Trades.Count);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">if&nbsp;(rsp.Trades.Count&nbsp;&gt;&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(Trade&nbsp;item&nbsp;in&nbsp;rsp.Trades)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(ObjectToString(item));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">}</span><span style="color: #008000;"><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">this</span>.winGridView1.DisplayColumns&nbsp;=&nbsp;req.Fields.Replace(<span style="color: #800000;">"</span><span style="color: #800000;">_</span><span style="color: #800000;">"</span>,&nbsp;<span style="color: #800000;">""</span>);<span style="color: #008000;">//</span><span style="color: #008000;">对应字段的属性没有&#8220;_&#8221;字符的</span><span style="color: #008000;"><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">this</span>.winGridView1.DataSource&nbsp;=&nbsp;rsp.Trades;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</div></div><p><span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px; line-height: 19px; ">&nbsp; &nbsp; &nbsp; &nbsp; }</span>&nbsp;</p><p>&nbsp;以上利用了我的Winform分页控件进行数据展示，因此代码要简化一些，当然，也可以用DataGridView来进行数据显示，不过代码方面可能要多一些。</p><p>&nbsp;</p><img src="aggbug/2344722.html?type=0" width="1" height="1" alt=""/><p>作者: <a href="" target="_blank">伍华聪</a> 发表于 2012-02-10 07:36 <a href="http://www.cnblogs.com/wuhuacong/archive/2012/02/10/2344722.html" target="_blank">原文链接</a></p><p>评论: 2　<a href="http://www.cnblogs.com/wuhuacong/archive/2012/02/10/2344722.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/wuhuacong/archive/2012/02/10/2344722.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/130752/" target="_blank">苹果征集iPad 3发布会演示应用 重点是图形应用</a><span style="color:gray">(2012-02-10 17:23)</span><br/>· <a href="http://news.cnblogs.com/n/130751/" target="_blank">京东商城涉足汽车销售 将上线售车频道</a><span style="color:gray">(2012-02-10 17:21)</span><br/>· <a href="http://news.cnblogs.com/n/130748/" target="_blank">亚马逊新广告挑衅苹果：一个iPad可买三台kindle</a><span style="color:gray">(2012-02-10 17:20)</span><br/>· <a href="http://news.cnblogs.com/n/130750/" target="_blank">动视暴雪确认今年第二季度推出《暗黑破坏神3》</a><span style="color:gray">(2012-02-10 16:59)</span><br/>· <a href="http://news.cnblogs.com/n/130749/" target="_blank">官方承认 Google Bar 逆行倒施</a><span style="color:gray">(2012-02-10 16:55)</span><br/></p><p>编辑推荐：<a href="http://kb.cnblogs.com/page/130672/" target="_blank">高级编程语言的发展历程</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">我的园子</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://q.cnblogs.com/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>淘宝API开发系列---淘宝API的测试及使用</title><link>http://www.cnblogs.com/wuhuacong/archive/2012/02/09/2344703.html</link><dc:creator>伍华聪</dc:creator><author>伍华聪</author><pubDate>Thu, 09 Feb 2012 15:55:00 GMT</pubDate><guid>http://www.cnblogs.com/wuhuacong/archive/2012/02/09/2344703.html</guid><description><![CDATA[<p><p>在很久之前，由于对淘宝的API开发比较感兴趣，写了几篇关于淘宝API开发方面的随笔《<span class="Apple-style-span" style="font-family: Arial; font-weight: bold; line-height: 25px; "><a id="cb_post_title_url" href="http://www.cnblogs.com/wuhuacong/archive/2010/03/19/1690240.html" style="color: #223355; text-decoration: none; ">淘宝API开发系列--开篇概述</a></span>》和《<span class="Apple-style-span" style="font-family: Arial; font-weight: bold; line-height: 25px; "><a id="cb_post_title_url" href="http://www.cnblogs.com/wuhuacong/archive/2010/03/26/1697005.html" style="color: #223355; text-decoration: underline; ">淘宝API开发系列--商家的绑定</a></span>》等文章，近期由于一客户需要一些淘宝API的例子，而我原来开发的例子已经过去两年了，之前我是基于一个中间组件top4net来进行开发的，这个模块就是在淘宝API SDK的基础上做了一些封装，不过原来的例子确已经不能运行了。</p><p>因此重新捡起行头，继续研究有啥变化的地方，不过发现虽然时间过去已经快两年了，淘宝API的使用模式，一直没有变化过，可能变化的就是API的一些细微的地方吧，因此这次，就摒弃了中间组件的方式，就直接使用淘宝官方提供的taobao-sdk-net.zip(http://dl.open.taobao.com/sdk/taobao-sdk-net.zip) 来进行开发，发现其实模式一样，操作也差不多而已，但是处理起来的细节有很多不同的地方。</p><p>为了进行淘宝的API开发，首先我们需要做下面几件事情。</p><p>1）</p><div style="display: inline-block; "></div><span class="Apple-style-span" style="font-family: Arial; line-height: 25px; ">开发者注册一个账号，</span><p>&nbsp;</p><p><span class="Apple-style-span" style="font-family: Arial; line-height: 25px; ">2）然后为每个淘宝应用注册一个应用程序键（App Key)</span>&nbsp;。</p><p>3）下载淘宝API的SDK并掌握基本的API基础知识和调用，具体可以参考论坛的信息（<a href="http://dev.open.taobao.com/bbs/forum.php">http://dev.open.taobao.com/bbs/forum.php</a>&nbsp;）里面的技术分享区等。</p><p>4）利用SDK接口和对象，传入AppKey或者必要的时候获取并传入SessionKey来进行程序开发。</p><p>5）利用淘宝平台的文档中心和API测试工具，对接口进行测试。从而了解返回信息，方便程序获取。</p><p>&nbsp;</p><p>以上是一般淘宝API应用开发的关键流程，其中通过淘宝文档中心和API测试工具，进行概念了解和接口信息查询很重要。因为这些数据就是我们需要在逐步显示出来的。淘宝的API很多，不过都分为了好几个领域，慢慢就会了解深入了。</p><p><img src="http://images.cnblogs.com/cnblogs_com/wuhuacong/taobao/taobaoDoc.png" width="648" height="541" alt="" />&nbsp;</p><p>&nbsp;</p><p>然后我们也可以通过淘宝平台的API测试工具来了解返回的数据信息，每个淘宝API最下面一般都有一个API工具的内容，如下所示。其中我们选择【API Tools在线测试工具】就可以测试返回的接口数据了。</p><p><img src="http://images.cnblogs.com/cnblogs_com/wuhuacong/taobao/taobaoDocAPI.png" width="835" height="157" alt="" />&nbsp;</p><p><img src="http://images.cnblogs.com/cnblogs_com/wuhuacong/taobao/taobaoAPITest.png" width="1002" height="619" alt="" />&nbsp;</p><p>&nbsp;</p><p>对于以上这些淘宝API接口，不需要Session就可以访问的，就直接利用【系统分配】的内容就可以访问并获取到数据了。注意其中红色圈中部分即可。</p><p>对于有一些用户方面的私密数据，如交易数据，买入或者卖出的数据，我们就要自定义指定自己的SessionKey了，如下所示。</p><p><img src="http://images.cnblogs.com/cnblogs_com/wuhuacong/taobao/taobaoAPITest2.png" width="1033" height="500" alt="" />&nbsp;</p><p>&nbsp;</p><p>&nbsp;卖出的信息，也需要传入SessionKey的信息，在程序中处理，得到下面的结果。</p><p><img src="http://images.cnblogs.com/cnblogs_com/wuhuacong/taobao/SoldOut.jpg" alt="" />&nbsp;</p><p>&nbsp;</p><img src="aggbug/2344703.html?type=0" width="1" height="1" alt=""/><p>作者: <a href="" target="_blank">伍华聪</a> 发表于 2012-02-09 23:55 <a href="http://www.cnblogs.com/wuhuacong/archive/2012/02/09/2344703.html" target="_blank">原文链接</a></p><p>评论: 3　<a href="http://www.cnblogs.com/wuhuacong/archive/2012/02/09/2344703.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/wuhuacong/archive/2012/02/09/2344703.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/130752/" target="_blank">苹果征集iPad 3发布会演示应用 重点是图形应用</a><span style="color:gray">(2012-02-10 17:23)</span><br/>· <a href="http://news.cnblogs.com/n/130751/" target="_blank">京东商城涉足汽车销售 将上线售车频道</a><span style="color:gray">(2012-02-10 17:21)</span><br/>· <a href="http://news.cnblogs.com/n/130748/" target="_blank">亚马逊新广告挑衅苹果：一个iPad可买三台kindle</a><span style="color:gray">(2012-02-10 17:20)</span><br/>· <a href="http://news.cnblogs.com/n/130750/" target="_blank">动视暴雪确认今年第二季度推出《暗黑破坏神3》</a><span style="color:gray">(2012-02-10 16:59)</span><br/>· <a href="http://news.cnblogs.com/n/130749/" target="_blank">官方承认 Google Bar 逆行倒施</a><span style="color:gray">(2012-02-10 16:55)</span><br/></p><p>编辑推荐：<a href="http://kb.cnblogs.com/page/130672/" target="_blank">高级编程语言的发展历程</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">我的园子</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://q.cnblogs.com/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>【翻译】C#编程语言和JAVA编程语言的比较（上）</title><link>http://www.cnblogs.com/lovecindywang/archive/2012/02/09/2344315.html</link><dc:creator>lovecindywang</dc:creator><author>lovecindywang</author><pubDate>Thu, 09 Feb 2012 09:57:00 GMT</pubDate><guid>http://www.cnblogs.com/lovecindywang/archive/2012/02/09/2344315.html</guid><description><![CDATA[<p><p>原文地址：<a title="http://www.25hoursaday.com/CsharpVsJava.html" href="http://www.25hoursaday.com/CsharpVsJava.html">http://www.25hoursaday.com/CsharpVsJava.html</a></p>
<p>&nbsp;</p>
<p><strong>简介</strong></p>
<p>&nbsp;</p>
<p>C#语言是一门面向对象的语言，开发者可以使用C#和微软.NET平台快速构建各种应用程序。C#和.NET平台的目标是把开发者从一些诸如内存管理、类型安全问题、底层类库、数组边界检查等等的底层问题中解放出来并节约大量的时间，这样开发者就可以真正把时间和精力放在他们的应用程序和业务逻辑上。对于Java开发者来说，把前面那句话的开头改为&ldquo;Java语言和平台&rdquo;，这句话也同样可以总结Java语言和平台。</p>
<p>&nbsp;</p>
<p>后面的内容介绍了C#和Java编程语言的异同，这些都是基于我使用两个语言的经历。所有代码都经过微软.NET框架2.0以及Java SE 6的测试。</p>
<p>&nbsp;</p>
<p><em>注意：作者有些代码不符合.NET 3.5或JAVA SE 7（或以上）版本的最佳实践写法并且也不能覆盖它们所提供的新语法和新特性，但不影响本文的重点也就是平台的比较。</em></p>
<p>&nbsp;</p>
<p><strong>第一部分：C#和JAVA基本一致的地方</strong></p>
<p>&nbsp;</p>
<p>1、我们都是Object</p>
<p>&nbsp;</p>
<p>C#的类层次中有一个根，也就是所有C#的类都是System.Object的子类，Java也是这样，所有类都是java.lang.Object的子类。两个语言的Object类的方法有些相同（比如System.Object的ToString()和java.lang.Object的toString()），也有一些不同（System.Object没有java.lang.Object中的wait()、notify()或notifyAll()）。</p>
<p>&nbsp;</p>
<p><em>注意：在C#中object类可以写成object或Object。小写的object C#关键字在编译的时候会替换为System.Object。</em></p>
<p>&nbsp;</p>
<p>2、关键字一览</p>
<p>&nbsp;</p>
<p>Java和C#有很多语法很相似，除了throws、transient和strictfp几乎所有Java关键字都有C#的对应。下表示Java和C#的关键字对照表，Java关键字标红而C#关键字标蓝。</p>
<p>&nbsp;</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/lovecindywang/201202/201202091756596637.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/lovecindywang/201202/201202091757006562.png" alt="image" width="689" height="879" border="0" /></a></p>
<p>&nbsp;</p>
<p><em>注意：尽管goto和const是Java语言的关键字，但是在Java中并没有用到。C#中的<code>[NonSerialized]特性等价于Java中的transient关键字。</code></em></p>
<p>&nbsp;</p>
<p><code>3、虚拟机和语言运行时</code></p>
<p>&nbsp;</p>
<p><code>Java一般编译成Java字节码并运行于托管的执行环境（Java虚拟机、JVM），同样，C#代码编译成中间语言（IL）运行于公共语言运行时（CLR）。两个平台都通过JIT编译器提供本机编译。</code></p>
<p>&nbsp;</p>
<p><code><em>注意：虽然Java平台支持字节码的解释和JIT编译两种方式，但是.NET平台只支持C#代码的本机执行，IL代码在运行前总是会编译成本机代码。</em></code></p>
<p>&nbsp;</p>
<p><code>4、基于堆和垃圾收集</code></p>
<p>&nbsp;</p>
<p><code>在Java中，对象使用new关键字创建在堆上。在C#中大多数类使用new关键字创建在堆上。和JVM一样，CLR也是通过标记和压缩垃圾回收算法管理销毁对象。</code></p>
<p>&nbsp;</p>
<p><code><em>注意：C#还支持基于栈的类，叫做值类型，后文会介绍到这个。</em></code></p>
<p>&nbsp;</p>
<p><code>5、数组可以是交错的</code></p>
<p>&nbsp;</p>
<p><code>对于C或C++这样的语言，多维数组的每一个子数组都必须有相同的维度。在Java和C#中数组不必统一，交错数组可以认为是数组的一维数组。交错数组的项就是保持类型或引用的另一个数组，这样交错数组的行和列就不需要有统一的长度，如下代码所示：</code></p>
<p>&nbsp;</p>
<pre class="csharpcode"><span class="kwrd">int</span> [][]myArray = <span class="kwrd">new</span> <span class="kwrd">int</span>[2][]; 
  myArray[0] = <span class="kwrd">new</span> <span class="kwrd">int</span>[3]; 
  myArray[1] = <span class="kwrd">new</span> <span class="kwrd">int</span>[9];</pre>
<p><span style="font-family: Courier New;">6、没有全局方法</span></p>
<p>&nbsp;</p>
<p><span style="font-family: Courier New;">和Java一样，和C++不一样，C#中的方法必须是类的一部分，作为成员方法或静态方法。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: Courier New;">7、有接口但没有多重继承</span></p>
<p>&nbsp;</p>
<p><span style="font-family: Courier New;">C#和Java一样支持接口的概念，接口类似纯抽象类。C#和Java一样都支持类的单继承，但支持借口的多重继承（或实现）。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: Courier New;">8、字符串不可变</span></p>
<p>&nbsp;</p>
<p><span style="font-family: Courier New;">C#的System.String类和java.lang.String类相似。它们都是不可变的，也就是字符串的值在创建后一次都不能修改。字符串提供的一些实例方法看似可以修改字符串的内容，其实是创建了一个新的字符串并返回，原始的字符串并没有修改。如下的C#和Java代码都没有修改字符串：</span></p>
<p>&nbsp;</p>
<pre class="csharpcode">C# Code
   String csString = <span class="str">"Apple Jack"</span>; 
   csString.ToLower(); 
Java Code
   String jString = <span class="str">"Grapes"</span>; 
   jString.toLowerCase(); </pre>
<style><!--
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
--></style>
<p>&nbsp;</p>
<p><code>9、密封类</code></p>
<p>&nbsp;</p>
<p><code>Java和C#都提供了一种机制确保类是继承体系中的最后一个，不可以有子类。在Java中可以为类修饰final关键字，而C#则通过sealed关键字修饰类。如下是两种语言密封类的例子：</code></p>
<pre class="csharpcode">C# Code
 <span class="kwrd">sealed</span> <span class="kwrd">class</span> Student {
   <span class="kwrd">string</span> fname;
   <span class="kwrd">string</span> lname;
   <span class="kwrd">int</span> uid;
   <span class="kwrd">void</span> attendClass() {}
} 

Java Code
 final <span class="kwrd">class</span> Student {
   String fname;
   String lname;
   <span class="kwrd">int</span> uid;
   <span class="kwrd">void</span> attendClass() {}
} </pre>
<style><!--
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
--></style>
<p>&nbsp;</p>
<p>10、抛出和捕获异常</p>
<p>&nbsp;</p>
<p>C#和Java的异常有很多相似的地方。两种语言都使用try块来表示需要守护的区域，catch块来处理抛出的异常，finally块在离开方法之前释放资源。两种语言都有继承体系，所有的异常都从一个Exception类继承。并且都可以在捕获到异常并进行了一些错误处理之后重新抛出异常。最后，它们都提供了机制把异常包装成另外一个异常，这样就可以捕获到一个异常后抛出另一个异常。这里可以举一个例子，比如三层结构的应用程序，数据访问的时候捕获到了一个SQLException，可以抛出一个应用程序相关的异常。这样的话，应用程序异常可以使用原始的SQLException来初始化，处理应用程序异常的时候如果需要还可以访问到原始的异常。如下代码演示了两种语言在异常方面的相似：</p>
<pre class="csharpcode">C# Code
<span class="kwrd">using</span> System;
<span class="kwrd">using</span> System.IO; 

<span class="kwrd">class</span> MyException: Exception{

  <span class="kwrd">public</span> MyException(<span class="kwrd">string</span> message): <span class="kwrd">base</span>(message){ }

  <span class="kwrd">public</span> MyException(<span class="kwrd">string</span> message, Exception innerException): 
    <span class="kwrd">base</span>(message, innerException){ }


}

<span class="kwrd">public</span> <span class="kwrd">class</span> ExceptionTest {
    
    
    <span class="kwrd">static</span> <span class="kwrd">void</span> DoStuff(){  
    <span class="kwrd">throw</span> <span class="kwrd">new</span> FileNotFoundException();  
    }
    
    
    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> Main(<span class="kwrd">string</span>[] args){

    <span class="kwrd">try</span>{            

        <span class="kwrd">try</span>{        
        
        DoStuff(); 
        <span class="kwrd">return</span>;  <span class="rem">//won't get to execute </span>

        }<span class="kwrd">catch</span>(IOException ioe){ <span class="rem">/* parent of FileNotFoundException */</span> 
        
        <span class="kwrd">throw</span> <span class="kwrd">new</span> MyException(<span class="str">"MyException occured"</span>, ioe); <span class="rem">/* rethrow new exception with inner exception specified */</span>
        }
        
    }<span class="kwrd">finally</span>{
        
        Console.WriteLine(<span class="str">"***Finally block executes even though MyException not caught***"</span>);
    
    }
    
}<span class="rem">//Main(string[])</span>

} <span class="rem">// ExceptionTest</span>

Java Code

<span class="kwrd">class</span> MyException extends Exception{

    <span class="kwrd">public</span> MyException(String message){ super(message); }
    
    <span class="kwrd">public</span> MyException(String message, Exception innerException){ super(message, innerException); }


}

<span class="kwrd">public</span> <span class="kwrd">class</span> ExceptionTest {
    
    
    <span class="kwrd">static</span> <span class="kwrd">void</span> doStuff(){  
    <span class="kwrd">throw</span> <span class="kwrd">new</span> ArithmeticException();    
    }
    
    
    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> main(String[] args) throws Exception{
    
    <span class="kwrd">try</span>{            
        
        <span class="kwrd">try</span>{        
        
        doStuff(); 
        <span class="kwrd">return</span>;  <span class="rem">//won't get to execute </span>
        
        }<span class="kwrd">catch</span>(RuntimeException re){ <span class="rem">/* parent of ArithmeticException */</span> 
        
        <span class="kwrd">throw</span> <span class="kwrd">new</span> MyException(<span class="str">"MyException occured"</span>, re); <span class="rem">/* rethrow new exception with cause specified */</span>
        }
        
    }<span class="kwrd">finally</span>{
        
        System.<span class="kwrd">out</span>.println(<span class="str">"***Finally block executes even though MyException not caught***"</span>);
    
    }
    
}<span class="rem">//main(string[])</span>

} <span class="rem">// ExceptionTest</span></pre>
<style><!--
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
--></style>
<p>&nbsp;</p>
<p>11、定义的时候进行成员初始化和静态构造方法</p>
<p>&nbsp;</p>
<p>C#和Java中都可以在定义实例和静态变量的时候进行初始化。如果成员变量是实例变量则在构造方法执行之前调用，静态成员则在第一次使用成员以及第一次创建类实例之前初始化。还可以指定一段代码在类创建之前或静态方法调用之前被调用。这段代码在C中叫做静态构造方法而在Java中叫做静态初始化块。静态构造方法会在第一次调用类的静态方法或第一次创建类实例之前调用。</p>
<p>&nbsp;</p>
<pre class="csharpcode"><span class="kwrd">using</span> System; 

<span class="kwrd">class</span> StaticInitTest{


    <span class="kwrd">string</span> instMember = InitInstance(); 

    <span class="kwrd">static</span> <span class="kwrd">string</span> staMember = InitStatic(); 
    

    StaticInitTest(){
    Console.WriteLine(<span class="str">"In instance constructor"</span>);
    }

    <span class="kwrd">static</span> StaticInitTest(){
    Console.WriteLine(<span class="str">"In static constructor"</span>);
    }


    <span class="kwrd">static</span> String InitInstance(){
    Console.WriteLine(<span class="str">"Initializing instance variable"</span>);
    <span class="kwrd">return</span> <span class="str">"instance"</span>;
    }

     <span class="kwrd">static</span> String InitStatic(){
    Console.WriteLine(<span class="str">"Initializing static variable"</span>);
    <span class="kwrd">return</span> <span class="str">"static"</span>;
    }


    <span class="kwrd">static</span> <span class="kwrd">void</span> DoStuff(){
    Console.WriteLine(<span class="str">"Invoking static DoStuff() method"</span>);
    }

    
    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> Main(<span class="kwrd">string</span>[] args){

    Console.WriteLine(<span class="str">"Beginning main()"</span>);

    StaticInitTest.DoStuff(); 
    
    StaticInitTest sti = <span class="kwrd">new</span> StaticInitTest(); 

    Console.WriteLine(<span class="str">"Completed main()"</span>);

    }

}</pre>
<style><!--
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
--></style>
<pre class="csharpcode"><span class="kwrd">class</span> Main{


    String instMember = initInstance(); 

    <span class="kwrd">static</span> String staMember = initStatic(); 
    

    Main(){
    System.<span class="kwrd">out</span>.println(<span class="str">"In instance constructor"</span>);
    }

    <span class="kwrd">static</span>{
    System.<span class="kwrd">out</span>.println(<span class="str">"In static constructor"</span>);
    }


    <span class="kwrd">static</span> String initInstance(){
    System.<span class="kwrd">out</span>.println(<span class="str">"Initializing instance variable"</span>);
    <span class="kwrd">return</span> <span class="str">"instance"</span>;
    }

     <span class="kwrd">static</span> String initStatic(){
    System.<span class="kwrd">out</span>.println(<span class="str">"Initializing static variable"</span>);
    <span class="kwrd">return</span> <span class="str">"static"</span>;
    }


    <span class="kwrd">static</span> <span class="kwrd">void</span> doStuff(){
    System.<span class="kwrd">out</span>.println(<span class="str">"Invoking static DoStuff() method"</span>);
    }

    
    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> main(String[] args){

    System.<span class="kwrd">out</span>.println(<span class="str">"Beginning main()"</span>);

    Main.doStuff(); 
    
    Main sti = <span class="kwrd">new</span> Main(); 

    System.<span class="kwrd">out</span>.println(<span class="str">"Completed main()"</span>);

    }

}</pre>
<style><!--
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
--></style>
<p>&nbsp;</p>
<p>代码执行结果：</p>
<p>Initializing static variable <br />In static constructor <br />Beginning main() <br />Invoking static DoStuff() method <br />Initializing instance variable <br />In instance constructor <br />Completed main()</p>
<p>&nbsp;</p>
<p><em>注意：这里作者的代码有误，小小修改了一下</em></p>
<p>&nbsp;</p>
<p>12、装箱</p>
<p>&nbsp;</p>
<p>在某些情况下，值类型需要当做对象，.NET和Java运行时会自动把值类型转换成在堆上分配的引用类型，这个过程叫做装箱。自动把对象转换成相应的值类型的过程叫做拆箱，比如把java.lang.Integer的实例转换成int。如下例子演示了运行时发生装箱的各种情况：</p>
<p>&nbsp;</p>
<pre class="csharpcode">C# Code
<span class="kwrd">using</span> System; 
<span class="kwrd">using</span> System.Collections;

<span class="rem">//分配在栈上的结构需要装箱才能当做object</span>
<span class="kwrd">struct</span> Point{

  <span class="rem">//member fields </span>
    <span class="kwrd">private</span> <span class="kwrd">int</span> x; 
    <span class="kwrd">private</span> <span class="kwrd">int</span> y; 

    <span class="kwrd">public</span> Point (<span class="kwrd">int</span> x, <span class="kwrd">int</span> y){
  
    <span class="kwrd">this</span>.x = x;
    <span class="kwrd">this</span>.y = y; 

    } 
    
    <span class="kwrd">public</span> <span class="kwrd">override</span> <span class="kwrd">string</span> ToString(){

    <span class="kwrd">return</span> String.Format(<span class="str">"({0}, {1})"</span>, x, y); 

    }


}<span class="rem">//Point</span>

<span class="kwrd">class</span> Test{


     <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> PrintString(<span class="kwrd">object</span> o){

     Console.WriteLine(o);

     }

     <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> Main(<span class="kwrd">string</span>[] args){

       Point p = <span class="kwrd">new</span> Point(10, 15); 
       ArrayList list = <span class="kwrd">new</span> ArrayList(); 
       <span class="kwrd">int</span> z = 100;

       PrintString(p); <span class="rem">//p在传参的时候装箱了</span>
       PrintString(z); <span class="rem">//z在传参的时候装箱了</span>

       <span class="rem">// 在保存到集合的时候int和float装箱了</span>
       <span class="rem">// 不需要Java的包装类 </span>
       list.Add(1); 
       list.Add(13.12); 
       list.Add(z); 
       
       <span class="kwrd">for</span>(<span class="kwrd">int</span> i =0; i &lt; list.Count; i++)
       PrintString(list[i]);    
       
     }

}</pre>
<style><!--
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
--></style>
<pre class="csharpcode">Java Code
import java.util.*;

<span class="kwrd">class</span> Test{

<span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> PrintString(Object o){

 System.<span class="kwrd">out</span>.println(o);

}

<span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> PrintInt(<span class="kwrd">int</span> i){

 System.<span class="kwrd">out</span>.println(i); 
  
}

<span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> main(String[] args){

 Vector list = <span class="kwrd">new</span> Vector(); 
 <span class="kwrd">int</span> z = 100;
 Integer x = <span class="kwrd">new</span> Integer(300);
 PrintString(z); <span class="rem">//z boxed to object when passed to PrintString</span>
 PrintInt(x); <span class="rem">//x unboxed to int when passed to PrintInt</span>

 <span class="rem">// integers and float boxed when stored in collection </span>
 <span class="rem">// therefore no need for Java wrapper classes </span>
 list.add(1); 
 list.add(13.12); 
 list.add(z); 
       
 <span class="kwrd">for</span>(<span class="kwrd">int</span> i =0; i &lt; list.size(); i++)
   PrintString(list.elementAt(i));    
       
}

}</pre>
<style><!--
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
--></style>
<p>&nbsp;</p>
<p><strong>第二部分：C#和JAVA基本一致但语法不同的地方</strong> </p>
<p>1、Main方法</p>
<p>&nbsp;</p>
<p>C#和Java程序的入口点都是main方法。表面区别是C#的Main方法是大写的M（.NET框架的方法名的惯例），而Java中的main方法是小写字母m（同样也是Java方法的惯例）。还有一个区别就是C#的Main()方法可以没有参数。</p>
<p>&nbsp;</p>
<pre class="csharpcode">C# Code
 <span class="kwrd">using</span> System; 

 <span class="kwrd">class</span> A{
   
   <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> Main(String[] args){
   
     Console.WriteLine(<span class="str">"Hello World"</span>); 
   
   }
} 

Java Code
 <span class="kwrd">class</span> B{
   
   <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> main(String[] args){
   
     System.<span class="kwrd">out</span>.println(<span class="str">"Hello World"</span>); 
   
   }
} </pre>
<style><!--
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
--></style>
<p>&nbsp;</p>
<p>一般推荐应用程序的每一个类都有一个main方法来测试类的功能，比如可能有两个类A和B都包含main方法。在Java中，类是编译的单元，只需要通过命令行指定需要运行的类，在C#中也可以使用/main开关编译应用程序指定应用程序创建时使用哪个main作为入口点实现相同的效果。使用main以及预处理指令条件编译是不错的测试技术。</p>
<p>&nbsp;</p>
<pre class="csharpcode">Java Example
C:\CodeSample&gt; javac A.java B.java 

C:\CodeSample&gt; java A
 Hello World from <span class="kwrd">class</span> A

C:\CodeSample&gt; java B
 Hello World from <span class="kwrd">class</span> B

C# Example
C:\CodeSample&gt; csc /main:A /<span class="kwrd">out</span>:example.exe A.cs B.cs 

C:\CodeSample&gt; example.exe
 Hello World from <span class="kwrd">class</span> A

C:\CodeSample&gt; csc /main:B /<span class="kwrd">out</span>:example.exe A.cs B.cs 

C:\CodeSample&gt; example.exe
 Hello World from <span class="kwrd">class</span> B</pre>
<p><br />对于Java，改变使用的main不需要进行重新编译，而C#应用程序需要重新编译。但是，从另一方面来说，Java又不支持条件编译，main方法可能就会带入发行版本中。</p>
<p>&nbsp;</p>
<p>2、继承语法</p>
<p>&nbsp;</p>
<p>C#对于继承使用了C++的语法，都使用冒号来实现继承和接口实现，在Java中则是extends和implements关键字。</p>
<p>&nbsp;</p>
<pre class="csharpcode">C# Code
 <span class="kwrd">using</span> System;

 <span class="kwrd">class</span> B:A, IComparable{
   
  <span class="kwrd">int</span> CompareTo(){}

   <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> Main(String[] args){
   
     Console.WriteLine(<span class="str">"Hello World"</span>); 
   
   }
} 

Java Code
 <span class="kwrd">class</span> B extends A implements Comparable{
   
   <span class="kwrd">int</span> compareTo(){}

   <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> main(String[] args){
   
     System.<span class="kwrd">out</span>.println(<span class="str">"Hello World"</span>); 
   
   }
} </pre>
<p>&nbsp;</p>
<p>C#的这种语法更符合从C++转来开发者的习惯，而Java的语法则可以通过类的声明直接知道类是子类呢还是只是实现了接口，C#则无法区分。但是我们知道根据.NET的命名约定，接口需要以大写的字母I打头，比如ICloneable，这样就不会有这个问题了。</p>
<p>&nbsp;</p>
<p>3、运行时类型标识（is操作符）</p>
<p>&nbsp;</p>
<p>C#的js操作符和Java的instanceof操作符一样。如下代码等价：</p>
<pre class="csharpcode">C# Code

  <span class="kwrd">if</span>(x <span class="kwrd">is</span> MyClass)
   MyClass mc = (MyClass) x;

Java Code

  <span class="kwrd">if</span>(x instanceof MyClass)
   MyClass mc = (MyClass) x;</pre>
<style><!--
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
--></style>
<p>&nbsp;</p>
<p>4、命名空间</p>
<p>&nbsp;</p>
<p>C#命名空间是对类进行分组的方式，和Java的包构造差不多。使用C++的人会发现C#命名空间和C++的差不多，在Java中，包名字代笔应用程序中源文件目录结构，而C#的命名空间则不会要求源文件的物理层次和逻辑结构有关联：</p>
<p>&nbsp;</p>
<pre class="csharpcode">C# Code

  <span class="kwrd">namespace</span> com.carnage4life{

   <span class="kwrd">public</span> <span class="kwrd">class</span> MyClass {
 
   <span class="kwrd">int</span> x; 

   <span class="kwrd">void</span> doStuff(){}

   }

 }

Java Code
  package com.carnage4life;

  <span class="kwrd">public</span> <span class="kwrd">class</span> MyClass {
 
  <span class="kwrd">int</span> x; 

  <span class="kwrd">void</span> doStuff(){}

 }</pre>
<style><!--
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
--></style>
<p>C#的命名空间语法允许进行命名空间的嵌套，如下：</p>
<p>&nbsp;</p>
<pre class="csharpcode">C# Code
  <span class="kwrd">using</span> System;

  <span class="kwrd">namespace</span> Company{
    
    <span class="kwrd">public</span> <span class="kwrd">class</span> MyClass { <span class="rem">/* Company.MyClass */</span> 
 
        <span class="kwrd">int</span> x; 

        <span class="kwrd">void</span> doStuff(){}

        } 

    <span class="kwrd">namespace</span> Carnage4life{
    
       <span class="kwrd">public</span> <span class="kwrd">class</span> MyOtherClass {  <span class="rem">/* Company.Carnage4life.MyOtherClass */</span> 
 
        <span class="kwrd">int</span> y; 

        <span class="kwrd">void</span> doOtherStuff(){}
    
       <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> Main(<span class="kwrd">string</span>[] args){
    
        Console.WriteLine(<span class="str">"Hey, I can nest namespaces"</span>); 
       }

      }<span class="rem">// class MyOtherClass</span>
       }<span class="rem">// namespace Carnage4life</span>
   }// <span class="kwrd">namespace</span> Company </pre>
<style><!--
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
--></style>
<p>&nbsp;</p>
<p>5、构造方法、析构方法以及终结器</p>
<p>&nbsp;</p>
<p>C#中的构造方法的语法和语义和Java一样。C#还有析构方法的概念，这和C++的析构器语法比较相似，和Java的终结器语义一致。尽管存在析构方法这样的语法，但是还是不推荐使用，有许多原因。首先我们没有办法控制它运行的时间，如果在析构方法里面还持有其它引用的话情况更复杂，其次还会带来性能问题，因为垃圾回收线程不能直接回收带有析构方法的对象，必须等到终结器线程执行之后才可以回收，这样具有析构方法的对象可能比没有析构方法的对象存在的时间更长。如下是C#和Java的例子：</p>
<pre class="csharpcode">C# Code
<span class="kwrd">using</span> System; 

  <span class="kwrd">public</span> <span class="kwrd">class</span> MyClass {
 
     <span class="kwrd">static</span> <span class="kwrd">int</span> num_created = 0; 
     <span class="kwrd">int</span> i = 0;    

      MyClass(){  
        i = ++num_created; 
        Console.WriteLine(<span class="str">"Created object #"</span> + i);    
     }

     ~MyClass(){
         Console.WriteLine(<span class="str">"Object #"</span> + i + <span class="str">" is being finalized"</span>);  
     }

    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> Main(<span class="kwrd">string</span>[] args){

    <span class="kwrd">for</span>(<span class="kwrd">int</span> i=0; i &lt; 10000; i++)
      <span class="kwrd">new</span> MyClass(); 
    
    }

   }

Java Code
  <span class="kwrd">public</span> <span class="kwrd">class</span> MyClass {
 
     <span class="kwrd">static</span> <span class="kwrd">int</span> num_created = 0; 
     <span class="kwrd">int</span> i = 0;    

      MyClass(){  
        i = ++num_created; 
        System.<span class="kwrd">out</span>.println(<span class="str">"Created object #"</span> + i);    
     }

     <span class="kwrd">public</span> <span class="kwrd">void</span> finalize(){
        System.<span class="kwrd">out</span>.println(<span class="str">"Object #"</span> + i + <span class="str">" is being finalized"</span>);  
     }

    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> main(String[] args){

    <span class="kwrd">for</span>(<span class="kwrd">int</span> i=0; i &lt; 10000; i++)
      <span class="kwrd">new</span> MyClass(); 
    
    }

   }</pre>
<p>&nbsp;</p>
<p><em>注意：在C#中析构方法（终结器）会在执行后自动调用基类的终结器，Java中不会。</em></p>
<p>&nbsp;</p>
<p>6、同步方法和代码块</p>
<p>&nbsp;</p>
<p>在Java中可以指定同步块来确保在同一时刻只有一个线程访问某个对象，C#提供了lock语句对应Java的synchronized语句。</p>
<p>&nbsp;</p>
<pre class="csharpcode">C# Code

 <span class="kwrd">public</span> <span class="kwrd">void</span> WithdrawAmount(<span class="kwrd">int</span> num){ 

   <span class="kwrd">lock</span>(<span class="kwrd">this</span>){ 

   <span class="kwrd">if</span>(num &lt; <span class="kwrd">this</span>.amount)
     <span class="kwrd">this</span>.amount -= num; 

   }

 }

Java Code

  <span class="kwrd">public</span> <span class="kwrd">void</span> withdrawAmount(<span class="kwrd">int</span> num){ 

   synchronized(<span class="kwrd">this</span>){ 

   <span class="kwrd">if</span>(num &lt; <span class="kwrd">this</span>.amount)
     <span class="kwrd">this</span>.amount -= num; 

   }

 }</pre>
<p>C#和Java都有同步方法的概念。在调用同步方法的时候，调用方法的线程会锁定包含方法的对象，因此其它线程调用相同对象的同步方法必须等到其它线程执行完方法释放锁之后才能执行。同步方法在Java中用synchronized关键字来标记，而在C#中使用[MethodImpl(MethodImplOptions.Synchronized)]特性来修饰。同步方法的例子如下：</p>
<pre class="csharpcode">C# Code
<span class="kwrd">using</span> System;
<span class="kwrd">using</span> System.Runtime.CompilerServices;

<span class="kwrd">public</span> <span class="kwrd">class</span> BankAccount{

 [MethodImpl(MethodImplOptions.Synchronized)]
 <span class="kwrd">public</span> <span class="kwrd">void</span> WithdrawAmount(<span class="kwrd">int</span> num){ 

   <span class="kwrd">if</span>(num &lt; <span class="kwrd">this</span>.amount)
     <span class="kwrd">this</span>.amount - num; 

 }

}<span class="rem">//BankAccount</span>

Java Code

<span class="kwrd">public</span> <span class="kwrd">class</span> BankAccount{

  <span class="kwrd">public</span> synchronized <span class="kwrd">void</span> withdrawAmount(<span class="kwrd">int</span> num){ 

   <span class="kwrd">if</span>(num &lt; <span class="kwrd">this</span>.amount)
     <span class="kwrd">this</span>.amount - num; 

 }

}//BankAccount</pre>
<style><!--
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
--></style>
<p>&nbsp;</p>
<p>7、访问修饰符</p>
<p>&nbsp;</p>
<p>如下表格对照C#和Java的访问修饰符。C++爱好者比较失望，在Java2中Sun改变了protected关键字的语义，而C#的protected关键字和C++的一样。也就是说，protected成员只有在类的成员方法或派生类的成员方法中可以访问。internal修饰符表示成员可以被类相同程序集的其它类访问。internal protected修饰符表示的是internal或protected。</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/lovecindywang/201202/201202091757001578.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/lovecindywang/201202/201202091757002135.png" alt="image" width="444" height="262" border="0" /></a></p>
<p><em>注意：在没有指定访问修饰符的情况下，C#字段或方法的默认访问级别是private，而Java则是protected。</em></p>
<p>&nbsp;</p>
<p>8、反射</p>
<p>&nbsp;</p>
<p>在C#和Java中发现类中方法和字段以及运行时调用类方法的能力一般叫做反射。Java和C#中反射的主要区别是，C#的反射是程序集级别的，而Java是类级别的。由于程序集一般保存为DLL，对于C#需要包含类的DLL，而Java需要可以加载类文件或目标类。如下例子遍历某个类的方法，以此比较C#和Java在反射上的差异：</p>
<p>&nbsp;</p>
<pre class="csharpcode">C# Code

<span class="kwrd">using</span> System; 
<span class="kwrd">using</span> System.Xml; 
<span class="kwrd">using</span> System.Reflection;
<span class="kwrd">using</span> System.IO; 

<span class="kwrd">class</span> ReflectionSample {

   
    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> Main( <span class="kwrd">string</span>[] args){


    Assembly assembly=<span class="kwrd">null</span>;
    Type type=<span class="kwrd">null</span>;
    XmlDocument doc=<span class="kwrd">null</span>; 

    <span class="kwrd">try</span>{
        <span class="rem">// 加载程序集以获得类型</span>
        assembly = Assembly.LoadFrom(<span class="str">"C:\\WINNT\\Microsoft.NET\\Framework\\v1.0.2914\\System.XML.dll"</span>);
        type = assembly.GetType(<span class="str">"System.Xml.XmlDocument"</span>, <span class="kwrd">true</span>);

        <span class="rem">//Unfortunately one cannot dynamically instantiate types via the Type object in C#. </span>
        doc  =  Activator.CreateInstance(<span class="str">"System.Xml"</span>,<span class="str">"System.Xml.XmlDocument"</span>).Unwrap() <span class="kwrd">as</span> XmlDocument;

          <span class="kwrd">if</span>(doc != <span class="kwrd">null</span>)
                 Console.WriteLine(doc.GetType() + <span class="str">" was created at runtime"</span>);
              <span class="kwrd">else</span>
                 Console.WriteLine(<span class="str">"Could not dynamically create object at runtime"</span>);

    }<span class="kwrd">catch</span>(FileNotFoundException){
        Console.WriteLine(<span class="str">"Could not load Assembly: system.xml.dll"</span>);
         <span class="kwrd">return</span>;
    }<span class="kwrd">catch</span>(TypeLoadException){
        Console.WriteLine(<span class="str">"Could not load Type: System.Xml.XmlDocument from assembly: system.xml.dll"</span>);
        
        <span class="kwrd">return</span>;
    }<span class="kwrd">catch</span>(MissingMethodException){
       Console.WriteLine(<span class="str">"Cannot find default constructor of "</span> + type);
       }<span class="kwrd">catch</span>(MemberAccessException){
       Console.WriteLine(<span class="str">"Could not create new XmlDocument instance"</span>);
       }
    
    <span class="rem">// 获得方法</span>
    MethodInfo[] methods = type.GetMethods();
        
    <span class="rem">//打印方法签名和参数</span>
    <span class="kwrd">for</span>(<span class="kwrd">int</span> i=0; i &lt; methods.Length; i++){
    
        Console.WriteLine (<span class="str">"{0}"</span>, methods[i]);
        
        ParameterInfo[] parameters = methods[i].GetParameters(); 
        
        <span class="kwrd">for</span>(<span class="kwrd">int</span> j=0; j &lt; parameters.Length; j++){   
        Console.WriteLine (<span class="str">" Parameter: {0} {1}"</span>, parameters[j].ParameterType, parameters[j].Name);
        }
        
    }<span class="rem">//for (int i...) </span>
    
    }

}</pre>
<style><!--
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
--></style>
<p>&nbsp;</p>
<p>上面的代码可以看到C#的反射API略微优雅一点，C#提供了ParameterInfo包含方法的参数元数据，而Java提供的只是Class对象丢失了诸如参数名等信息。</p>
<p>有的时候需要获取指定类元数据对象，那么可以使用Java的java.lang.Class或C#的System.Type对象。要从类的实例获取元数据，在Java中可以使用getClass()方法而在C#中可以使用GetType()方法。如果要根据名字而不是创建一个类的实例来获取元数据可以这么做：</p>
<pre class="csharpcode">C# Code
  
   Type t = <span class="kwrd">typeof</span>(ArrayList);

Java Code

   Class c = java.util.Arraylist.<span class="kwrd">class</span>; <span class="rem">/* 必须在类的完整名字后跟 .class */</span></pre>
<style><!--
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
--></style>
<p>9、声明常量</p>
<p>&nbsp;</p>
<p>在Java中要声明常量可以使用final关键字。final的变量可以在编译时或运行时进行设置。在Java中，如果在基元上使用final的话基元的值不可变，如果在对象引用上使用final的话，则引用只可以指向一个对象。final的成员可以在声明的时候不初始化，但是必须要构造方法中初始化。</p>
<p>&nbsp;</p>
<p>在C#中要声明常量使用const关键字来表示编译时常量，使用readonly关键字来表示运行时常量。基元常量和引用常量的语义对于C#和Java来说是一样的。</p>
<p>和C++不同的是，C#和Java不能通过语言结构来指定不可变的类。</p>
<p>&nbsp;</p>
<pre class="csharpcode">C# Code

<span class="kwrd">using</span> System; 

<span class="kwrd">public</span> <span class="kwrd">class</span> ConstantTest{
    
    <span class="rem">/* 编译时常量*/</span> 
    <span class="kwrd">const</span> <span class="kwrd">int</span> i1 = 10;   <span class="rem">//隐含表示这是static的变量</span>
    
    <span class="rem">// 下面的代码不能通过编译</span>
    <span class="rem">// public static const int i2 = 20; </span>

    <span class="rem">/* 运行时常量 */</span>
    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">readonly</span> <span class="kwrd">uint</span> l1 =  (<span class="kwrd">uint</span>) DateTime.Now.Ticks;
  
    <span class="rem">/* 对象引用作为常量 */</span> 
    <span class="kwrd">readonly</span> Object o = <span class="kwrd">new</span> Object();
 
    <span class="rem">/* 未初始化的只读变量 */</span> 
    <span class="kwrd">readonly</span> <span class="kwrd">float</span> f; 

  
    ConstantTest() {
    <span class="rem">// 未初始化的只读变量必须在构造方法中初始化</span>
    f = 17.21f; 
    }
  
}

Java Code

import java.util.*; 

<span class="kwrd">public</span> <span class="kwrd">class</span> ConstantTest{
    
    <span class="rem">/* Compile time constants */</span> 
    final <span class="kwrd">int</span> i1 = 10;   <span class="rem">//instance variable </span>
    <span class="kwrd">static</span> final <span class="kwrd">int</span> i2 = 20; <span class="rem">//class variable </span>

    <span class="rem">/* run time constants */</span>
    <span class="kwrd">public</span> <span class="kwrd">static</span> final <span class="kwrd">long</span> l1 = <span class="kwrd">new</span> Date().getTime();
  
    <span class="rem">/* object reference as constant */</span> 
    final Vector v = <span class="kwrd">new</span> Vector();
 
    <span class="rem">/* uninitialized final */</span> 
    final <span class="kwrd">float</span> f; 

  
    ConstantTest() {
    <span class="rem">// unitialized final variable must be initialized in constructor </span>
    f = 17.21f; 
    }
  
}</pre>
<p><em>注意：Java语言还支持方法上的final参数。在C#中没有这个功能。final参数只要用于允许传入方法的参数可以让方法内的内部类进行访问。</em></p>
<p>&nbsp;</p>
<p>10、基元类型</p>
<p>&nbsp;</p>
<p>对于Java中的每一个基元类型在C#中都有同名的对应（除了byte之外）。Java中的byte是有符号的，等价于C#中的sbyte，不同于C#的byte。C#还提供了一些基元类型的无符号版本，比如ulong、uint、ushort和byte。C#中最不同的基元类型是decimal类型，不会有舍入错误，当然也就需要更多空间也更慢。</p>
<pre class="csharpcode">C# Code

  <span class="kwrd">decimal</span> dec = 100.44m; <span class="rem">//m is the suffix used to specify decimal numbers</span>
  <span class="kwrd">double</span>  dbl = 1.44e2d; //e <span class="kwrd">is</span> used to specify exponential notation <span class="kwrd">while</span> d <span class="kwrd">is</span> the suffix used <span class="kwrd">for</span> doubles</pre>
<style><!--
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
--></style>
<p>11、数组声明</p>
<p>&nbsp;</p>
<p>Java有两种方式声明数组。一种方式为了兼容C/C++的写法，另外一种更具有可读性，C#只能使用后者。</p>
<pre class="csharpcode">C# Code

  <span class="kwrd">int</span>[] iArray = <span class="kwrd">new</span> <span class="kwrd">int</span>[100]; <span class="rem">//valid, iArray is an object of type int[] </span>
  <span class="kwrd">float</span> fArray[] = <span class="kwrd">new</span> <span class="kwrd">float</span>[100]; <span class="rem">//ERROR: Won't compile  </span>

Java Code

  <span class="kwrd">int</span>[] iArray = <span class="kwrd">new</span> <span class="kwrd">int</span>[100]; <span class="rem">//valid, iArray is an object of type int[] </span>
  <span class="kwrd">float</span> fArray[] = <span class="kwrd">new</span> <span class="kwrd">float</span>[100]; //valid, but isn't clear that fArray <span class="kwrd">is</span> an <span class="kwrd">object</span> of type <span class="kwrd">float</span>[] </pre>
<style><!--
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
--></style>
<p>12、调用基类构造方法和构造方法链</p>
<p>&nbsp;</p>
<p>C#和Java自动调用基类构造方法，并且提供了一种方式可以调用基类的有参构造方法。两种语言都要求派生类的构造方法在任何初始化之前先调用基类的构造方法防止使用没有初始化的成员。两种语言还提供了在一个构造方法中调用另一个构造方法的方式以减少构造方法中代码的重复。这种方式叫做构造方法链：</p>
<p>&nbsp;</p>
<pre class="csharpcode">C# Code

<span class="kwrd">using</span> System; 

<span class="kwrd">class</span> MyException: Exception
{

  <span class="kwrd">private</span> <span class="kwrd">int</span> Id; 

  <span class="kwrd">public</span> MyException(<span class="kwrd">string</span> message): <span class="kwrd">this</span>(message, <span class="kwrd">null</span>, 100){ }

  <span class="kwrd">public</span> MyException(<span class="kwrd">string</span> message, Exception innerException): 
    <span class="kwrd">this</span>(message, innerException, 100){ }

  <span class="kwrd">public</span> MyException(<span class="kwrd">string</span> message, Exception innerException, <span class="kwrd">int</span> id):
    <span class="kwrd">base</span>(message, innerException){
    
    <span class="kwrd">this</span>.Id = id;   
  }

}
  
Java Code


<span class="kwrd">class</span> MyException extends Exception{

    <span class="kwrd">private</span> <span class="kwrd">int</span> Id; 
    

    <span class="kwrd">public</span> MyException(String message){
    
    <span class="kwrd">this</span>(message, <span class="kwrd">null</span>, 100); 
    }

    <span class="kwrd">public</span> MyException(String message, Exception innerException){
    
    <span class="kwrd">this</span>(message, innerException, 100); 
    
    }

  <span class="kwrd">public</span> MyException( String message,Exception innerException, <span class="kwrd">int</span> id){
      
      super(message, innerException); 
      <span class="kwrd">this</span>.Id = id;     

  }
}</pre>
<style><!--
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
--></style>
<p>&nbsp;</p>
<p>13、可变长度参数列表</p>
<p>&nbsp;</p>
<p>在C和C++中可以指定函数接收一组参数。在printf和scanf类似的函数中大量使用这种特性。C#和Java允许我们定义一个参数接收可变数量的参数。在C#中可以在方法的最后一个参数上使用params关键字以及一个数组参数来实现，在Java中可以为类型名通过增加三个.来实现。</p>
<pre class="csharpcode">C# Code
<span class="kwrd">using</span> System;

<span class="kwrd">class</span> ParamsTest{

    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> PrintInts(<span class="kwrd">string</span> title, <span class="kwrd">params</span> <span class="kwrd">int</span>[] args){

    Console.WriteLine(title + <span class="str">":"</span>);

    <span class="kwrd">foreach</span>(<span class="kwrd">int</span> num <span class="kwrd">in</span> args)
        Console.WriteLine(num); 

    }


    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> Main(<span class="kwrd">string</span>[] args){

    PrintInts(<span class="str">"First Ten Numbers in Fibonacci Sequence"</span>, 0, 1, 1, 2, 3, 5, 8, 13, 21, 34);
    }

}
Java Code
<span class="kwrd">class</span> Test{

    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> PrintInts(String title, Integer... args){

    System.<span class="kwrd">out</span>.println(title + <span class="str">":"</span>);

    <span class="kwrd">for</span>(<span class="kwrd">int</span> num : args)
        System.<span class="kwrd">out</span>.println(num); 

    }

    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> main(String[] args){

    PrintInts(<span class="str">"First Ten Numbers in Fibonacci Sequence"</span>, 0, 1, 1, 2, 3, 5, 8, 13, 21, 34);
    }

}</pre>
<style><!--
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
--></style>
<p>&nbsp;</p>
<p>14、泛型</p>
<p>&nbsp;</p>
<p>C#和Java都提供了创建强类型数据结构且不需要在编译时知道具体类型的机制。在泛型机制出现以前，这个特性通过在数据结构中指定object类型并且在运行时转换成具体类型来实现。但是这种技术有许多缺点，包括缺乏类型安全、性能不佳以及代码膨胀。</p>
<p>如下代码演示了两种方式：</p>
<pre class="csharpcode"># Code
<span class="kwrd">using</span> System;
<span class="kwrd">using</span> System.Collections;
<span class="kwrd">using</span> System.Collections.Generic; 

<span class="kwrd">class</span> Test{

    <span class="kwrd">public</span> <span class="kwrd">static</span> Stack GetStackB4Generics(){
    Stack s = <span class="kwrd">new</span> Stack(); 
    s.Push(2);
    s.Push(4); 
    s.Push(5);

    <span class="kwrd">return</span> s;
    }

    <span class="kwrd">public</span> <span class="kwrd">static</span> Stack&lt;<span class="kwrd">int</span>&gt; GetStackAfterGenerics(){
    Stack&lt;<span class="kwrd">int</span>&gt; s = <span class="kwrd">new</span> Stack&lt;<span class="kwrd">int</span>&gt;(); 
    s.Push(12);
    s.Push(14); 
    s.Push(50);

    <span class="kwrd">return</span> s;
    }

    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> Main(String[] args){

    Stack s1 = GetStackB4Generics(); 
    <span class="kwrd">int</span> sum1 = 0; 
    
    <span class="kwrd">while</span>(s1.Count != 0){
        sum1 += (<span class="kwrd">int</span>) s1.Pop(); <span class="rem">//cast </span>
    }
    
    Console.WriteLine(<span class="str">"Sum of stack 1 is "</span> + sum1); 

    Stack&lt;<span class="kwrd">int</span>&gt; s2 = GetStackAfterGenerics(); 
    <span class="kwrd">int</span> sum2 = 0; 
    
    <span class="kwrd">while</span>(s2.Count != 0){
        sum2 += s2.Pop(); <span class="rem">//no cast</span>
    }
    
    Console.WriteLine(<span class="str">"Sum of stack 2 is "</span> + sum2); 
    }

}</pre>
<pre class="csharpcode">Java Code
import java.util.*; 

<span class="kwrd">class</span> Test{

    <span class="kwrd">public</span> <span class="kwrd">static</span> Stack GetStackB4Generics(){
    Stack s = <span class="kwrd">new</span> Stack(); 
    s.push(2);
    s.push(4); 
    s.push(5);

    <span class="kwrd">return</span> s;
    }

    <span class="kwrd">public</span> <span class="kwrd">static</span> Stack&lt;Integer&gt; GetStackAfterGenerics(){
    Stack&lt;Integer&gt; s = <span class="kwrd">new</span> Stack&lt;Integer&gt;(); 
    s.push(12);
    s.push(14); 
    s.push(50);

    <span class="kwrd">return</span> s;
    }

    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> main(String[] args){

    Stack s1 = GetStackB4Generics(); 
    <span class="kwrd">int</span> sum1 = 0; 
    
    <span class="kwrd">while</span>(!s1.empty()){
        sum1 += (Integer) s1.pop(); <span class="rem">//cast </span>
    }
    
    System.<span class="kwrd">out</span>.println(<span class="str">"Sum of stack 1 is "</span> + sum1); 

    Stack&lt;Integer&gt; s2 = GetStackAfterGenerics(); 
    <span class="kwrd">int</span> sum2 = 0; 
    
    <span class="kwrd">while</span>(!s2.empty()){
        sum2 += s2.pop(); <span class="rem">//no cast</span>
    }
    
    System.<span class="kwrd">out</span>.println(<span class="str">"Sum of stack 2 is "</span> + sum2); 
    }

}</pre>
<style><!--
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
--></style>
<p>尽管和C++中的模板概念相似，C#和Java中的泛型特性实现上不一样。在Java中，泛型功能使用类型擦除来实现。泛型信息只是在编译的时候出现，编译后被编译器擦除所有类型声明替换为Object。编译器自动在核实的地方插入转换语句。这么做的原因是，泛型代码和不支持泛型的遗留代码可以互操作。类型擦除的泛型类型的主要问题是，泛型类型信息在运行时通过反射或运行时类型标识不可用。并且对于这种方式，泛型类型数据结构必须使用对象和非基元类型进行生命。所以只能有<code>Stack&lt;Integer&gt;而不是Stack&lt;int&gt;。</code></p>
<p><code>在C#中，.NET运行时中间语言IL直接支持泛型。泛型在编译的时候，生成的IL包含具体类型的占位符。在运行的时候，如果初始化一个泛型类型的引用，系统会看是否有人已经用过这个类型了，如果类型之前请求过则返回之前生成的具体类型，如果没有JIT编译器把泛型参数替换为IL中的具体类型然后再初始化新的类型。如果请求的类型是引用类型而不是值类型的话，泛型类型参数会替换为Object，但是不需要进行转换，因为.NET运行时会在访问的时候内部进行转换。</code></p>
<p>&nbsp;</p>
<p><code>在某些时候，我们的方法需要操作包含任意类型的数据结构而不是某个具体类型，但是又希望利用强类型泛型的优势。这个时候我们可以通过C#的泛型类型推断或Java通配类型实现。如下代码所示：</code></p>
<pre class="csharpcode">C# Code
<span class="kwrd">using</span> System;
<span class="kwrd">using</span> System.Collections;
<span class="kwrd">using</span> System.Collections.Generic; 

<span class="kwrd">class</span> Test{

    <span class="rem">//Prints the contents of any generic Stack by </span>
    <span class="rem">//using generic type inference </span>
    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> PrintStackContents&lt;T&gt;(Stack&lt;T&gt; s){
    <span class="kwrd">while</span>(s.Count != 0){
        Console.WriteLine(s.Pop()); 
    }    
    }

    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> Main(String[] args){

    Stack&lt;<span class="kwrd">int</span>&gt; s2 = <span class="kwrd">new</span> Stack&lt;<span class="kwrd">int</span>&gt;(); 
    s2.Push(4); 
    s2.Push(5); 
    s2.Push(6); 

    PrintStackContents(s2);     
    
    Stack&lt;<span class="kwrd">string</span>&gt; s1 = <span class="kwrd">new</span> Stack&lt;<span class="kwrd">string</span>&gt;(); 
    s1.Push(<span class="str">"One"</span>); 
    s1.Push(<span class="str">"Two"</span>); 
    s1.Push(<span class="str">"Three"</span>); 

    PrintStackContents(s1); 
    }

}
Java Code
import java.util.*; 

<span class="kwrd">class</span> Test{

    <span class="rem">//Prints the contents of any generic Stack by </span>
    <span class="rem">//specifying wildcard type </span>
    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> PrintStackContents(Stack&lt;?&gt; s){
    <span class="kwrd">while</span>(!s.empty()){
        System.<span class="kwrd">out</span>.println(s.pop()); 
    }    
    }

    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> main(String[] args){

    Stack &lt;Integer&gt; s2 = <span class="kwrd">new</span> Stack &lt;Integer&gt;(); 
    s2.push(4); 
    s2.push(5); 
    s2.push(6); 

    PrintStackContents(s2);     
    
    Stack&lt;String&gt; s1 = <span class="kwrd">new</span> Stack&lt;String&gt;(); 
    s1.push(<span class="str">"One"</span>); 
    s1.push(<span class="str">"Two"</span>); 
    s1.push(<span class="str">"Three"</span>); 

    PrintStackContents(s1); 
    }

}</pre>
<style><!--
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
--></style>
<p><code>C#和Java都提供了泛型约束。对于C#有三种类型的约束：</code></p>
<p><code>1）派生约束，告诉编译器泛型类型参数需要从某个基类型继承，比如接口或基类</code></p>
<p><code>2）默认构造方法约束，告诉编译器泛型类型参数需要提供公共的默认构造方法</code></p>
<p><code>3）引用、值类型约束，泛型类型参数需要是引用类型或值类型</code></p>
<p><code>对于Java支持派生约束：</code></p>
<pre class="csharpcode">C# Code
<span class="kwrd">using</span> System;
<span class="kwrd">using</span> System.Collections;
<span class="kwrd">using</span> System.Collections.Generic; 

<span class="kwrd">public</span> <span class="kwrd">class</span> Mammal {
    <span class="kwrd">public</span> Mammal(){;}

    <span class="kwrd">public</span> <span class="kwrd">virtual</span> <span class="kwrd">void</span> Speak(){;} 
}

<span class="kwrd">public</span> <span class="kwrd">class</span> Cat : Mammal{
    <span class="kwrd">public</span> Cat(){;}

    <span class="kwrd">public</span> <span class="kwrd">override</span> <span class="kwrd">void</span> Speak(){
    Console.WriteLine(<span class="str">"Meow"</span>);
    }
}

<span class="kwrd">public</span> <span class="kwrd">class</span> Dog : Mammal{
    <span class="kwrd">public</span> Dog(){;}

    <span class="kwrd">public</span> <span class="kwrd">override</span> <span class="kwrd">void</span> Speak(){
    Console.WriteLine(<span class="str">"Woof"</span>);
    } 
}


<span class="kwrd">public</span> <span class="kwrd">class</span> MammalHelper&lt;T&gt; <span class="kwrd">where</span> T: Mammal <span class="rem">/* derivation constraint */</span>,
                                   <span class="kwrd">new</span>() <span class="rem">/* default constructor constraint */</span>{ 

    <span class="kwrd">public</span> <span class="kwrd">static</span> T CreatePet(){
    <span class="kwrd">return</span> <span class="kwrd">new</span> T(); 
    }

    
    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> AnnoyNeighbors(Stack&lt;T&gt; pets){
    <span class="kwrd">while</span>(pets.Count != 0){
        Mammal m = pets.Pop(); 
        m.Speak();  
    }    
    }  
}

<span class="kwrd">public</span> <span class="kwrd">class</span> Test{

 <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> Main(String[] args){

    Stack&lt;Mammal&gt; s2 = <span class="kwrd">new</span> Stack&lt;Mammal&gt;(); 
    s2.Push(MammalHelper&lt;Dog&gt;.CreatePet()); 
    s2.Push(MammalHelper&lt;Cat&gt;.CreatePet()); 

    MammalHelper&lt;Mammal&gt;.AnnoyNeighbors(s2);         
    }
}</pre>
<style><!--
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
--></style>
<pre class="csharpcode">Java Code
import java.util.*; 

<span class="kwrd">abstract</span> <span class="kwrd">class</span> Mammal {
    <span class="kwrd">public</span> <span class="kwrd">abstract</span> <span class="kwrd">void</span> speak(); 
}

<span class="kwrd">class</span> Cat extends Mammal{
    <span class="kwrd">public</span> <span class="kwrd">void</span> speak(){
    System.<span class="kwrd">out</span>.println(<span class="str">"Meow"</span>);
    }
}

<span class="kwrd">class</span> Dog extends Mammal{
    <span class="kwrd">public</span> <span class="kwrd">void</span> speak(){
    System.<span class="kwrd">out</span>.println(<span class="str">"Woof"</span>);
    } 
}

<span class="kwrd">public</span> <span class="kwrd">class</span> Test{
    
    <span class="rem">//derivation constraint applied to pets parameter</span>
    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> AnnoyNeighbors(Stack&lt;? extends Mammal&gt; pets){
    <span class="kwrd">while</span>(!pets.empty()){
        Mammal m = pets.pop(); 
        m.speak();  
    }    
    }

    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> main(String[] args){

    Stack&lt;Mammal&gt; s2 = <span class="kwrd">new</span> Stack&lt;Mammal&gt;(); 
    s2.push(<span class="kwrd">new</span> Dog()); 
    s2.push(<span class="kwrd">new</span> Cat()); 

    AnnoyNeighbors(s2);         
    }
}</pre>
<style><!--
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
--></style>
<p>C#还提供了default操作符可以返回类型的默认值。引用类型的默认值是null，值类型（比如int、枚举和结构）的默认值是0（0填充结构）。对于泛型default很有用，如下代码演示了这个操作符的作用：</p>
<pre class="csharpcode">C# Code
<span class="kwrd">using</span> System;

<span class="kwrd">public</span> <span class="kwrd">class</span> Test{

    <span class="kwrd">public</span> <span class="kwrd">static</span> T GetDefaultForType&lt;T&gt;(){
    <span class="kwrd">return</span> <span class="kwrd">default</span>(T); <span class="rem">//return default value of type T</span>
    }

    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> Main(String[] args){
    
    Console.WriteLine(GetDefaultForType&lt;<span class="kwrd">int</span>&gt;());
    Console.WriteLine(GetDefaultForType&lt;<span class="kwrd">string</span>&gt;());    
    Console.WriteLine(GetDefaultForType&lt;<span class="kwrd">float</span>&gt;());

    }
}</pre>
<style><!--
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
--></style>
<p>输出：</p>
<p>0</p>
<p>&nbsp;</p>
<p>0</p>
<p>&nbsp;</p>
<p>15、for-each循环</p>
<p>&nbsp;</p>
<p>for-each循环是很多脚本语言、编译工具、方法类库中非常常见的一种迭代结构。for-each循环简化了C#中实现System.Collections.IEnumerable接口或Java中java.lang.Iterable接口数组或类的迭代。</p>
<p>在C#中通过foreach关键字来创建for-each循环，而在Java中通过操作符:来实现。</p>
<pre class="csharpcode">C# Code
<span class="kwrd">string</span>[] greek_alphabet = {<span class="str">"alpha"</span>, <span class="str">"beta"</span>, <span class="str">"gamma"</span>, <span class="str">"delta"</span>, <span class="str">"epsilon"</span>};

<span class="kwrd">foreach</span>(<span class="kwrd">string</span> str <span class="kwrd">in</span> greek_alphabet)
  Console.WriteLine(str + <span class="str">" is a letter of the greek alphabet"</span>);

Java Code
String[] greek_alphabet = {<span class="str">"alpha"</span>, <span class="str">"beta"</span>, <span class="str">"gamma"</span>, <span class="str">"delta"</span>, <span class="str">"epsilon"</span>};

<span class="kwrd">for</span>(String str : greek_alphabet)
  System.<span class="kwrd">out</span>.println(str + <span class="str">" is a letter of the greek alphabet"</span>);</pre>
<style><!--
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
--></style>
<p>&nbsp;</p>
<p>16、元数据注解</p>
<p>&nbsp;</p>
<p>元数据注解提供了一种强大的方式来扩展编程语言和语言运行时的能力。注解是可以要求运行时进行一些额外任务、提供类额外信息扩展功能的一些指令。元数据注解在许多编程环境中很常见，比如微软的COM和linux内核。</p>
<p>C#特性提供了为模块、类型、方法或成员变量增加注解的方式。如下描述了一些.NET自带的特性以及如何使用它们来扩展C#的能力：</p>
<p>&nbsp;</p>
<p>1）[MethodImpl(MethodImplOptions.Synchronized)] 用于指定多线程访问方法的时候使用锁进行保护，和Java的sychronized一样。</p>
<p>2）[Serializable]用于把类标记为可序列化的，和Java的实现Serializable接口相似。</p>
<p>3）[FlagsAttribute]用于指定枚举支持位操作。这样枚举就可以有多个值。</p>
<pre class="csharpcode">C# Code
   <span class="rem">//declaration of bit field enumeration </span>
   [Flags]
   <span class="kwrd">enum</span> ProgrammingLanguages{ 
   C     = 1, 
   Lisp  = 2, 
   Basic = 4, 
   All  = C | Lisp | Basic
   }

  aProgrammer.KnownLanguages  =  ProgrammingLanguages.Lisp; <span class="rem">//set known languages  ="Lisp"</span>
  aProgrammer.KnownLanguages |=  ProgrammingLanguages.C; <span class="rem">//set known languages  ="Lisp C"</span>
  aProgrammer.KnownLanguages &amp;= ~ProgrammingLanguages.Lisp; <span class="rem">//set known languages  ="C"</span>

  <span class="kwrd">if</span>((aProgrammer.KnownLanguages &amp; ProgrammingLanguages.C) &gt; 0){ <span class="rem">//if programmer knows C</span>
    <span class="rem">//.. do something </span>
  }</pre>
<p>4）[WebMethod]在ASP.NET中用于指定方法可以通过Web服务访问。</p>
<p>可以通过反射来访问模块、类、方法或字段的特性（详见<a href="http://msdn.microsoft.com/zh-cn/library/system.attributetargets.aspx">http://msdn.microsoft.com/zh-cn/library/system.attributetargets.aspx</a>）。对于运行时获取类是否支持某个行为特别有用，开发者可以通过继承System.Attribute类来创建他们自己的特性。如下是使用特性来提供类作者信息的例子，然后我们通过反射来读取这个信息。</p>
<pre class="csharpcode">C# Code
<span class="kwrd">using</span> System; 
<span class="kwrd">using</span> System.Reflection;
[AttributeUsage(AttributeTargets.Class)]
<span class="kwrd">public</span> <span class="kwrd">class</span> AuthorInfoAttribute: System.Attribute{

    <span class="kwrd">string</span> author; 
    <span class="kwrd">string</span> email; 
    <span class="kwrd">string</span> version;


    <span class="kwrd">public</span> AuthorInfoAttribute(<span class="kwrd">string</span> author, <span class="kwrd">string</span> email){

    <span class="kwrd">this</span>.author = author; 
    <span class="kwrd">this</span>.email  = email;
    
    }


    <span class="kwrd">public</span> <span class="kwrd">string</span> Version{


    get{
        <span class="kwrd">return</span> version;
    }

    set{
        version = <span class="kwrd">value</span>; 
    }

    }


    <span class="kwrd">public</span> <span class="kwrd">string</span> Email{


    get{
        <span class="kwrd">return</span> email;
    }

    }

     <span class="kwrd">public</span> <span class="kwrd">string</span> Author{


    get{
        <span class="kwrd">return</span> author;
    }

    }

}



[AuthorInfo(<span class="str">"Dare Obasanjo"</span>, <span class="str">"kpako@yahoo.com"</span>, Version=<span class="str">"1.0"</span>)]
<span class="kwrd">class</span> HelloWorld{

}

<span class="kwrd">class</span> AttributeTest{

    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> Main(<span class="kwrd">string</span>[] args){

    <span class="rem">/* Get Type object of HelloWorld class */</span>      
    Type t = <span class="kwrd">typeof</span>(HelloWorld); 

    Console.WriteLine(<span class="str">"Author Information for "</span> + t);
    Console.WriteLine(<span class="str">"================================="</span>);

    <span class="kwrd">foreach</span>(AuthorInfoAttribute att <span class="kwrd">in</span> t.GetCustomAttributes(<span class="kwrd">typeof</span>(AuthorInfoAttribute), <span class="kwrd">false</span>)){

        Console.WriteLine(<span class="str">"Author: "</span> + att.Author);
        Console.WriteLine(<span class="str">"Email: "</span> + att.Email);
        Console.WriteLine(<span class="str">"Version: "</span> + att.Version);   

    }<span class="rem">//foreach</span>

    }<span class="rem">//Main</span>

}</pre>
<style><!--
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
--></style>
<p>&nbsp;</p>
<p>Java的提供了为包、类型、方法、参数、成员或局部变量增加注解的能力。Java语言只内置了三种注解，如下：</p>
<p>1）@Override用于指定方法覆盖基类的方法。如果注解的方法并没有覆盖基类的方法，在编译的时候会出错。</p>
<p>2）@Deprecated用于指示某个方法已经废弃。使用废弃的方法会在编译的时候产生警告。</p>
<p>3）@SuppressWarnings用于防止编译器发出某个警告。这个注解可选接收参数来表明屏蔽哪种警告。</p>
<p>&nbsp;</p>
<p>和C#一样，可以通过反射来读取模块、类、方法或字段的注解。但是不同的是Java注解可以是元注解。开发者可以创建自定义的注解，创建方法和接口相似，只不过需要定义@interface关键字。如下是使用注解和通过反射读取信息的例子：</p>
<pre class="csharpcode">Java Code
import java.lang.annotation.*;
import java.lang.reflect.*;

@Documented <span class="rem">//we want the annotation to show up in the Javadocs </span>
@Retention(RetentionPolicy.RUNTIME) <span class="rem">//we want annotation metadata to be exposed at runtime</span>
@<span class="kwrd">interface</span> AuthorInfo{
    String author(); 
    String email(); 
    String version() <span class="kwrd">default</span> <span class="str">"1.0"</span>;
}

@AuthorInfo(author=<span class="str">"Dare Obasanjo"</span>, email=<span class="str">"kpako@yahoo.com"</span>)
<span class="kwrd">class</span> HelloWorld{

}

<span class="kwrd">public</span> <span class="kwrd">class</span> Test{

    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> main(String[] args) throws Exception{

    <span class="rem">/* Get Class object of HelloWorld class */</span>      
    Class c = Class.forName(<span class="str">"HelloWorld"</span>);
    AuthorInfo a = (AuthorInfo) c.getAnnotation(AuthorInfo.<span class="kwrd">class</span>); 
    
    System.<span class="kwrd">out</span>.println(<span class="str">"Author Information for "</span> + c);
    System.<span class="kwrd">out</span>.println(<span class="str">"======================================="</span>);
    System.<span class="kwrd">out</span>.println(<span class="str">"Author: "</span> + a.author());
    System.<span class="kwrd">out</span>.println(<span class="str">"Email: "</span> + a.email());
    System.<span class="kwrd">out</span>.println(<span class="str">"Version: "</span> + a.version());      

    }
}</pre>
<style><!--
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
--></style>
<p>&nbsp;</p>
<p>17、枚举</p>
<p>&nbsp;</p>
<p>枚举用于创建一组用于自定义的命名常量。尽管从表面上看C#和Java的枚举非常相同，但是在实现上它们完全不同。Java的枚举类型是纯种的类，也就是它们是类型安全并可以增加方法、字段或甚至实现接口进行扩展，而在C#中枚举纯粹是一个包装了数字类型（一般是int）的语法糖，并且不是类型安全的。如下代码演示了两者的区别：</p>
<pre class="csharpcode">C# Code
<span class="kwrd">using</span> System;

<span class="kwrd">public</span> <span class="kwrd">enum</span> DaysOfWeek{
    SUNDAY, 
    MONDAY, 
    TUESDAY, 
    WEDNESDAY,
    THURSDAY, 
    FRIDAY,
    SATURDAY
}

<span class="kwrd">public</span> <span class="kwrd">class</span> Test{

    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">bool</span> isWeekDay(DaysOfWeek day){
    <span class="kwrd">return</span> !isWeekEnd(day);   
    }

    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">bool</span> isWeekEnd(DaysOfWeek day){
    <span class="kwrd">return</span> (day == DaysOfWeek.SUNDAY || day == DaysOfWeek.SATURDAY); 
    }

    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> Main(String[] args){

    DaysOfWeek sun = DaysOfWeek.SUNDAY; 
    Console.WriteLine(<span class="str">"Is "</span> + sun + <span class="str">" a weekend? "</span> + isWeekEnd(sun));
    Console.WriteLine(<span class="str">"Is "</span> + sun + <span class="str">" a week day? "</span> + isWeekDay(sun));

    <span class="rem">/* Example of how C# enums are not type safe */</span>
    sun = (DaysOfWeek) 1999;
    Console.WriteLine(sun);
    
    }
}</pre>
<style><!--
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
--></style>
<p>&nbsp;</p>
<pre class="csharpcode">Java Code
<span class="kwrd">enum</span> DaysOfWeek{
    SUNDAY, 
    MONDAY, 
    TUESDAY, 
    WEDNESDAY,
    THURSDAY, 
    FRIDAY,
    SATURDAY;

    <span class="kwrd">public</span> boolean isWeekDay(){
    <span class="kwrd">return</span> !isWeekEnd();   
    }

    <span class="kwrd">public</span> boolean isWeekEnd(){
    <span class="kwrd">return</span> (<span class="kwrd">this</span> == SUNDAY || <span class="kwrd">this</span> == SATURDAY); 
    }

}

<span class="kwrd">public</span> <span class="kwrd">class</span> Test{

    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> main(String[] args) throws Exception{

    DaysOfWeek sun = DaysOfWeek.SUNDAY; 
    System.<span class="kwrd">out</span>.println(<span class="str">"Is "</span> + sun + <span class="str">" a weekend? "</span> + sun.isWeekEnd());
    System.<span class="kwrd">out</span>.println(<span class="str">"Is "</span> + sun + <span class="str">" a week day? "</span> + sun.isWeekDay());
    }
}</pre>
<p>运行结果：</p>
<p>Is SUNDAY a weekend? true <br />Is SUNDAY a week day? false</p>
<p>&nbsp;</p>
<p><strong>第三部分：C#中有，Java中也有但完全不同的地方</strong></p>
<p>&nbsp;</p>
<p>1、嵌套类</p>
<p>&nbsp;</p>
<p>在Java和C#中可以在一个类中嵌套另一个。在Java中有两种类型的嵌套类，非静态的嵌套类也就是内部类，以及静态的嵌套类。Java的内部类可以认为是内部类和其包含类一对一的关系，每一个包含类的实例都保存了一个相应内部类的实例，内部类可以额访问包含类的成员变量以及包含非静态的方法。Java的静态内部类可以访问包含类的静态成员和方法。C#也有Java的静态嵌套类，但是没有Java的内部类。如下嵌套类声明是等价的：</p>
<pre class="csharpcode">C# Code
<span class="kwrd">public</span> <span class="kwrd">class</span> Car{

  <span class="kwrd">private</span> Engine engine;

  <span class="kwrd">private</span> <span class="kwrd">class</span> Engine{

    <span class="kwrd">string</span> make; 

  }

}

Java Code
<span class="kwrd">public</span> <span class="kwrd">class</span> Car{

  <span class="kwrd">private</span> Engine engine;

  <span class="kwrd">private</span> <span class="kwrd">static</span> <span class="kwrd">class</span> Engine{

    String make; 

  }

}</pre>
<style><!--
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
--></style>
<p><em>注意：在Java中，嵌套类可以在任何代码块中声明，包括方法，在C#中则不能。在方法中创建嵌套类看上去不必要，但是结合匿名内部类可以提供强大的设计模式。</em></p>
<p>&nbsp;</p>
<p>2、线程和易失成员</p>
<p>&nbsp;</p>
<p>线程是程序内的顺序控制流程。程序或进程可以有多个线程并行执行，在执行任务的时候可以共享数据也可以独立运行。这样开发人员就可以在一个程序或进程中一次执行多个任务。线程的优点包括充分利用多处理器架构的资源、通过一边处理任务一边等待阻塞的系统调用（比如打印机或其它IO）减少执行时间，避免GUI应用程序失去响应。</p>
<p>&nbsp;</p>
<p>Java线程可以通过继承java.lang.Thread并重写run()方法或者实现java.lang.Runable接口并实现run()方法来实现。在C#中，可以创建System.Threading.Thread对象并且传入System.Threading.Thread委托来表示需要线程运行的方法。在Java中，每一个类都从java.lang.Object继承wait()、notify()以及notify()。在C#中的等价是Thread.Threading.Montir类的Wait()、Pulse()以及PulseAll()。</p>
<p>&nbsp;</p>
<pre class="csharpcode"><span class="kwrd">using</span> System;
<span class="kwrd">using</span> System.Threading;
<span class="kwrd">using</span> System.Collections;

<span class="kwrd">public</span> <span class="kwrd">class</span> WorkerThread
{

    <span class="kwrd">private</span> <span class="kwrd">int</span> idNumber;
    <span class="kwrd">private</span> <span class="kwrd">static</span> <span class="kwrd">int</span> num_threads_made = 1;
    <span class="kwrd">private</span> ThreadSample owner;

    <span class="kwrd">public</span> WorkerThread(ThreadSample owner)
    {

        idNumber = num_threads_made;
        num_threads_made++;
        <span class="kwrd">this</span>.owner = owner;

    }<span class="rem">/* WorkerThread() */</span>

    <span class="rem">//sleeps for a random amount of time to simulate working on a task</span>

    <span class="kwrd">public</span> <span class="kwrd">void</span> PerformTask()
    {

        Random r = <span class="kwrd">new</span> Random((<span class="kwrd">int</span>)DateTime.Now.Ticks);
        <span class="kwrd">int</span> timeout = (<span class="kwrd">int</span>)r.Next() % 1000;

        <span class="kwrd">if</span> (timeout &lt; 0)
            timeout *= -1;

        <span class="rem">//Console.WriteLine(idNumber + ":A");</span>

        <span class="kwrd">try</span>
        {
            Thread.Sleep(timeout);
        }
        <span class="kwrd">catch</span> (ThreadInterruptedException e)
        {
            Console.WriteLine(<span class="str">"Thread #"</span> + idNumber + <span class="str">" interrupted"</span>);
        }

        <span class="rem">//Console.WriteLine(idNumber + ":B");</span>

        owner.workCompleted(<span class="kwrd">this</span>);

    }<span class="rem">/* performTask() */</span>


    <span class="kwrd">public</span> <span class="kwrd">int</span> getIDNumber() { <span class="kwrd">return</span> idNumber; }


} <span class="rem">// WorkerThread</span>

<span class="kwrd">public</span> <span class="kwrd">class</span> ThreadSample
{

    <span class="kwrd">private</span> <span class="kwrd">static</span> Mutex m = <span class="kwrd">new</span> Mutex();
    <span class="kwrd">private</span> ArrayList threadOrderList = <span class="kwrd">new</span> ArrayList();

    <span class="kwrd">private</span> <span class="kwrd">int</span> NextInLine()
    {

        <span class="kwrd">return</span> (<span class="kwrd">int</span>)threadOrderList[0];
    }

    <span class="kwrd">private</span> <span class="kwrd">void</span> RemoveNextInLine()
    {

        threadOrderList.RemoveAt(0);

        <span class="rem">//all threads have shown up </span>
        <span class="kwrd">if</span> (threadOrderList.Count == 0)
            Environment.Exit(0);
    }


    <span class="kwrd">public</span> <span class="kwrd">void</span> workCompleted(WorkerThread worker)
    {

        <span class="kwrd">try</span>
        {

            <span class="kwrd">lock</span> (<span class="kwrd">this</span>)
            {


                <span class="kwrd">while</span> (worker.getIDNumber() != NextInLine())
                {

                    <span class="kwrd">try</span>
                    {
                        <span class="rem">//wait for some other thread to finish working</span>
                        Console.WriteLine(<span class="str">"Thread #"</span> + worker.getIDNumber() + <span class="str">" is waiting for Thread #"</span> +
                                   NextInLine() + <span class="str">" to show up."</span>);

                        Monitor.Wait(<span class="kwrd">this</span>, Timeout.Infinite);

                    }
                    <span class="kwrd">catch</span> (ThreadInterruptedException e) { }

                }<span class="rem">//while</span>


                Console.WriteLine(<span class="str">"Thread #"</span> + worker.getIDNumber() + <span class="str">" is home free"</span>);

                <span class="rem">//remove this ID number from the list of threads yet to be seen</span>
                RemoveNextInLine();

                <span class="rem">//tell the other threads to resume</span>
                Monitor.PulseAll(<span class="kwrd">this</span>);

            }

        }
        <span class="kwrd">catch</span> (SynchronizationLockException) { Console.WriteLine(<span class="str">"SynchronizationLockException occurred"</span>); }

    }

    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> Main(String[] args)
    {


        ThreadSample ts = <span class="kwrd">new</span> ThreadSample();

        <span class="rem">/* Launch 25 threads */</span>
        <span class="kwrd">for</span> (<span class="kwrd">int</span> i = 1; i &lt;= 25; i++)
        {
            WorkerThread wt = <span class="kwrd">new</span> WorkerThread(ts);
            ts.threadOrderList.Add(i);
            Thread t = <span class="kwrd">new</span> Thread(<span class="kwrd">new</span> ThreadStart(wt.PerformTask));
            t.Start();
        }

        Thread.Sleep(3600000); <span class="rem">//wait for it all to end</span>

    }<span class="rem">/* main(String[]) */</span>
}</pre>
<style><!--
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
--></style>
<pre class="csharpcode">Java Code
import java.util.*; 


<span class="kwrd">class</span> WorkerThread extends Thread{
       
    <span class="kwrd">private</span> Integer idNumber;
    <span class="kwrd">private</span> <span class="kwrd">static</span> <span class="kwrd">int</span> num_threads_made = 1; 
    <span class="kwrd">private</span> ThreadSample owner; 

    <span class="kwrd">public</span> WorkerThread(ThreadSample owner){
        
        super(<span class="str">"Thread #"</span> + num_threads_made);   
    
        idNumber = <span class="kwrd">new</span> Integer(num_threads_made);   
    num_threads_made++;        
    <span class="kwrd">this</span>.owner = owner;
    
    start(); <span class="rem">//calls run and starts the thread.</span>
    }<span class="rem">/* WorkerThread() */</span>
    
    <span class="rem">//sleeps for a random amount of time to simulate working on a task</span>
    <span class="kwrd">public</span> <span class="kwrd">void</span> run(){

    Random r = <span class="kwrd">new</span> Random(System.currentTimeMillis()); 
    <span class="kwrd">int</span> timeout = r.nextInt()  % 1000; 

    <span class="kwrd">if</span>(timeout &lt; 0)
        timeout *= -1 ;

    <span class="kwrd">try</span>{        
        Thread.sleep(timeout);      
        } <span class="kwrd">catch</span> (InterruptedException e){
            System.<span class="kwrd">out</span>.println(<span class="str">"Thread #"</span> + idNumber + <span class="str">" interrupted"</span>);
        }
    
    owner.workCompleted(<span class="kwrd">this</span>); 

    }<span class="rem">/* run() */</span>
    
           
    <span class="kwrd">public</span> Integer getIDNumber() {<span class="kwrd">return</span> idNumber;}
         
    
} <span class="rem">// WorkerThread</span>

<span class="kwrd">public</span> <span class="kwrd">class</span> ThreadSample{

    <span class="kwrd">private</span> Vector threadOrderList = <span class="kwrd">new</span> Vector(); 
    
    <span class="kwrd">private</span> Integer nextInLine(){

    <span class="kwrd">return</span> (Integer) threadOrderList.firstElement(); 
    }

    <span class="kwrd">private</span> <span class="kwrd">void</span> removeNextInLine(){

    threadOrderList.removeElementAt(0);

    <span class="rem">//all threads have shown up </span>
    <span class="kwrd">if</span>(threadOrderList.isEmpty())
        System.exit(0); 
    }

    <span class="kwrd">public</span> synchronized <span class="kwrd">void</span> workCompleted(WorkerThread worker){

    
    <span class="kwrd">while</span>(worker.getIDNumber().equals(nextInLine())==<span class="kwrd">false</span>){
    
        <span class="kwrd">try</span> {
        <span class="rem">//wait for some other thread to finish working</span>
        System.<span class="kwrd">out</span>.println (Thread.currentThread().getName() + <span class="str">" is waiting for Thread #"</span> + 
                    nextInLine() + <span class="str">" to show up."</span>);
        wait();
        } <span class="kwrd">catch</span> (InterruptedException e) {}
           
    }<span class="rem">//while</span>
    
    System.<span class="kwrd">out</span>.println(<span class="str">"Thread #"</span> + worker.getIDNumber() + <span class="str">" is home free"</span>);

    <span class="rem">//remove this ID number from the list of threads yet to be seen</span>
    removeNextInLine(); 

    <span class="rem">//tell the other threads to resume</span>
    notifyAll(); 
    }

    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> main(String[] args) throws InterruptedException{
    

    ThreadSample ts = <span class="kwrd">new</span> ThreadSample(); 

    <span class="rem">/* Launch 25 threads */</span> 
    <span class="kwrd">for</span>(<span class="kwrd">int</span> i=1; i &lt;= 25; i++){
        <span class="kwrd">new</span> WorkerThread(ts); 
        ts.threadOrderList.add(<span class="kwrd">new</span> Integer(i)); 
    }

    Thread.sleep(3600000); <span class="rem">//wait for it all to end</span>
    
    }<span class="rem">/* main(String[]) */</span> 


}//ThreadSample</pre>
<style><!--
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
--></style>
<p>&nbsp;</p>
<p>在许多情况下，我们不能确保代码执行的顺序和源代码一致。产生这种情况的原因包括编译器优化的时候重排语句顺序、或多处理器系统不能在全局内存中保存变量。要避免这个问题，C#和Javay引入了volatile关键字来告诉语言运行时不要重新调整字段的指令顺序。</p>
<p>&nbsp;</p>
<pre class="csharpcode">C# Code

<span class="rem">/* Used to lazily instantiate a singleton class */</span> 
<span class="rem">/*             WORKS AS EXPECTED                */</span>
  <span class="kwrd">class</span> Foo {
        <span class="kwrd">private</span> <span class="kwrd">volatile</span> Helper helper = <span class="kwrd">null</span>;
        <span class="kwrd">public</span> Helper getHelper() {
            <span class="kwrd">if</span> (helper == <span class="kwrd">null</span>) {
                <span class="kwrd">lock</span>(<span class="kwrd">this</span>) {
                    <span class="kwrd">if</span> (helper == <span class="kwrd">null</span>)
                        helper = <span class="kwrd">new</span> Helper();
                }
            }
            <span class="kwrd">return</span> helper;
        }
    }


Java Code

<span class="rem">/* Used to lazily instantiate a singleton class */</span> 
<span class="rem">/* BROKEN UNDER CURRENT SEMANTICS FOR VOLATILE */</span> 

  <span class="kwrd">class</span> Foo {
        <span class="kwrd">private</span> <span class="kwrd">volatile</span> Helper helper = <span class="kwrd">null</span>;
        <span class="kwrd">public</span> Helper getHelper() {
            <span class="kwrd">if</span> (helper == <span class="kwrd">null</span>) {
                synchronized(<span class="kwrd">this</span>) {
                    <span class="kwrd">if</span> (helper == <span class="kwrd">null</span>)
                        helper = <span class="kwrd">new</span> Helper();
                }
            }
            <span class="kwrd">return</span> helper;
        }
    }</pre>
<style><!--
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
--></style>
<p>尽管上面的代码除了lock和synchronized关键字之外没什么不同，Java的版本不保证在所有的JVM下都工作，详见<a href="http://www.javaworld.com/javaworld/jw-02-2001/jw-0209-double.html">http://www.javaworld.com/javaworld/jw-02-2001/jw-0209-double.html</a>。在C#中volatile的语义不会出现这样的问题，因为读写次序不能调整，同样被标记volatile的字段不会保存在寄存器中，对于多处理器系统确保变量保存在全局内存中。</p>
<p>&nbsp;</p>
<p>3、操作符重载</p>
<p>&nbsp;</p>
<p>操作符重载允许特定的类或类型对于标准操作符具有新的语义。操作符重载可以用于简化某个常用操作的语法，比如Java中的字符串连接。操作符重载也是开发人员争议的一个地方，它在带来灵活性的同时也带来了滥用的危险。有些开发者会乱用重载（比如用++或--来表示连接或断开网络）或是让操作符不具有本来的意义（比如[]返回一个集合中某个索引项的复制而不是原始的对象）或重载了一半操作符（比如重载&lt;但是不重载&gt;）。</p>
<p>注意，和C++不用，C#不允许重载如下的操作符：new、()、||、&amp;&amp;、=或各种组合赋值，比如+=、-=。但是，重载的组合赋值会调用重载的操作符，比如+=会调用重载的+。</p>
<p>&nbsp;</p>
<pre class="csharpcode">C# Code
<span class="kwrd">using</span> System;

<span class="kwrd">class</span> OverloadedNumber{

    <span class="kwrd">private</span> <span class="kwrd">int</span> <span class="kwrd">value</span>; 

    <span class="kwrd">public</span> OverloadedNumber(<span class="kwrd">int</span> <span class="kwrd">value</span>){

    <span class="kwrd">this</span>.<span class="kwrd">value</span> = <span class="kwrd">value</span>; 

    }

    <span class="kwrd">public</span> <span class="kwrd">override</span> <span class="kwrd">string</span> ToString(){
    <span class="kwrd">return</span> <span class="kwrd">value</span>.ToString(); 
    }


    <span class="kwrd">public</span> <span class="kwrd">static</span> OverloadedNumber <span class="kwrd">operator</span> -(OverloadedNumber number){
    <span class="kwrd">return</span> <span class="kwrd">new</span> OverloadedNumber(-number.<span class="kwrd">value</span>); 
    }

    <span class="kwrd">public</span> <span class="kwrd">static</span> OverloadedNumber <span class="kwrd">operator</span> +(OverloadedNumber number1, OverloadedNumber number2){
    <span class="kwrd">return</span> <span class="kwrd">new</span> OverloadedNumber(number1.<span class="kwrd">value</span> + number2.<span class="kwrd">value</span>); 
    }

    <span class="kwrd">public</span> <span class="kwrd">static</span> OverloadedNumber <span class="kwrd">operator</span> ++(OverloadedNumber number){
    <span class="kwrd">return</span> <span class="kwrd">new</span> OverloadedNumber(number.<span class="kwrd">value</span> + 1); 
    }

}

<span class="kwrd">public</span> <span class="kwrd">class</span> OperatorOverloadingTest {

  
    <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> Main(<span class="kwrd">string</span>[] args){

    OverloadedNumber number1 = <span class="kwrd">new</span> OverloadedNumber(12); 
    OverloadedNumber number2 = <span class="kwrd">new</span> OverloadedNumber(125); 

    Console.WriteLine(<span class="str">"Increment: {0}"</span>, ++number1);
    Console.WriteLine(<span class="str">"Addition: {0}"</span>, number1 + number2);
  
    }
} <span class="rem">// OperatorOverloadingTest</span></pre>
<p><a href="http://images.cnblogs.com/cnblogs_com/lovecindywang/201202/201202091757009103.png"><img style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/lovecindywang/201202/201202091757003247.png" alt="image" width="238" height="96" border="0" /></a></p>
<p>&nbsp;</p>
<p>4、switch语句</p>
<p>&nbsp;</p>
<p>C#的switch和Java的switch有两个主要的区别。在C#中，switch语句支持字符串常量，除非标签不包含任何语句否则不允许贯穿。贯穿是显式禁止的，因为可能导致难以找到的bug。</p>
<style><!--
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
--></style>
<pre class="csharpcode">C# Code

<span class="kwrd">switch</span>(foo){    
    
    <span class="kwrd">case</span> <span class="str">"A"</span>: 
        Console.WriteLine(<span class="str">"A seen"</span>);
        <span class="kwrd">break</span>;
    <span class="kwrd">case</span> <span class="str">"B"</span>: 
    <span class="kwrd">case</span> <span class="str">"C"</span>: 
        Console.WriteLine(<span class="str">"B or C seen"</span>);
        <span class="kwrd">break</span>; 

        <span class="rem">/* ERROR: Won't compile due to fall-through at case "D" */</span>
    <span class="kwrd">case</span> <span class="str">"D"</span>: 
        Console.WriteLine(<span class="str">"D seen"</span>);
    <span class="kwrd">case</span> <span class="str">"E"</span>:
        Console.WriteLine(<span class="str">"E seen"</span>);
        <span class="kwrd">break</span>; 
    }</pre>
<style><!--
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
--></style>
<p><a href="http://images.cnblogs.com/cnblogs_com/lovecindywang/201202/201202091757004120.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/lovecindywang/201202/201202091757018264.png" alt="image" width="602" height="51" border="0" /></a></p>
<p>&nbsp;</p>
<p>5、程序集</p>
<p>&nbsp;</p>
<p>C#程序集和Java的JAR文件有很多共性。程序集是.NET环境最基本的代码打包单元。程序集包含了中间语言代码、类的元数据以及其它执行任务所需要的数据。由于程序集是最基本的打包单元，和类型相关的一些行为必须在程序集级别进行。例如，安全授权、代码部署、程序集级别的版本控制。Java JAR文件有着相似的作用，但是实现不一样。程序集一般是EXE或DLL而JAR文件是ZIP文件格式的。</p><img src="aggbug/2344315.html?type=0" width="1" height="1" alt=""/><p>作者: <a href="" target="_blank">lovecindywang</a> 发表于 2012-02-09 17:57 <a href="http://www.cnblogs.com/lovecindywang/archive/2012/02/09/2344315.html" target="_blank">原文链接</a></p><p>评论: 5　<a href="http://www.cnblogs.com/lovecindywang/archive/2012/02/09/2344315.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/lovecindywang/archive/2012/02/09/2344315.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/130752/" target="_blank">苹果征集iPad 3发布会演示应用 重点是图形应用</a><span style="color:gray">(2012-02-10 17:23)</span><br/>· <a href="http://news.cnblogs.com/n/130751/" target="_blank">京东商城涉足汽车销售 将上线售车频道</a><span style="color:gray">(2012-02-10 17:21)</span><br/>· <a href="http://news.cnblogs.com/n/130748/" target="_blank">亚马逊新广告挑衅苹果：一个iPad可买三台kindle</a><span style="color:gray">(2012-02-10 17:20)</span><br/>· <a href="http://news.cnblogs.com/n/130750/" target="_blank">动视暴雪确认今年第二季度推出《暗黑破坏神3》</a><span style="color:gray">(2012-02-10 16:59)</span><br/>· <a href="http://news.cnblogs.com/n/130749/" target="_blank">官方承认 Google Bar 逆行倒施</a><span style="color:gray">(2012-02-10 16:55)</span><br/></p><p>编辑推荐：<a href="http://kb.cnblogs.com/page/130672/" target="_blank">高级编程语言的发展历程</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">我的园子</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://q.cnblogs.com/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>Spread WPF-Silverlight CTP 探秘</title><link>http://www.cnblogs.com/powertoolsteam/archive/2012/02/09/2343927.html</link><dc:creator>葡萄城控件技术团队博客</dc:creator><author>葡萄城控件技术团队博客</author><pubDate>Thu, 09 Feb 2012 06:34:00 GMT</pubDate><guid>http://www.cnblogs.com/powertoolsteam/archive/2012/02/09/2343927.html</guid><description><![CDATA[<p><p>Spread WPF-Silverlight -- 将Excel功能嵌入到你的Silverlight 应用中。</p>
<p>Spread WPF-Silverlight 是一款嵌入式表格控件产品，用于快速建立WPF和Silverlight平台上高级应用程序，包括商业、工程和科学等应用。通过Spread可以将Excel文档导入到应用程序中，并执行商业或者统计规则同时控制整体的用户体验。也可以将数据和分析结果保存成Excel、xml或者其他格式的文档，便于提交和分享。此外，Spread全新支持模板功能，通过设计器制作并可共享使用。</p>
<p>&nbsp;</p>
<p>下面就开始探秘啦：</p>
<ul>
<li>Excel 导入导出。支持.xls和 .xlsx。</li>
<li>将外部数据源读入Spread。</li>
<li>功能丰富的Spread设计器。</li>
</ul>
<p><a href="http://images.cnblogs.com/cnblogs_com/powertoolsteam/201202/201202091433146206.png"><img style="display: inline; border: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/powertoolsteam/201202/201202091433189733.png" alt="image" width="644" height="433" border="0" /></a></p>
<p>&nbsp;</p>
<p>波形图（Sparklines）</p>
<p>波形图是直接画在单元格里的微型图表，用于可视化的呈现数据。Spread 支持列、线和正负类型的波形图，同时可以与Excel 2010文件兼容及转换。</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/powertoolsteam/201202/20120209143319388.png"><img style="display: inline; border: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/powertoolsteam/201202/201202091433202962.png" alt="image" width="644" height="278" border="0" /></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Cell Border:</p>
<p>13种线型，颜色设定，四边不同线型，GridLine定制，与Excel完全相同。</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/powertoolsteam/201202/201202091433214207.png"><img style="display: inline; border: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/powertoolsteam/201202/201202091433221242.png" alt="image" width="644" height="415" border="0" /></a></p>
<p>&nbsp;</p>
<p>Cell Style: 控制了单元格，就控制了交互！</p>
<p>丰富的单元格风格设定,包括字体，色彩，边框，对齐，缩进，折行，文字格式，验证方式，公式计算，编辑控制，主题设定等。还有灵活强大的风格行列继承功能。</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/powertoolsteam/201202/201202091433232802.png"><img style="display: inline; border: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/powertoolsteam/201202/201202091433248998.png" alt="image" width="644" height="387" border="0" /></a></p>
<p>&nbsp;</p>
<p>Conditional Format:让单元格原地满状态复活！</p>
<p>根据不同的条件单元格显示不同的风格。基于强大的公式，灵活设定各种条件。丰富的风格设定，包括多组内置图标以及颜色柱状背景的显示。让数据显示更加生动活泼，重点突出。</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/powertoolsteam/201202/20120209143326525.png"><img style="display: inline; border: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/powertoolsteam/201202/201202091433274769.png" alt="image" width="644" height="411" border="0" /></a></p>
<p>&nbsp;</p>
<p>Drag Fill: 快速填充-数据编辑的必杀利器！</p>
<p>&nbsp;</p>
<p>一定在Excel中见过用过的了，一个快速填充数据的利器。</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/powertoolsteam/201202/201202091433289328.png"><img style="display: inline; border: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/powertoolsteam/201202/201202091433306527.png" alt="image" width="644" height="478" border="0" /></a></p>
<p>&nbsp;</p>
<p>Range Filter: 区域数据分析助BI一臂之力！</p>
<p>对一个范围内的数据进行过滤排序，辅助数据分析。通过代码还可以对各种类型的数进行更加各种条件的过滤功能。</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/powertoolsteam/201202/201202091433313038.png"><img style="display: inline; border: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/powertoolsteam/201202/20120209143333728.png" alt="image" width="644" height="482" border="0" /></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Freeze: 超越Excel的冻结功能！</p>
<p>固定行头列头不滚动，在用Excel制作表格的时候可是经常使用的。可让行脚列脚也固定不能滚动，那可就需要用Spread WPF-Silverlight啦。</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/powertoolsteam/201202/201202091433368300.png"><img style="display: inline; border: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/powertoolsteam/201202/201202091433373416.png" alt="image" width="644" height="410" border="0" /></a></p>
<p>&nbsp;</p>
<p>Range Group: 是行是列，拉出来分组！</p>
<p>对数据进行行的分组是一般Grid都有的功能,而对于列的分组就是SpreadSheet的特色了。</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/powertoolsteam/201202/20120209143339516.png"><img style="display: inline; border: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/powertoolsteam/201202/201202091433407617.png" alt="image" width="644" height="387" border="0" /></a></p>
<p>&nbsp;</p>
<p>Cell Merge: 不会Merge的单元格不是好控件。</p>
<p>制作表格的时候，是少不了单元格合并的。当然，这个图不是来自Excel。</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/powertoolsteam/201202/201202091433419144.png"><img style="display: inline; border: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/powertoolsteam/201202/20120209143346163.png" alt="image" width="644" height="445" border="0" /></a></p>
<p>&nbsp;</p>
<p>更多技术细节请关注新浪微博<strong><a href="http://weibo.com/powertools">@葡萄城控件</a></strong>!</p>
<p>&nbsp;</p>
<p><strong><a href="http://www.gcpowertools.com.cn/livesamples/SpreadWFPsilverlight/ctp/SpreadSheetDemoTestPage.html?from=cnblog">Spread Silverlight Demo Site</a></strong></p>
<p><strong><a href="http://gcdn.grapecity.com/showtopic-3234.aspx?from=cnblog">Spread WPF-Silverlight CTP 下载</a></strong></p><img src="aggbug/2343927.html?type=0" width="1" height="1" alt=""/><p>作者: <a href="" target="_blank">葡萄城控件技术团队博客</a> 发表于 2012-02-09 14:34 <a href="http://www.cnblogs.com/powertoolsteam/archive/2012/02/09/2343927.html" target="_blank">原文链接</a></p><p>评论: 5　<a href="http://www.cnblogs.com/powertoolsteam/archive/2012/02/09/2343927.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/powertoolsteam/archive/2012/02/09/2343927.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/130752/" target="_blank">苹果征集iPad 3发布会演示应用 重点是图形应用</a><span style="color:gray">(2012-02-10 17:23)</span><br/>· <a href="http://news.cnblogs.com/n/130751/" target="_blank">京东商城涉足汽车销售 将上线售车频道</a><span style="color:gray">(2012-02-10 17:21)</span><br/>· <a href="http://news.cnblogs.com/n/130748/" target="_blank">亚马逊新广告挑衅苹果：一个iPad可买三台kindle</a><span style="color:gray">(2012-02-10 17:20)</span><br/>· <a href="http://news.cnblogs.com/n/130750/" target="_blank">动视暴雪确认今年第二季度推出《暗黑破坏神3》</a><span style="color:gray">(2012-02-10 16:59)</span><br/>· <a href="http://news.cnblogs.com/n/130749/" target="_blank">官方承认 Google Bar 逆行倒施</a><span style="color:gray">(2012-02-10 16:55)</span><br/></p><p>编辑推荐：<a href="http://kb.cnblogs.com/page/130672/" target="_blank">高级编程语言的发展历程</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">我的园子</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://q.cnblogs.com/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>Database2Sharp版本更新之自定义模板生成</title><link>http://www.cnblogs.com/wuhuacong/archive/2012/02/09/2341927.html</link><dc:creator>伍华聪</dc:creator><author>伍华聪</author><pubDate>Thu, 09 Feb 2012 01:57:00 GMT</pubDate><guid>http://www.cnblogs.com/wuhuacong/archive/2012/02/09/2341927.html</guid><description><![CDATA[<p><div>代码生成工具一直是很多从事开发人员的必备，一般开发人员都会选择一款高效、适合自己开发模式的代码生成工具，我也不例外，我一直让我的Database2Sharp(<a href="http://www.iqidi.com/database2sharp.htm">http://www.iqidi.com/database2sharp.htm</a>)代码生成工具围绕我的开发框架来生成代码，至今已经经过快7个年头的洗礼，主要是提供高效、快速的一键生成整个项目框架源码的操作。</div>
<p>代码生成工具Database2Sharp自一开始，就采用基于模板方式的代码生成方式，这样提高生成效率，并且减少维护成本（相对某些硬编码代码生成的方式更优），方便用户对模板进行适当的修改等特点，不过虽然是提供了模板修改的功能，但是由于在工具的主界面上，并未提供对自定义模板文件的管理，因此以前的版本一直没有完成用户自定义模板管理维护的功能，本次版本更新就是弥补这一不足，发挥模板应有的魅力和功能。</p>
<p>在实际开发当中，自定义模板生成是很多代码生成工具生成代码的重要补充，例如有些项目代码片段需要（<strong>例如控件赋值语句，或者控件数据显示语句等</strong>），如果能通过自定义模板方式，利用模板引擎的灵活特点，以及已有数据库的结构信息，就很方便生成重复性强、有一定规律的代码。</p>
<p>因此，本次Database2Sharp版本更新，主要就是提供一个对自定义模板管理，方便利用自定义模板灵活、高效的特点，并且利用后台数据库表、字段等信息，为实际的项目代码片段生成服务，本次还调整了整体的软件界面布局，利用成熟的Weifenluo布局控件，更好展示多文档的信息。&nbsp;</p>
<p><img src="http://images.cnblogs.com/cnblogs_com/wuhuacong/Database2Sharp/Database2sharp8.png" width="992" height="685" alt="" /><br />
</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;我们来看看自定义代码生成模块的功能是如何实现的，首先提供一个自定义模板列表进行维护，可以通过右键菜单进行添加、修改、重命名、删除等操作，模板代码可以进行【直接执行模板】和【选表进行代码生成】两种方式。</p>
<p><img src="http://images.cnblogs.com/cnblogs_com/wuhuacong/Database2Sharp/Database2sharp8_1.png" width="992" height="784" alt="" />&nbsp;</p>
<p>&nbsp;利用【选表进行代码生成】方式，可以很好利用后台的数据库表、字段等信息，结合模板生成高效的代码，如下所示。</p>
<p><img src="http://images.cnblogs.com/cnblogs_com/wuhuacong/Database2Sharp/Database2sharp8_2.png" width="992" height="780" alt="" />&nbsp;</p>
<p><br />
另外，为了方便大家对模板引擎NVelocity的了解，在软件工具安装的时候，附带了几个常见的例子，如下所示。</p>
<p><img src="http://images.cnblogs.com/cnblogs_com/wuhuacong/Database2Sharp/Database2sharp8_3.png" width="217" height="225" alt="" />&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;例子的代码大致如下所示，主要是让大家快速了解Nvelocity的模板语言VTL的使用。如果对模板引擎更加深入的了解，可以查看我之前的随笔《<a id="cb_post_title_url" href="http://www.cnblogs.com/wuhuacong/archive/2007/11/17/962172.html" style="color: #223355; ">强大的模板引擎开源软件NVelocity</a>》进一步了解。</p>
<p>遍历及注释，赋值语句例子。&nbsp;</p>
<div class="cnblogs_code">
<div>##Foreach语法操作函数<br />
<br />
#<span style="color: #0000FF;">set</span>(&nbsp;$criteria&nbsp;=&nbsp;[<span style="color: #800000;">"</span><span style="color: #800000;">name</span><span style="color: #800000;">"</span>,&nbsp;<span style="color: #800000;">"</span><span style="color: #800000;">address</span><span style="color: #800000;">"</span>]&nbsp;)<br />
#<span style="color: #0000FF;">foreach</span>(&nbsp;$criterion&nbsp;<span style="color: #0000FF;">in</span>&nbsp;$criteria&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;$criterion<br />
#end<br />
<br />
<br />
##注释操作<br />
<br />
注释<br />
单行注释<br />
##&nbsp;This&nbsp;<span style="color: #0000FF;">is</span>&nbsp;a&nbsp;single&nbsp;line&nbsp;comment<br />
<br />
多行注释&nbsp;<br />
#*<br />
&nbsp;Thus&nbsp;begins&nbsp;a&nbsp;multi-line&nbsp;comment.&nbsp;Online&nbsp;visitors&nbsp;won<span style="color: #800000;">'</span><span style="color: #800000;">t</span><span style="color: #800000;"><br />
</span>&nbsp;see&nbsp;<span style="color: #0000FF;">this</span>&nbsp;text&nbsp;because&nbsp;the&nbsp;Velocity&nbsp;Templating&nbsp;Engine&nbsp;will<br />
&nbsp;ignore&nbsp;it.<br />
<span style="font-family: verdana, 'courier new'; font-size: 14px; line-height: 21px; ">*#</span><span style="font-family: verdana, 'courier new'; font-size: 14px; line-height: 21px; ">&nbsp;</span></div>
</div>
<p><br />
</p>
<p>条件结构的例子&nbsp;</p>
<div class="cnblogs_code">
<div>##此处为注释说明<br />
##简单例子(主要规则：引用以$开头用于取得什么东西，而指令以#&nbsp;开始用于做什么事情)<br />
##在VTL中，所有变量标识符的开头要加上$字符，如$Name，也可以用一种更加明确的方法表示，例如${name}。<br />
<br />
#<span style="color: #0000FF;">set</span>($foo&nbsp;=&nbsp;<span style="color: #0000FF;">false</span>)<br />
<span style="color: #0000FF;">#if</span>&nbsp;($foo)<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">this</span>&nbsp;<span style="color: #0000FF;">is</span>&nbsp;<span style="color: #0000FF;">true</span><br />
#elseif&nbsp;($bar)<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">this</span>&nbsp;<span style="color: #0000FF;">is</span>&nbsp;<span style="color: #0000FF;">false</span><br />
#elseif&nbsp;(<span style="color: #0000FF;">true</span>)<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">this</span>&nbsp;should&nbsp;be&nbsp;followed&nbsp;by&nbsp;two&nbsp;blank&nbsp;lines<br />
#end<br />
<br />
##&nbsp;<span style="color: #0000FF;">this</span>&nbsp;<span style="color: #0000FF;">is</span>&nbsp;a&nbsp;single&nbsp;line&nbsp;comment<br />
<br />
#*<br />
<span style="color: #0000FF;">this</span>&nbsp;<span style="color: #0000FF;">is</span>&nbsp;a&nbsp;multi&nbsp;line&nbsp;comment<br />
<span style="color: #0000FF;">#if</span>&nbsp;(<br />
*#<br />
<br />
<br />
#<span style="color: #0000FF;">set</span>($user&nbsp;=&nbsp;<span style="color: #800000;">"</span><span style="color: #800000;">jason</span><span style="color: #800000;">"</span>)<br />
#<span style="color: #0000FF;">set</span>($login&nbsp;=&nbsp;<span style="color: #0000FF;">false</span>)<br />
#<span style="color: #0000FF;">set</span>($count&nbsp;=&nbsp;<span style="color: #800080;">5</span>)<br />
<br />
<span style="color: #0000FF;">#if</span>&nbsp;($user&nbsp;==&nbsp;"jason")<br />
&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;user&nbsp;$user&nbsp;<span style="color: #0000FF;">is</span>&nbsp;logged&nbsp;<span style="color: #0000FF;">in</span>!<br />
#end<br />
<br />
<span style="color: #0000FF;">#if</span>&nbsp;($count&nbsp;==&nbsp;5)<br />
&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;count&nbsp;<span style="color: #0000FF;">is</span>&nbsp;<span style="color: #800080;">5</span>!<br />
#end<br />
<br />
<span style="color: #0000FF;">#if</span>&nbsp;($login&nbsp;==&nbsp;false)<br />
&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;user&nbsp;isn<span style="color: #800000;">'</span><span style="color: #800000;">t&nbsp;logged&nbsp;in.</span><span style="color: #800000;"><br />
</span>#end<br />
<br />
<span style="color: #0000FF;">#if</span>&nbsp;($count&nbsp;!=&nbsp;3)<br />
&nbsp;&nbsp;&nbsp;&nbsp;\$count&nbsp;<span style="color: #0000FF;">is</span>&nbsp;not&nbsp;equal&nbsp;to&nbsp;<span style="color: #800080;">3</span></div>
<p><span style="font-family: verdana, 'courier new'; font-size: 14px; line-height: 21px; ">#end</span><span style="font-family: verdana, 'courier new'; font-size: 14px; line-height: 21px; ">&nbsp;</span>&nbsp;</p>
</div>
<p><br />
</p>
<p>宏脚本例子&nbsp;</p>
<div class="cnblogs_code">
<div>##&nbsp;#macro&nbsp;脚本元素允许模板设计者在VTL&nbsp;模板中定义重复的段。&nbsp;<br />
##&nbsp;Velocimacros&nbsp;不管是在复杂还是简单的场合都非常有用。<br />
##&nbsp;下面这个Velocimacro，仅用来节省击键和减少排版错误，介绍了一些NVelocity宏的概念。&nbsp;<br />
##&nbsp;可以带参数，参数放在宏名称的后面，空格隔开<br />
<br />
#macro(&nbsp;d&nbsp;)<br />
&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;<br />
#end<br />
<span style="font-family: verdana, 'courier new'; font-size: 14px; line-height: 21px; ">&nbsp;</span></div>
<p><span style="font-family: verdana, 'courier new'; font-size: 14px; line-height: 21px; ">#d()</span></p>
</div>
<p><br />
</p>
<p>&nbsp;以及一些常用的赋值及数据显示代码片段</p>
<div class="cnblogs_code">
<div>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;初始化<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;param&nbsp;name="info"&gt;</span><span style="color: #008000;">实体类信息</span><span style="color: #808080;">&lt;/param&gt;</span><span style="color: #808080;"><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">private</span>&nbsp;<span style="color: #0000FF;">void</span>&nbsp;InitData(${ClassName}Info&nbsp;info)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
#<span style="color: #0000FF;">foreach</span>($ColumnInfo&nbsp;<span style="color: #0000FF;">in</span>&nbsp;${TableInfo.ColumnList.Values})&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #0000FF;">#if</span>(${ColumnInfo.AutoIncrement}&nbsp;==&nbsp;false)&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #0000FF;">#if</span>(${ColumnInfo.NetType}&nbsp;==&nbsp;"System.String"&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">this</span>.txt${ColumnInfo.Name.Alias.ToCapit()}.Text&nbsp;=&nbsp;info.${ColumnInfo.Name.Alias.ToCapit()};<br />
#elseif(${ColumnInfo.NetType}&nbsp;==&nbsp;<span style="color: #800000;">"</span><span style="color: #800000;">System.DateTime</span><span style="color: #800000;">"</span>)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">this</span>.txt${ColumnInfo.Name.Alias.ToCapit()}.Text&nbsp;=&nbsp;info.${ColumnInfo.Name.Alias.ToCapit()}.ToShortDateString();<br />
<span style="color: #0000FF;">#else</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">this</span>.txt${ColumnInfo.Name.Alias.ToCapit()}.Text&nbsp;=&nbsp;info.${ColumnInfo.Name.Alias.ToCapit()}.ToString();<br />
#end<br />
#end&nbsp;#<span style="color: #0000FF;">#endif</span><br />
#end<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;获取数据<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;"><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">private</span>&nbsp;${ClassName}Info&nbsp;GetData()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;${ClassName}Info&nbsp;info&nbsp;=&nbsp;<span style="color: #0000FF;">new</span>&nbsp;${ClassName}Info();<br />
#<span style="color: #0000FF;">foreach</span>($ColumnInfo&nbsp;<span style="color: #0000FF;">in</span>&nbsp;${TableInfo.ColumnList.Values})&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #0000FF;">#if</span>(${ColumnInfo.AutoIncrement}&nbsp;==&nbsp;false)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #0000FF;">#if</span>(${ColumnInfo.NetType}&nbsp;==&nbsp;"System.Decimal"&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info.${ColumnInfo.Name.Alias.ToCapit()}&nbsp;=&nbsp;Helper.SafeConvertDecimal(<span style="color: #0000FF;">this</span>.txt${ColumnInfo.Name.Alias.ToCapit()}.Text);<br />
#elseif(${ColumnInfo.NetType}&nbsp;==&nbsp;<span style="color: #800000;">"</span><span style="color: #800000;">System.DateTime</span><span style="color: #800000;">"</span>)&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info.${ColumnInfo.Name.Alias.ToCapit()}&nbsp;=&nbsp;Helper.SafeConvertDate(<span style="color: #0000FF;">this</span>.txt${ColumnInfo.Name.Alias.ToCapit()}.Text);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #0000FF;">#else</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info.${ColumnInfo.Name.Alias.ToCapit()}&nbsp;=&nbsp;<span style="color: #0000FF;">this</span>.txt${ColumnInfo.Name.Alias.ToCapit()}.Text;&nbsp;&nbsp;&nbsp;<br />
#end&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
#end&nbsp;#<span style="color: #0000FF;">#endif</span><br />
#end</div>
<p><span style="font-family: verdana, 'courier new'; font-size: 14px; line-height: 21px; ">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</span><span style="font-family: verdana, 'courier new'; font-size: 14px; line-height: 21px; ">&nbsp;</span>&nbsp;</p>
</div>
<p><br />
</p>
<p>&nbsp;当然，了解这些可能还不够，还需要了解模板后台，能够利用的数据属性等信息，包括数据库、表、字段等相关的属性，方便在模板引擎中进行调用，生成更加强大的代码片段。</p>
<p>软件安装后，有一个帮助文件，是提供给开发者进行了解模板后台数据的相关属性和方法的，如下所示。</p>
<p><img src="http://images.cnblogs.com/cnblogs_com/wuhuacong/Database2Sharp/Database2sharp8_4.png" width="526" height="147" alt="" />&nbsp;</p>
<p>&nbsp;运行后如下所示：</p>
<p><img src="http://images.cnblogs.com/cnblogs_com/wuhuacong/Database2Sharp/Database2sharp8_5.png" width="962" height="716" alt="" />&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;除了以上新增的功能外，一键生成基于我的Winform框架结构的项目代码，是最为重要的功能，可以体验一下。另外，代码生成工具生成的数据库文档，快速生成实体类信息等模块，也是开发非常常用的功能，如果想了解更加关于我的代码生成工具的信息，可以参考我博客里面的标签【<a href="http://www.cnblogs.com/wuhuacong/tag/%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90%E5%B7%A5%E5%85%B7/" style="color: #000000; text-decoration: none; display: inline-block; margin-right: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial; font-size: 13px; line-height: normal; background-color: #eeeeee; ">代码生成工具</a>】。</p>
<p>&nbsp;</p><img src="aggbug/2341927.html?type=0" width="1" height="1" alt=""/><p>作者: <a href="" target="_blank">伍华聪</a> 发表于 2012-02-09 09:57 <a href="http://www.cnblogs.com/wuhuacong/archive/2012/02/09/2341927.html" target="_blank">原文链接</a></p><p>评论: 4　<a href="http://www.cnblogs.com/wuhuacong/archive/2012/02/09/2341927.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/wuhuacong/archive/2012/02/09/2341927.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/130752/" target="_blank">苹果征集iPad 3发布会演示应用 重点是图形应用</a><span style="color:gray">(2012-02-10 17:23)</span><br/>· <a href="http://news.cnblogs.com/n/130751/" target="_blank">京东商城涉足汽车销售 将上线售车频道</a><span style="color:gray">(2012-02-10 17:21)</span><br/>· <a href="http://news.cnblogs.com/n/130748/" target="_blank">亚马逊新广告挑衅苹果：一个iPad可买三台kindle</a><span style="color:gray">(2012-02-10 17:20)</span><br/>· <a href="http://news.cnblogs.com/n/130750/" target="_blank">动视暴雪确认今年第二季度推出《暗黑破坏神3》</a><span style="color:gray">(2012-02-10 16:59)</span><br/>· <a href="http://news.cnblogs.com/n/130749/" target="_blank">官方承认 Google Bar 逆行倒施</a><span style="color:gray">(2012-02-10 16:55)</span><br/></p><p>编辑推荐：<a href="http://kb.cnblogs.com/page/130672/" target="_blank">高级编程语言的发展历程</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">我的园子</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://q.cnblogs.com/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>大叔手记（19）：你真懂JavaScript吗？</title><link>http://www.cnblogs.com/TomXu/archive/2012/02/09/2330578.html</link><dc:creator>汤姆大叔</dc:creator><author>汤姆大叔</author><pubDate>Thu, 09 Feb 2012 01:45:00 GMT</pubDate><guid>http://www.cnblogs.com/TomXu/archive/2012/02/09/2330578.html</guid><description><![CDATA[<p><h1>介绍</h1>
<p>大叔整理的《<a href="http://www.cnblogs.com/TomXu/archive/2011/12/15/2288411.html" target="_blank">深入理解JavaScript系列</a>》已经快20篇了，不知道大家看的如何了？ 除了大家熟知的闭包、原型、作用域以外，不知道大家是否真正理解了JavaScript的核心特性，在网上发现几个小题目非常有意思，正好适合考察大家对JavaScript的理解。</p>
<p>如果大家有兴趣（或者自认为对JavaScript了解还不错的人），可以尝试着回答一下下面5个题目的输出结果（不要google或baidu哦）。</p>
<p>至于正确结果嘛，自己可以将代码复制到浏览器里就可以看到了（稍后这两天，我会将详细的解释单独发帖整理出来）。</p>
<p><span style="color: #339966;">PS：大胆点，不管结果对不对，都把你的答案贴出来（最好带有自己的想法，后面我们和准确解释做对比，这也是学习的过程）。</span></p>
<p><span style="color: #339966;">答案已经贴在《<a class="titlelnk" href="http://www.cnblogs.com/TomXu/archive/2012/02/10/2342098.html" target="_blank">深入理解JavaScript系列（20）：《你真懂JavaScript吗？》答案详解</a>》里了<br /></span></p>
<h1>正文</h1>
<p>题目1：</p>
<div class="cnblogs_code">
<pre><span style="color: #0000ff;">if</span> (!("a" <span style="color: #0000ff;">in</span> window)) {<br />    <span style="color: #0000ff;">var</span> a = 1;<br />}<br />alert(a);</pre>
</div>
<p>&nbsp;</p>
<p>题目2</p>
<div class="cnblogs_code">
<pre><span style="color: #0000ff;">var</span> a = 1,<br />    b = <span style="color: #0000ff;">function</span> a(x) {<br />        x &amp;&amp; a(--x);<br />    };<br />alert(a);</pre>
</div>
<p>&nbsp;</p>
<p>题目3：</p>
<div class="cnblogs_code">
<pre><span style="color: #0000ff;">function</span> a(x) {<br />    <span style="color: #0000ff;">return</span> x * 2;<br />}<br /><span style="color: #0000ff;">var</span> a;<br />alert(a);</pre>
</div>
<p>&nbsp;</p>
<p>题目4：</p>
<div class="cnblogs_code">
<pre><span style="color: #0000ff;">function</span> b(x, y, a) {<br />    arguments[2] = 10;<br />    alert(a);<br />}<br />b(1, 2, 3);</pre>
</div>
<p>&nbsp;</p>
<p>题目5：</p>
<div class="cnblogs_code">
<pre><span style="color: #0000ff;">function</span> a() {<br />    alert(<span style="color: #0000ff;">this</span>);<br />}<br />a.call(<span style="color: #0000ff;">null</span>);</pre>
</div>
<h1>同步与推荐</h1>
<p>本文已同步至目录索引：<a href="http://www.cnblogs.com/TomXu/archive/2011/12/10/2283385.html" target="_blank">《大叔手记全集》</a></p>
<p><strong>大叔手记</strong>：旨在记录日常工作中的各种小技巧与资料（包括但不限于技术），如对你有用，请推荐一把，给大叔写作的动力。</p><img src="aggbug/2330578.html?type=0" width="1" height="1" alt=""/><p>作者: <a href="" target="_blank">汤姆大叔</a> 发表于 2012-02-09 09:45 <a href="http://www.cnblogs.com/TomXu/archive/2012/02/09/2330578.html" target="_blank">原文链接</a></p><p>评论: 62　<a href="http://www.cnblogs.com/TomXu/archive/2012/02/09/2330578.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/TomXu/archive/2012/02/09/2330578.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/130752/" target="_blank">苹果征集iPad 3发布会演示应用 重点是图形应用</a><span style="color:gray">(2012-02-10 17:23)</span><br/>· <a href="http://news.cnblogs.com/n/130751/" target="_blank">京东商城涉足汽车销售 将上线售车频道</a><span style="color:gray">(2012-02-10 17:21)</span><br/>· <a href="http://news.cnblogs.com/n/130748/" target="_blank">亚马逊新广告挑衅苹果：一个iPad可买三台kindle</a><span style="color:gray">(2012-02-10 17:20)</span><br/>· <a href="http://news.cnblogs.com/n/130750/" target="_blank">动视暴雪确认今年第二季度推出《暗黑破坏神3》</a><span style="color:gray">(2012-02-10 16:59)</span><br/>· <a href="http://news.cnblogs.com/n/130749/" target="_blank">官方承认 Google Bar 逆行倒施</a><span style="color:gray">(2012-02-10 16:55)</span><br/></p><p>编辑推荐：<a href="http://kb.cnblogs.com/page/130672/" target="_blank">高级编程语言的发展历程</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">我的园子</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://q.cnblogs.com/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item></channel></rss>
