﻿<?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/solucky/</link><description>I Love The Programme More Than My Live</description><language>zh-cn</language><lastBuildDate>Wed, 20 Aug 2008 23:12:59 GMT</lastBuildDate><pubDate>Wed, 20 Aug 2008 23:12:59 GMT</pubDate><ttl>60</ttl><item><title>关于“Internet Explorer无法打开站点,已终止操作”</title><link>http://www.cnblogs.com/solucky/archive/2008/05/26/1208028.html</link><dc:creator>只吃豆芽猪</dc:creator><author>只吃豆芽猪</author><pubDate>Mon, 26 May 2008 15:57:00 GMT</pubDate><guid>http://www.cnblogs.com/solucky/archive/2008/05/26/1208028.html</guid><wfw:comment>http://www.cnblogs.com/solucky/comments/1208028.html</wfw:comment><comments>http://www.cnblogs.com/solucky/archive/2008/05/26/1208028.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/solucky/comments/commentRss/1208028.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/solucky/services/trackbacks/1208028.html</trackback:ping><description><![CDATA[在页面还没有ready的时候就调用了htmlObject的appendChild或者innerHTML操作，这样会在IE上弹出一个对话框：&#8220;Internet Explorer无法打开站点,已终止操作&#8221;
<p>　　今天就遇到了这个问题，再网上搜索了一下，解决办法大概为以下两点：</p>
<p>　　(1)在appendChild或者innerHTML操作处判断document.readyState=="complete", 若为否，则setTimeout若干秒之后重新作这个操作。但是，此属性只对ie，opeara有效，ff的document没有readyState属性，永远是undefined.</p>
<p>　　(2)在script中使用defer属性。意在页面加载完毕后再执行脚本,这样可以避免找不到对象的问题。defer不会考虑外部文件是否全部下载完，只会判当前页面是否全部加载完成。并且，有defer标签的代码块里不能写document.write方法</p>
<p>　　自已仔细看了看为什么会出现&#8220;页面还没有ready！&#8221;的情况呢，难道是html标签错误，导致浏览器解析错误，检查了一个获取innerHTML的span标签，果然写成&lt;span id="idnume"&gt;&lt;span&gt;了，而这是这个页面仅有的一个span标签，导致浏览器也无法容错，修正后问题解决了！</p>
<img src ="http://www.cnblogs.com/solucky/aggbug/1208028.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41802/" target="_blank">[新闻]微软Office 14即将展开Alpha测试</a>]]></description></item><item><title>JavaScript 面向对象程序设计（下）——继承与多态</title><link>http://www.cnblogs.com/solucky/archive/2007/11/30/978808.html</link><dc:creator>只吃豆芽猪</dc:creator><author>只吃豆芽猪</author><pubDate>Fri, 30 Nov 2007 12:47:00 GMT</pubDate><guid>http://www.cnblogs.com/solucky/archive/2007/11/30/978808.html</guid><wfw:comment>http://www.cnblogs.com/solucky/comments/978808.html</wfw:comment><comments>http://www.cnblogs.com/solucky/archive/2007/11/30/978808.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/solucky/comments/commentRss/978808.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/solucky/services/trackbacks/978808.html</trackback:ping><description><![CDATA[摘要: 前面我们讨论了如何在 JavaScript 语言中实现对私有实例成员、公有实例成员、私有静态成员、公有静态成员和静态类的封装。这次我们来讨论一下面向对象程序设计中的另外两个要素：继承与多态。<br><br>1 又是几个基本概念<br>为什么要说又呢？  <br><br>在讨论继承时，我们已经列出了一些基本概念了，那些概念是跟封装密切相关的概念，今天我们要讨论的基本概念，主要是跟继承与多态相关的，但是它们跟封装也有一些联系。<br><br>&nbsp;&nbsp;<a href='http://www.cnblogs.com/solucky/archive/2007/11/30/978808.html'>阅读全文</a><img src ="http://www.cnblogs.com/solucky/aggbug/978808.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41801/" target="_blank">[新闻]《星际争霸2》新图</a>]]></description></item><item><title>JavaScript 面向对象程序设计（上）——封装[转]</title><link>http://www.cnblogs.com/solucky/archive/2007/11/30/978805.html</link><dc:creator>只吃豆芽猪</dc:creator><author>只吃豆芽猪</author><pubDate>Fri, 30 Nov 2007 12:43:00 GMT</pubDate><guid>http://www.cnblogs.com/solucky/archive/2007/11/30/978805.html</guid><wfw:comment>http://www.cnblogs.com/solucky/comments/978805.html</wfw:comment><comments>http://www.cnblogs.com/solucky/archive/2007/11/30/978805.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/solucky/comments/commentRss/978805.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/solucky/services/trackbacks/978805.html</trackback:ping><description><![CDATA[摘要: JavaScript 是一种非常灵活的面向对象程序设计语言，它与传统的强类型的面向对象程序设计语言（如 C++，Java，C# 等）有很大不同，所以要实现如 C++、java、C# 当中的一些特性就需要换一种思考方式来解决。今天主要讨论如何在 JavaScript 脚本中实现数据的封装（encapsulation）。<br><br>数据封装说的简单点就是把不希望调用者看见的内容隐藏起来。它是面向对象程序设计的三要素之首，其它两个是继承和多态，关于它们的内容在后面再讨论。<br><br>关于数据封装的实现，在 C++、Java、C# 等语言中是通过 public、private、static 等关键字实现的。在 JavaScript 则采用了另外一种截然不同的形式。在讨论如何具体实现某种方式的数据封装前，我们先说几个简单的，大家所熟知却又容易忽略的 JavaScript 的概念。<br><br>&nbsp;&nbsp;<a href='http://www.cnblogs.com/solucky/archive/2007/11/30/978805.html'>阅读全文</a><img src ="http://www.cnblogs.com/solucky/aggbug/978805.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41801/" target="_blank">[新闻]《星际争霸2》新图</a>]]></description></item><item><title>JS类 检测上传图片的大小,宽,高及格式检查</title><link>http://www.cnblogs.com/solucky/archive/2007/11/27/974129.html</link><dc:creator>只吃豆芽猪</dc:creator><author>只吃豆芽猪</author><pubDate>Tue, 27 Nov 2007 06:42:00 GMT</pubDate><guid>http://www.cnblogs.com/solucky/archive/2007/11/27/974129.html</guid><wfw:comment>http://www.cnblogs.com/solucky/comments/974129.html</wfw:comment><comments>http://www.cnblogs.com/solucky/archive/2007/11/27/974129.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/solucky/comments/commentRss/974129.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/solucky/services/trackbacks/974129.html</trackback:ping><description><![CDATA[摘要: JS类 检测上传图片的大小,宽,高及格式检查&nbsp;&nbsp;<a href='http://www.cnblogs.com/solucky/archive/2007/11/27/974129.html'>阅读全文</a><img src ="http://www.cnblogs.com/solucky/aggbug/974129.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41800/" target="_blank">[新闻]Google放出Android开发路线图</a>]]></description></item><item><title>.net 2.0 制作 柱状图</title><link>http://www.cnblogs.com/solucky/archive/2007/11/03/948307.html</link><dc:creator>只吃豆芽猪</dc:creator><author>只吃豆芽猪</author><pubDate>Sat, 03 Nov 2007 12:19:00 GMT</pubDate><guid>http://www.cnblogs.com/solucky/archive/2007/11/03/948307.html</guid><wfw:comment>http://www.cnblogs.com/solucky/comments/948307.html</wfw:comment><comments>http://www.cnblogs.com/solucky/archive/2007/11/03/948307.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/solucky/comments/commentRss/948307.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/solucky/services/trackbacks/948307.html</trackback:ping><description><![CDATA[最近项目需要用到图表,饼图,柱状图，这些都很常用，在网上找了下，不是自已要的，只好自已动手做个,先做了个柱状图,<br />
先看下效果图<br />
<img height="363" alt="" src="http://www.cnblogs.com/images/cnblogs_com/solucky/67860/3dbar.gif" width="327" border="0" /><br />
代码有详解<br />
<a title="下载3DBAR代码" style="color: #ff0000" href="http://www.cnblogs.com/Files/solucky/3dbar.rar">下载代码 </a><br />
此代码在winform环境下编译通过,要用在web环境也简单，只需将<span class="identifier">Graphics对像保存相应的地方既可.</span> 
<img src ="http://www.cnblogs.com/solucky/aggbug/948307.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41799/" target="_blank">[新闻]番茄花园作者被警方逮捕</a>]]></description></item><item><title>[转]AJAX之旅 由prototype_1.3.1进入javascript殿堂－类的初探 </title><link>http://www.cnblogs.com/solucky/archive/2007/09/21/900898.html</link><dc:creator>只吃豆芽猪</dc:creator><author>只吃豆芽猪</author><pubDate>Fri, 21 Sep 2007 01:59:00 GMT</pubDate><guid>http://www.cnblogs.com/solucky/archive/2007/09/21/900898.html</guid><wfw:comment>http://www.cnblogs.com/solucky/comments/900898.html</wfw:comment><comments>http://www.cnblogs.com/solucky/archive/2007/09/21/900898.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/solucky/comments/commentRss/900898.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/solucky/services/trackbacks/900898.html</trackback:ping><description><![CDATA[摘要: AJAX之旅(1)：由prototype_1.3.1进入javascript殿堂－类的初探 还是决定冠上ajax的头衔，毕竟很多人会用这个关键词搜索。虽然我认为这只是个炒作的概念，不过不得不承认ajax叫起来要方便多了。所以ajax的意思我就不详细解释了。写这个教程的起因很简单：经过一段时间的ajax学习，有一些体会，并且越发认识到ajax技术的强大，所以决定记录下来，顺便也是对自己思路的整理。有&nbsp;&nbsp;<a href='http://www.cnblogs.com/solucky/archive/2007/09/21/900898.html'>阅读全文</a><img src ="http://www.cnblogs.com/solucky/aggbug/900898.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41792/" target="_blank">[新闻]WordPress和Movable Type影响社交网站的未来</a>]]></description></item><item><title>asp.net如何获取客户端网卡mac地址</title><link>http://www.cnblogs.com/solucky/archive/2007/09/19/898299.html</link><dc:creator>只吃豆芽猪</dc:creator><author>只吃豆芽猪</author><pubDate>Wed, 19 Sep 2007 04:27:00 GMT</pubDate><guid>http://www.cnblogs.com/solucky/archive/2007/09/19/898299.html</guid><wfw:comment>http://www.cnblogs.com/solucky/comments/898299.html</wfw:comment><comments>http://www.cnblogs.com/solucky/archive/2007/09/19/898299.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cnblogs.com/solucky/comments/commentRss/898299.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/solucky/services/trackbacks/898299.html</trackback:ping><description><![CDATA[摘要: asp.net如何获取客户端网卡mac地址&nbsp;&nbsp;<a href='http://www.cnblogs.com/solucky/archive/2007/09/19/898299.html'>阅读全文</a><img src ="http://www.cnblogs.com/solucky/aggbug/898299.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41791/" target="_blank">[新闻]谷歌平台手机获准上市</a>]]></description></item><item><title>[转]不可多得的Javascript(AJAX)开发工具 － Aptana      </title><link>http://www.cnblogs.com/solucky/archive/2007/09/16/895123.html</link><dc:creator>只吃豆芽猪</dc:creator><author>只吃豆芽猪</author><pubDate>Sun, 16 Sep 2007 13:42:00 GMT</pubDate><guid>http://www.cnblogs.com/solucky/archive/2007/09/16/895123.html</guid><wfw:comment>http://www.cnblogs.com/solucky/comments/895123.html</wfw:comment><comments>http://www.cnblogs.com/solucky/archive/2007/09/16/895123.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/solucky/comments/commentRss/895123.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/solucky/services/trackbacks/895123.html</trackback:ping><description><![CDATA[<div class="postTitle">自从开始做Web开发起，一直都没有找到一个很让人满意的Javascript开发工具。从Editplus、Dreamweaver到FrontPage、Visual Studio，没有一样是很称手的。你是不是还在为Visual Studio中的那一点点智能提示感到兴奋不已？的确VS比其他的好那么一点点，但是相对于VS中的C#、VB等来说对javascript的支持实在是太少了。</div>
<div class="postText">
<p>下面我要向你介绍一款非常优秀的Javascript(AJAX) 开发工具：<a href="http://www.aptana.com/"><font color="#1a8bc8">Aptana</font></a>。应为它实在太棒了，所以我忍不住想向你推荐它。</p>
<p>Aptana中的智能提示称为 <strong>Code Assist</strong>，相当于VS中的Intellisense。<br />
<a href="http://www.cnblogs.com/images/cnblogs_com/jackielin/WindowsLiveWriter/JavascriptAJAXAptana_121F/code_assist%5B2%5D.png" atomicselection="true"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="193" alt="" src="http://www.cnblogs.com/images/cnblogs_com/jackielin/WindowsLiveWriter/JavascriptAJAXAptana_121F/code_assist_thumb.png" width="428" border="0" /></a> <br />
看到后面的浏览器图标了吗？那是<strong>浏览器兼容性</strong>的提示。如果你是一个JS老鸟你应该知道那对开发者来说有多重要。</p>
<p>不仅仅是javascript，智能提示的范围还包括DOM 1,2 for HTML：<a href="http://www.cnblogs.com/images/cnblogs_com/jackielin/WindowsLiveWriter/JavascriptAJAXAptana_121F/screenshot_html_code_assist%5B2%5D.png" atomicselection="true"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="213" alt="" src="http://www.cnblogs.com/images/cnblogs_com/jackielin/WindowsLiveWriter/JavascriptAJAXAptana_121F/screenshot_html_code_assist_thumb.png" width="570" border="0" /></a> <br />
CSS：<br />
<a href="http://www.cnblogs.com/images/cnblogs_com/jackielin/WindowsLiveWriter/JavascriptAJAXAptana_121F/screenshot_css_code_assist%5B1%5D.jpg" atomicselection="true"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="273" alt="" src="http://www.cnblogs.com/images/cnblogs_com/jackielin/WindowsLiveWriter/JavascriptAJAXAptana_121F/screenshot_css_code_assist_thumb%5B1%5D.jpg" width="557" border="0" /></a> <br />
看到后面的黄框框了吗？那是VS里称为Quick Info的东西。</p>
<p>错误提示 －－ 一个都不能少：<br />
<a href="http://www.cnblogs.com/images/cnblogs_com/jackielin/WindowsLiveWriter/JavascriptAJAXAptana_121F/screenshot_problems_view_integrated%5B1%5D.jpg" atomicselection="true"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="575" alt="" src="http://www.cnblogs.com/images/cnblogs_com/jackielin/WindowsLiveWriter/JavascriptAJAXAptana_121F/screenshot_problems_view_integrated_thumb%5B1%5D.jpg" width="494" border="0" /></a> </p>
<p>Doument outline（文档结构）CSS、HTML、JS统一显示：<br />
<a href="http://www.cnblogs.com/images/cnblogs_com/jackielin/WindowsLiveWriter/JavascriptAJAXAptana_121F/screenshot_outline_integrated%5B6%5D.png" atomicselection="true"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="535" alt="" src="http://www.cnblogs.com/images/cnblogs_com/jackielin/WindowsLiveWriter/JavascriptAJAXAptana_121F/screenshot_outline_integrated_thumb%5B6%5D.png" width="490" border="0" /></a> </p>
<p>代码折叠、项目管理这些小菜不用讲了，都支持。Aptana还有很丰富的在线文档，是以wiki形式不断更新的，当然在连线的情况下你可以在Aptana中直接访问这些文档。</p>
<p>最新版的Aptana（0.2.6）已经开始支持Debug了，不过要通过Firefox插件的形式。</p>
<p>Aptana是一个java开源项目（.NET程序员应该扪心自问了吧），现在还在beta阶段（从版本号你就可以看出来了）。所以它是跨平台的。你在windows上运行它可能会觉得有一点点慢（比VS快多了）。其实Aptana的内存占用很少，才2M多，不过JVM...我就不想说什么了。</p>
<p>幸运的是你可以通过javascript扩展它，这里是它的<a href="http://www.aptana.com/dev/api/ide/aptana_ide_0.2.6/"><font color="#1a8bc8">API</font></a>。</p>
<p>Aptana还有太多让人惊艳的地方，你一定要自己用过了才知道。&nbsp;</p>
<p>&nbsp;</p>
<div class="postTitle"><a class="postTitle2" id="viewpost1_TitleUrl" href="http://www.cnblogs.com/jackielin/archive/2006/11/07/Aptana1.html"><strong><font color="#ff0000" size="3">Aptana使用入门一：Code Assist</font></strong></a><strong><font color="#ff0000" size="3"> </font></strong></div>
<p><font size="2">前两天我在</font><a href="http://www.cnblogs.com/jackielin/archive/2006/11/05/550422.html"><font color="#1a8bc8" size="2">《不可多得的Javascript(AJAX)开发工具 － Aptana》</font></a><font size="2">一文中简单介绍了Aptana。大家都很关注，同时也提了很多问题。因为Aptana相关的内容比较多，不可能在一篇里全部讲完，所以我想就问题比较多的几方面陆续写几篇小文。希望能对大家有所帮助。本人也是刚刚开始使用Aptana，有不对的地方请大家包含。另外，还是希望有E文基础的朋友多读读Aptana的文档，你的问题应该很快就会解决的。</font></p>
<p><font size="2">&nbsp;Aptana中的智能提示（Code Assist）是大家比较感兴趣的部分，也是它强于其他工具的重要部分。这里我再介绍几点。</font></p>
<h3><strong><font size="2">一．快捷键</font></strong></h3>
<p><font size="2">1．<br />
在Aptana中，你可以在文档的任何位置用 <strong>Alt+/</strong> 激活智能提示。</font></p>
<p><font size="2">当然你也可以把它替换成任何你想要的快捷键，就在菜单 Window / Preferences / General / Keys ，然后找到&#8220;Content Assist&#8221;这一项，修改它就可以了。</font></p>
<p><font size="2">需要注意的是 Ctrl+J 已经被另一个功能(Incremental Find)占用了，如果你要用Ctrl+J的话，最好连带替换。</font></p>
<p><font size="2">2．<br />
输入选中的提示项的快截键是&#8220;Enter&#8221;而不是&#8220;Tab&#8221;，这点可能很多人都不太习惯。</font></p>
<p><font size="2">&nbsp;</font></p>
<h3><strong><font size="2">二．自动完成括号、引号</font></strong></h3>
<p><font size="2">无论是<strong>{ }</strong>&nbsp;、<strong>( ) </strong>还是<strong>[ ]</strong>，还有<strong>" "</strong>，只要你输入前半个后半个都是会自动键入的。<br />
在字符串前面输引号，另一个引号会自动加在字符串末尾，鼠标自动定位在末尾的引号之后。<br />
</font><a href="http://www.cnblogs.com/images/cnblogs_com/jackielin/WindowsLiveWriter/AptanaCodeAssist_9F5C/aptana11.jpg" atomicselection="true"><font size="2"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="138" alt="" src="http://www.cnblogs.com/images/cnblogs_com/jackielin/WindowsLiveWriter/AptanaCodeAssist_9F5C/aptana1_thumb1.jpg" width="370" border="0" /></font></a><font size="2"> </font></p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/jackielin/WindowsLiveWriter/AptanaCodeAssist_9F5C/aptana23.jpg" atomicselection="true"><font size="2"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="133" alt="" src="http://www.cnblogs.com/images/cnblogs_com/jackielin/WindowsLiveWriter/AptanaCodeAssist_9F5C/aptana2_thumb3.jpg" width="370" border="0" /></font></a><font size="2">&nbsp;<br />
</font></p>
<h3><strong><font size="2">三.函数参数提示</font></strong></h3>
<p><font size="2">大家看这个图就明白了<br />
</font><a href="http://www.cnblogs.com/images/cnblogs_com/jackielin/WindowsLiveWriter/AptanaCodeAssist_9F5C/CodeAssistPopUp21.png" atomicselection="true"><font size="2"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="268" alt="" src="http://www.cnblogs.com/images/cnblogs_com/jackielin/WindowsLiveWriter/AptanaCodeAssist_9F5C/CodeAssistPopUp2_thumb1.png" width="571" border="0" /></font></a><font size="2"> </font></p>
<p><font size="2">&nbsp;</font></p>
<h3><strong><font size="2">四．无处不在的Tip</font></strong></h3>
<p><font size="2">大家在输入dom对象，函数，参数，css，html等等的时候都会不断跳出包含各种提示信息的tip，我就不一一截图了，大家使用中慢慢享受吧。</font></p>
<p><font size="2">另外在任何位置你吧鼠标move on到某个对象上，都会跳出内容更为丰富的tip，甚至还包括sample<br />
</font><a href="http://www.cnblogs.com/images/cnblogs_com/jackielin/WindowsLiveWriter/AptanaCodeAssist_9F5C/tips1.jpg" atomicselection="true"><font size="2"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="451" alt="" src="http://www.cnblogs.com/images/cnblogs_com/jackielin/WindowsLiveWriter/AptanaCodeAssist_9F5C/tips_thumb1.jpg" width="428" border="0" /></font></a><font size="2">&nbsp;</font></p>
<p><font size="2">&nbsp;</font></p>
<h3><strong><font size="2">五．支持第三方(自定义)框架</font></strong></h3>
<p><font size="2">下面可是今天的重头戏，请欣赏：</font></p>
<p><font size="2">首先找到ASP.NET AJAX的教本库，选择后拖曳到Code Assist Profiles窗口内，<br />
</font><a href="http://www.cnblogs.com/images/cnblogs_com/jackielin/WindowsLiveWriter/AptanaCodeAssist_9F5C/caprofile1.jpg" atomicselection="true"><font size="2"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="459" alt="" src="http://www.cnblogs.com/images/cnblogs_com/jackielin/WindowsLiveWriter/AptanaCodeAssist_9F5C/caprofile_thumb1.jpg" width="577" border="0" /></font></a><font size="2"> </font></p>
<p><font size="2">默认被添加到Default Profile下<br />
</font><a href="http://www.cnblogs.com/images/cnblogs_com/jackielin/WindowsLiveWriter/AptanaCodeAssist_9F5C/caprofile31.jpg" atomicselection="true"><font size="2"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="291" alt="" src="http://www.cnblogs.com/images/cnblogs_com/jackielin/WindowsLiveWriter/AptanaCodeAssist_9F5C/caprofile3_thumb1.jpg" width="217" border="0" /></font></a><font size="2"> </font></p>
<p><font size="2">然后建一个test.js，写个函数看看<br />
</font><a href="http://www.cnblogs.com/images/cnblogs_com/jackielin/WindowsLiveWriter/AptanaCodeAssist_9F5C/assist1%5B1%5D.jpg" atomicselection="true"><font size="2"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="231" alt="" src="http://www.cnblogs.com/images/cnblogs_com/jackielin/WindowsLiveWriter/AptanaCodeAssist_9F5C/assist1_thumb%5B1%5D.jpg" width="683" border="0" /></font></a><font size="2"> &nbsp;</font></p>
<p><font size="2">Wow，do you see that?&nbsp; ASP.NET AJAX 库里的东西全进来了！</font></p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/jackielin/WindowsLiveWriter/AptanaCodeAssist_9F5C/assist2%5B1%5D.jpg" atomicselection="true"><font size="2"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="241" alt="" src="http://www.cnblogs.com/images/cnblogs_com/jackielin/WindowsLiveWriter/AptanaCodeAssist_9F5C/assist2_thumb%5B1%5D.jpg" width="659" border="0" /></font></a><font size="2"> &nbsp;<br />
新建的变量也进来了！</font></p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/jackielin/WindowsLiveWriter/AptanaCodeAssist_9F5C/assist3%5B1%5D.jpg" atomicselection="true"><font size="2"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="264" alt="" src="http://www.cnblogs.com/images/cnblogs_com/jackielin/WindowsLiveWriter/AptanaCodeAssist_9F5C/assist3_thumb%5B1%5D.jpg" width="494" border="0" /></font></a><font size="2">&nbsp;<br />
变量是&#8220;强类型&#8221;的哦！（请允许我借用这个词）</font></p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/jackielin/WindowsLiveWriter/AptanaCodeAssist_9F5C/assist4%5B1%5D.jpg" atomicselection="true"><font size="2"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="311" alt="" src="http://www.cnblogs.com/images/cnblogs_com/jackielin/WindowsLiveWriter/AptanaCodeAssist_9F5C/assist4_thumb%5B1%5D.jpg" width="461" border="0" /></font></a><font size="2">&nbsp;<br />
新建的函数也照进不误。</font></p>
<p><font size="2">注：在这里我用了Default Profile，由于它是&#8220;全局&#8221;的，所以在你编辑任一文件时相关Assist都会有效。更好的方法是用Project来管理。不过这不在本文的讨论范围之内。<br />
</font></p>
<h3><strong><font size="2">六. 自动到转到函数定义</font></strong></h3>
<p><font size="2">让我们把光标放到toString()上，然后按F3看看<br />
</font><a href="http://www.cnblogs.com/images/cnblogs_com/jackielin/WindowsLiveWriter/AptanaCodeAssist_9F5C/assist5%5B1%5D.jpg" atomicselection="true"><font size="2"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="104" alt="" src="http://www.cnblogs.com/images/cnblogs_com/jackielin/WindowsLiveWriter/AptanaCodeAssist_9F5C/assist5_thumb%5B1%5D.jpg" width="270" border="0" /></font></a><font size="2"> <br />
</font><a href="http://www.cnblogs.com/images/cnblogs_com/jackielin/WindowsLiveWriter/AptanaCodeAssist_9F5C/assist6%5B1%5D.jpg" atomicselection="true"><font size="2"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="202" alt="" src="http://www.cnblogs.com/images/cnblogs_com/jackielin/WindowsLiveWriter/AptanaCodeAssist_9F5C/assist6_thumb%5B1%5D.jpg" width="422" border="0" /></font></a><font size="2"> <br />
MicrosoftAjax.js被自动打开，并定位到&#8220;Sys$StringBuilder$toString&#8221;。为了方便调试，beta版用了新的命名方式，使我们无法直接定位到函数定义。没关系，把光标放到&#8220;Sys$StringBuilder$toString&#8221;再点一下F3</font></p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/jackielin/WindowsLiveWriter/AptanaCodeAssist_9F5C/assist7%5B1%5D.jpg" atomicselection="true"><font size="2"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="245" alt="" src="http://www.cnblogs.com/images/cnblogs_com/jackielin/WindowsLiveWriter/AptanaCodeAssist_9F5C/assist7_thumb%5B1%5D.jpg" width="560" border="0" /></font></a><font size="2">&nbsp;<br />
这下有了吧。<br />
&nbsp;</font></p>
<h3><strong><font size="2">七．用ScriptDoc定制Code Assist</font></strong></h3>
<p><font size="2">给我们的concat函数加一点注释，然后再看看提示出来的内容<br />
</font><a href="http://www.cnblogs.com/images/cnblogs_com/jackielin/WindowsLiveWriter/AptanaCodeAssist_9F5C/assist8%5B1%5D.jpg" atomicselection="true"><font size="2"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="348" alt="" src="http://www.cnblogs.com/images/cnblogs_com/jackielin/WindowsLiveWriter/AptanaCodeAssist_9F5C/assist8_thumb%5B1%5D.jpg" width="439" border="0" /></font></a><font size="2"> <br />
ScriptDoc注释也可以定义在和js文件同名的.sdoc文件内。具体方法请参考文档。</font></p>
</div>
<img src ="http://www.cnblogs.com/solucky/aggbug/895123.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41790/" target="_blank">[新闻]微软自称传媒公司 强调搜索引擎三大趋势</a>]]></description></item><item><title>探究 Singleton 设计模式（构建分布式应用程序）</title><link>http://www.cnblogs.com/solucky/archive/2007/09/12/890455.html</link><dc:creator>只吃豆芽猪</dc:creator><author>只吃豆芽猪</author><pubDate>Wed, 12 Sep 2007 02:32:00 GMT</pubDate><guid>http://www.cnblogs.com/solucky/archive/2007/09/12/890455.html</guid><wfw:comment>http://www.cnblogs.com/solucky/comments/890455.html</wfw:comment><comments>http://www.cnblogs.com/solucky/archive/2007/09/12/890455.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/solucky/comments/commentRss/890455.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/solucky/services/trackbacks/890455.html</trackback:ping><description><![CDATA[<p>来源：<a href="http://www.microsoft.com/">www.microsoft.com</a><br />
来源：<a href="http://uml.org.cn/sjms/200506211.htm">UML软件工程组织</a></p>
<h3>摘要：</h3>
<p>讨论 Singleton 设计模式（指示如何以及何时创建对象的创造性模式）及其在 Microsoft .NET 框架中的有效使用。</p>
<h3 id="i0">内容</h3>
<p><a href="http://sheneyan.com/tech/article/patterns/singleton.html#i1">简介</a></p>
<p><a href="http://sheneyan.com/tech/article/patterns/singleton.html#i2">Singleton 模式</a></p>
<p><a href="http://sheneyan.com/tech/article/patterns/singleton.html#i3">结论</a></p>
<h3 id="i1">简介</h3>
<p>在开发软件应用程序过程中，随着应用程序的开发，会出现重复性的模式。 随着整个软件系统的开发，很多相同的模式会逐渐显现出来。</p>
<p>这种重复性模式概念在其他应用中是非常明显的。 汽车制造就是一种此类应用。 很多不同的汽车型号使用相同的子构件，包括大多数基本部件（例如，灯泡和紧固零件）以及较大的构件（例如，底盘和发动机）。</p>
<p>在住宅建筑中，重复性模式概念适用于螺丝和螺钉以及整体总体建筑物配电系统。 无论组建的小组是为了开发新的汽车设计还是新的建筑物设计，它其通常不必没有考虑到以前已解决的问题。 如果设计和建筑住宅的小组必须重新构思和设计房子的每一个组成部分，则整个过程所花的时间比现在要长得多。 门高或灯开关功能等许多设计决策（例如，门高或灯开关功能）很容易理解。 房为满足给房子不同部分提供洗手功能的要求，房屋设计师不必重新设计和重新建造不同类型的输供水和蓄水设施：，以便达到为房子不同部分提供洗手功能的要求： 标准水槽以及标准的热水和冷水输入接头和排水输出接头是很容易理解非常常见的房屋建筑构件。 可以将重复性模式概念反复应用于我们周围的几乎每样东西上，包括软件。</p>
<p>汽车和住宅建筑示例有助于在软件设计和构造中体现某些一般性的抽象概念。 易于理解且明确定义的通用功能部件的概念是设计模式的源动力，它也是其他两篇设计模式文章探究工厂设计模式和探究观察者设计模式的重点。 这些模式几乎涵盖了面向对象的软件设计的各个方面，包括对象创建、对象交互和对象生存期。 在本文中，我们将讨论 Singleton 模式，它包含在创造性模式系列中。</p>
<p>创造性模式指示如何以及何时创建对象。 很多实例需要只能通过创造性方法解决的特殊行为，而不是在创建实例后强制实施所需的行为。 此类行为要求最好的例子之一包含在 Singleton 模式中。 Singleton 模式在 Design Patterns: Elements of Reusable Software 这一经典参考书目中有正式的定义，该书的作者包括 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides（也称为四人组或 GoF）。 在 Design Patterns 中，此模式是最简单也是使用最广泛的模式之一。 但是，正如我们将会看到的一样，在实现此模式时可能会出现一些问题。 本文试图通过 Singleton 模式的多个早期实现来从头开始分析 Singleton 模式，以及如何在 Microsoft_ .NET 应用程序开发中发挥其最佳用途。</p>
<h3 id="i2">Singleton 模式</h3>
<p>按照 Design Patterns 中的定义，Singleton 模式的用途是 "ensure a class has only one instance, and provide a global point of access to it"（确保每个类只有一个实例，并提供它的全局访问点）。</p>
<p>它可以解决什么问题，或者换句话说，我们使用它的动机是什么？ 几乎在每个应用程序中，都需要有一个从中进行全局访问和维护某种类型数据的区域。 在面向对象的 (OO) 系统中也有这种情况，在此类系统中，在任何给定时间只应运行一个类或某个类的一组预定义数量的实例。 例如，当使用某个类来维护增量计数器时，此简单的计数器类需要跟踪在多个应用程序领域中使用的整数值。 此类需要能够增加该计数器并返回当前的值。 对于这种情况，所需的类行为应该仅使用一个类实例来维护该整数，而不是使用其它类实例来维护该整数。</p>
<p>最初，人们可能会试图将计数器类实例只作为静态全局变量来创建。 这是一种通用的方法，但实际上只解决一部分问题；它解决了全局可访问性问题，但没有采取任何措施来确保在任何给定的时间只运行一个类实例。 应该由类本身来负责只使用一个类实例，而不是由类用户来负责。 应该始终不要让类用户来监视和控制运行的类实例的数量。</p>
<p>所需要的是使用某种方法来控制如何创建类实例，然后确保在任何给定的时间只创建一个类实例。 这会确切地给我们提供所需的行为，并使客户端不必了解任何类细节。</p>
<h4>逻辑模型</h4>
<p>Singleton 模型非常简单直观。 （通常）只有一个 Singleton 实例。 客户端通过一个已知的访问点来访问 Singleton 实例。 在这种情况下，客户端是一个需要访问唯一 Singleton 实例的对象。 图 1 以图形方式显示此关系。</p>
<p><img title="图 1. Singleton 模式逻辑模型" alt="图 1. Singleton 模式逻辑模型" src="http://sheneyan.com/image/article/patterns/singleton_1.gif" /><br />
<em>图 1. Singleton 模式逻辑模型</em></p>
<h4>物理模型</h4>
<p>Singleton 模式的物理模型也是非常简单的。 但是，随着时间的推移，实现 Singleton 的方式也略有不同。 让我们看一下原始的 GoF Singleton 实现。 图 2 显示按 Design Patterns 所定义的原始 Singleton 模式的 UML 模型。</p>
<p><img title="图 2. Design Patterns 中的 Singleton 模式物理模型" alt="图 2. Design Patterns 中的 Singleton 模式物理模型" src="http://sheneyan.com/image/article/patterns/singleton_2.gif" /><br />
<em>图 2. Design Patterns 中的 Singleton 模式物理模型</em></p>
<p>我们看到的是一个简单的类图表，显示有一个 Singleton 对象的私有静态属性以及返回此相同属性的公共方法 Instance()。 这实际上是 Singleton 的核心。 还有其他一些属性和方法，用于说明在该类上允许执行的其他操作。 为了便于此次讨论，让我们将重点放在实例属性和方法上。</p>
<p>客户端仅通过实例方法来访问任何 Singleton 实例。 此处没有定义创建实例的方式。 我们还希望能够控制如何以及何时创建实例。 在 OO 开发中，通常可以在类的构造函数中最好地处理特殊对象的创建行为。 这种情况也不例外。 我们可以做的是，定义我们何时以及如何构造类实例，然后禁止任何客户端直接调用该构造函数。 这是在 Singleton 构造中始终使用的方法。 让我们看一下 Design Patterns 中的原始示例。 通常，将下面所示的 C++ Singleton 示例实现代码示例视为 Singleton 的默认实现。 本示例已移植到很多其他编程语言中，通常它在任何地方的形式与此几乎相同。</p>
<h4>C++ Singleton 示例实现代码</h4>
<div class="cpp" style="font-family: monospace">
<div class="head">Language：cpp, parsed in: 0.005 seconds, using GeSHi 1.0.7.12</div>
<ol>
    <li class="li1">
    <div class="de1"><span class="co1">// Declaration</span></div>
    <li class="li1">
    <div class="de1"><span class="kw2">class</span> Singleton <span class="br0">{</span></div>
    <li class="li1">
    <div class="de1"><span class="kw2">public</span>: </div>
    <li class="li1">
    <div class="de1">&nbsp; &nbsp; <span class="kw4">static</span> Singleton* Instance<span class="br0">(</span><span class="br0">)</span>;</div>
    <li class="li2">
    <div class="de2"><span class="kw2">protected</span>: </div>
    <li class="li1">
    <div class="de1">&nbsp; &nbsp; Singleton<span class="br0">(</span><span class="br0">)</span>;</div>
    <li class="li1">
    <div class="de1"><span class="kw2">private</span>:</div>
    <li class="li1">
    <div class="de1">&nbsp; &nbsp; <span class="kw4">static</span> Singleton* _instance;</div>
    <li class="li1">
    <div class="de1"><span class="br0">}</span></div>
    <li class="li2">
    <div class="de2">&nbsp;</div>
    <li class="li1">
    <div class="de1"><span class="co1">// Implementation </span></div>
    <li class="li1">
    <div class="de1">Singleton* Singleton::_instance = <span class="nu0">0</span>;</div>
    <li class="li1">
    <div class="de1">&nbsp;</div>
    <li class="li1">
    <div class="de1">Singleton* Singleton::<span class="me2">Instance</span><span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></div>
    <li class="li2">
    <div class="de2">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">(</span>_instance == <span class="nu0">0</span><span class="br0">)</span> <span class="br0">{</span></div>
    <li class="li1">
    <div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; _instance = <span class="kw3">new</span> Singleton;</div>
    <li class="li1">
    <div class="de1">&nbsp; &nbsp; <span class="br0">}</span></div>
    <li class="li1">
    <div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> _instance;</div>
    <li class="li1">
    <div class="de1"><span class="br0">}</span></div>
    <li class="li2">
    <div class="de2">&nbsp;</div>
    </li>
</ol>
</div>
<p>让我们先花点时间分析一下此代码。 该简单类有一个成员变量，此变量是指向该类自身的指针。 注意，构造函数是受保护的，并且只有公共方法才是实例方法。 在实例方法实现中，有一个控制块 (if)，它检查成员变量是否已初始化，如果没有的话，则创建一个新实例。 控制块中这种惰性初始化意味着仅在第一次调用 Instance() 方法时初始化或创建 Singleton 实例。 对于很多应用程序，这种方法效果很好。 但对于多线程应用程序，这种方法证明具有潜在危险的副作用。 如果两个线程同时进入控制块，则可能会创建该成员变量的两个实例。 要解决这一问题，您可能想只将重要部分放在控制块周围以确保线程安全。 如果您这样做，则将对实例方法的所有调用进行序列化处理，并且可能会对性能产生不利影响（取决于应用程序）。 正是由于这个原因，创建了此模式的另一个版本，它使用某种称为双重检验机制的功能。 下一个代码示例显示使用 Java 语法的双重检验锁定。</p>
<h4>使用 Java 语法的双重检验锁定 Singleton 代码</h4>
<div class="java" style="font-family: monospace">
<div class="head">Language：java, parsed in: 0.011 seconds, using GeSHi 1.0.7.12</div>
<ol>
    <li class="li1">
    <div class="de1"><span class="co1">// C++ port to Java</span></div>
    <li class="li1">
    <div class="de1"><span class="kw2">class</span> Singleton </div>
    <li class="li1">
    <div class="de1"><span class="br0">{</span></div>
    <li class="li1">
    <div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">static</span> Singleton Instance<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></div>
    <li class="li2">
    <div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">(</span>_instance == <span class="kw2">null</span><span class="br0">)</span> <span class="br0">{</span></div>
    <li class="li1">
    <div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">synchronized</span> <span class="br0">(</span><span class="kw2">Class</span>.<span class="me1">forName</span><span class="br0">(</span><span class="st0">"Singleton"</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span></div>
    <li class="li1">
    <div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">(</span>_instance == <span class="kw2">null</span><span class="br0">)</span> <span class="br0">{</span></div>
    <li class="li1">
    <div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _instance = <span class="kw2">new</span> Singleton<span class="br0">(</span><span class="br0">)</span>;</div>
    <li class="li1">
    <div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">}</span></div>
    <li class="li2">
    <div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">}</span></div>
    <li class="li1">
    <div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">}</span></div>
    <li class="li1">
    <div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> _instance;&nbsp; &nbsp; &nbsp; </div>
    <li class="li1">
    <div class="de1">&nbsp; &nbsp; <span class="br0">}</span></div>
    <li class="li1">
    <div class="de1">&nbsp; &nbsp; <span class="kw2">protected</span> Singleton<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span><span class="br0">}</span></div>
    <li class="li2">
    <div class="de2">&nbsp; &nbsp; <span class="kw2">private</span> <span class="kw2">static</span> Singleton _instance = <span class="kw2">null</span>;</div>
    <li class="li1">
    <div class="de1"><span class="br0">}</span></div>
    <li class="li1">
    <div class="de1">&nbsp;</div>
    </li>
</ol>
</div>
<p>在使用 Java 语法的双重检验锁定 Singleton 代码示例中，我们直接将 C++ 代码移植到 Java 代码，以便利用 Java 关键部分块（已同步）。 主要差别是不再有单独的声明和实现部分，没有指针数据类型，并且采用了新的双重检验机制。 双重检验发生在第一个 IF 块上。 如果成员变量为空，则执行进入关键部分块，该块再次双重检验该成员变量。 仅在通过此最终测试后，才会实例化该成员变量。 一般来说，两个线程无法使用这种方法创建两个类实例。 另外，因为在第一次检查时没有出现线程阻塞，所以对此方法的大多数调用不会由于必须进入锁定而导致性能下降。 目前，在实现 Singleton 模式时，很多 Java 应用程序中都广泛使用这种方法。 这种方法很巧妙，但也有瑕疵。 某些优化编译器可以将惰性初始化代码优化掉或对其重新进行排序，并且会重新产生线程安全问题。 有关更深入的解释，请参阅 "The Double-Check Locking is Broken" Declaration。</p>
<p>另一种试图解决此问题的方法可能是，在成员变量声明中使用 volatile 关键字。 这应该告诉编译器不要对代码重新排序，并且放弃优化。 目前，这是唯一建议的 JVM 内存模型，并且不会立即解决该问题。</p>
<p>实现 Singleton 的最好方法是什么？ 最终（而不是碰巧），Microsoft .NET 框架解决了所有这些问题，从而更易于实现 Singleton，却不会产生我们目前讨论的不利副作用。 .NET 框架以及 C# 语言允许我们在必要时通过替换语言关键字，将上述的 Java 语法移植到 C# 语法。 因此，Singleton 代码变为以下内容：</p>
<h4>以 C# 编码的双重检验锁定</h4>
<div class="csharp" style="font-family: monospace">
<div class="head">Language：csharp, parsed in: 0.006 seconds, using GeSHi 1.0.7.12</div>
<ol>
    <li class="li1">
    <div class="de1"><span class="co1">// Port to C#</span></div>
    <li class="li1">
    <div class="de1"><span class="kw4">class</span> Singleton </div>
    <li class="li1">
    <div class="de1"><span class="br0">{</span></div>
    <li class="li1">
    <div class="de1">&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">static</span> Singleton Instance<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></div>
    <li class="li2">
    <div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">(</span>_instance == <span class="kw1">null</span><span class="br0">)</span> <span class="br0">{</span></div>
    <li class="li1">
    <div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">lock</span> <span class="br0">(</span><a href="http://www.google.com/search?q=typeof+msdn.microsoft.com"><span class="kw3">typeof</span></a><span class="br0">(</span>Singleton<span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span></div>
    <li class="li1">
    <div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">(</span>_instance == <span class="kw1">null</span><span class="br0">)</span> <span class="br0">{</span></div>
    <li class="li1">
    <div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _instance = <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> Singleton<span class="br0">(</span><span class="br0">)</span>;</div>
    <li class="li1">
    <div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">}</span></div>
    <li class="li2">
    <div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">}</span></div>
    <li class="li1">
    <div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">}</span></div>
    <li class="li1">
    <div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> _instance;&nbsp; &nbsp; &nbsp; </div>
    <li class="li1">
    <div class="de1">&nbsp; &nbsp; <span class="br0">}</span></div>
    <li class="li1">
    <div class="de1">&nbsp; &nbsp; <span class="kw1">protected</span> Singleton<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span><span class="br0">}</span></div>
    <li class="li2">
    <div class="de2">&nbsp; &nbsp; <span class="kw1">private</span> <span class="kw1">static</span> volatile Singleton _instance = <span class="kw1">null</span>;</div>
    <li class="li1">
    <div class="de1"><span class="br0">}</span></div>
    <li class="li1">
    <div class="de1">&nbsp;</div>
    </li>
</ol>
</div>
<p>此处，我们替换了锁定关键字来执行关键部分块，使用 typeof 操作并添加 volatile 关键字，以确保没有对代码进行优化程序重新排序。 虽然此代码或多或少是 GoF Singleton 模式的直接移植，但它可达到我们的目的，并且我们可获得所需的行为。 此代码还说明了将 C++ 移植到 Java 和将 Java 移植到 C# 代码的一些相似之处和主要差别。 但是，正如任何代码移植一样，通常目标语言或平台的一些优点可能在移植过程中失去。 需要做的就是对代码重构，以便利用新目标语言或平台的功能。</p>
<p>在前面的每个代码示例中，Singleton 的原始实现随时间的推移而发生变化，以解决在每个新模式实现中发现的问题。 一些问题（例如，线程安全）要求对大多数实现进行更改，以满足在目前应用程序中日益增长的需要并解决演变发展问题。 .NET 在应用程序开发中提供了一个演变步骤。 可以在&#8220;框架&#8221;级别解决前面示例中出现的很多亟待解决的问题，而不是在实现级别解决。 虽然上一个示例显示了一个使用 .NET 框架和 C# 的有效 Singleton 类，但只需更好地利用 .NET 框架本身就可以大大简化此代码。 以下示例使用 .NET，它是一个松散地基于原始 GoF 模式的最小限度的 Singleton 类，并且仍然可获得类似的行为。</p>
<h4>.NET Singleton 示例</h4>
<div class="csharp" style="font-family: monospace">
<div class="head">Language：csharp, parsed in: 0.002 seconds, using GeSHi 1.0.7.12</div>
<ol>
    <li class="li1">
    <div class="de1"><span class="co1">// .NET Singleton</span></div>
    <li class="li1">
    <div class="de1"><span class="kw1">sealed</span> <span class="kw4">class</span> Singleton </div>
    <li class="li1">
    <div class="de1"><span class="br0">{</span></div>
    <li class="li1">
    <div class="de1">&nbsp; &nbsp; <span class="kw1">private</span> Singleton<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span><span class="br0">}</span></div>
    <li class="li2">
    <div class="de2">&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">static</span> <span class="kw1">readonly</span> Singleton Instance = <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> Singleton<span class="br0">(</span><span class="br0">)</span>;</div>
    <li class="li1">
    <div class="de1"><span class="br0">}</span></div>
    <li class="li1">
    <div class="de1">&nbsp;</div>
    </li>
</ol>
</div>
<p>此版本已大大简化并且更加直观。 它仍然是 Singleton 吗？ 让我们看一下更改了哪些内容，然后再做决定。 我们修改了要密封的类本身（该类密封后是不可继承的），删除了惰性初始化代码，删除了 Instance() 方法，并且对 _instance 变量做了大量的修改。 对 _instance 变量所做的更改包括修改对公共方法的访问级别，将变量标记为只读，以及在声明时初始化该变量。 此处，我们可以直接定义所需的行为，而不关心实现的潜在有害的副作用。 那么，使用惰性初始化有什么优点以及使用多个线程有什么危险呢？ 在 .NET 框架中内置了所有正确的行为。 让我们先看第一种情况：惰性初始化。</p>
<p>最初使用惰性初始化的主要原因是要获取仅在第一次调用 Instance() 方法中创建实例的行为，还因为 C++ 规范中具有某种开放性，并不定义静态变量的确切初始化顺序。 要在 C++ 中获得所需的 Singleton 行为，必须采用涉及使用惰性初始化的运算方法。 我们真正关心的是在第一次（在该情况下）调用实例属性中创建该实例，还是在此调用之前创建该实例的，并且类中的静态变量是否有已定义的初始化顺序。 对于 .NET 框架，这就是我们获取的行为。 在 JIT 过程中，当（且仅当）任何方法使用静态属性时，&#8220;框架&#8221;将初始化此静态属性。 如果没有使用该属性，则不会创建实例。 更准确地说，在 JIT 过程中发生的事情就是，在任何调用方使用该类的任何静态成员时构造和加载该类。 在这种情况下，结果是相同的。</p>
<p>那么，线程安全初始化呢？ &#8220;框架&#8221;也解决了这一问题。 &#8220;框架&#8221;内部保证静态类型初始化的线程安全。 换句话说，在上面的示例中，只创建一个 Singleton 类实例。 还要注意，用于保存类实例的属性字段称为实例。 此选项更好地说明了，在本文中的讨论过程中，此值是类的实例。 在&#8220;框架&#8221;本身中，虽然使用的属性名称称为值，但有多个类使用此类型的 Singleton。 概念完全相同。</p>
<p>对类所做的其他更改意味着禁止划分子类。 添加密封类修饰符可确保不会将该类划分为子类。 GoF Singleton 模式详细介绍了试图对 Singleton 划分子类所产生的问题，该划分通常并不是小事。 在大多数情况下，可以很容易地开发没有父类的 Singleton，并且添加划分子类功能会增加通常根本不需要的新的复杂性级别。 随着复杂性的提高，测试、培训和文档编制等所需的时间也会增加。 通常，除非绝对必要，否则您不希望提高任何代码的复杂性。</p>
<p>让我们看一下如何使用 Singleton。 使用我们最初的计数器的有关动机的概念，我们可以创建一个简单的 Singleton 计数器类并说明我们将如何使用它。 图 3 显示了 UML 类说明将包含什么内容。</p>
<p><img title="图 3. UML 类图表" alt="图 3. UML 类图表" src="http://sheneyan.com/image/article/patterns/singleton_3.gif" /><br />
图 3. UML 类图表</p>
<p>相应的类实现代码以及示例客户端使用如下所示。</p>
<h4>示例 Singleton 使用</h4>
<div class="csharp" style="font-family: monospace">
<div class="head">Language：csharp, parsed in: 0.007 seconds, using GeSHi 1.0.7.12</div>
<ol>
    <li class="li1">
    <div class="de1"><span class="kw1">sealed</span> <span class="kw4">class</span> SingletonCounter <span class="br0">{</span></div>
    <li class="li1">
    <div class="de1">&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">static</span> <span class="kw1">readonly</span> SingletonCounter Instance = </div>
    <li class="li1">
    <div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span class="kw3">new</span></a> SingletonCounter<span class="br0">(</span><span class="br0">)</span>;</div>
    <li class="li1">
    <div class="de1">&nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">long</span> Count = <span class="nu0">0</span>;</div>
    <li class="li2">
    <div class="de2">&nbsp; &nbsp; <span class="kw1">private</span> SingletonCounter<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span><span class="br0">}</span></div>
    <li class="li1">
    <div class="de1">&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">long</span> NextValue<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></div>
    <li class="li1">
    <div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> ++Count;</div>
    <li class="li1">
    <div class="de1">&nbsp; &nbsp; <span class="br0">}</span></div>
    <li class="li1">
    <div class="de1"><span class="br0">}</span></div>
    <li class="li2">
    <div class="de2">&nbsp;</div>
    <li class="li1">
    <div class="de1"><span class="kw4">class</span> SingletonClient <span class="br0">{</span></div>
    <li class="li1">
    <div class="de1">&nbsp; &nbsp; <span class="br0">[</span>STAThread<span class="br0">]</span></div>
    <li class="li1">
    <div class="de1">&nbsp; &nbsp; <span class="kw1">static</span> <span class="kw1">void</span> Main<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></div>
    <li class="li1">
    <div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">(</span><span class="kw4">int</span> i=<span class="nu0">0</span>; i&amp;lt;<span class="nu0">20</span>; i++<span class="br0">)</span> <span class="br0">{</span></div>
    <li class="li2">
    <div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.<span class="me1">WriteLine</span><span class="br0">(</span><span class="st0">"Next singleton value: {0}"</span>, </div>
    <li class="li1">
    <div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SingletonCounter.<span class="me1">Instance</span>.<span class="me1">NextValue</span><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span>;</div>
    <li class="li1">
    <div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">}</span></div>
    <li class="li1">
    <div class="de1">&nbsp; &nbsp; <span class="br0">}</span></div>
    <li class="li1">
    <div class="de1"><span class="br0">}</span></div>
    <li class="li2">
    <div class="de2">&nbsp;</div>
    </li>
</ol>
</div>
<p>此处，我们还创建了一个 Singleton 类来维护具有 long 类型的增量计数。 客户端是一个简单的控制台应用程序，它显示计数器类的 20 个值。 虽然此示例极其简单，但它却说明了如何使用 .NET 来实现 Singleton，然后将其用在应用程序中。</p>
<h3>小结</h3>
<p>Singleton 设计模式是一个非常有用的机制，可用于在面向对象的应用程序中提供单个对象访问点。 无论使用的是什么实现，该模式提供一个大家所熟知的概念，以便其在设计和开发小组之间方便地进行共享。 但是，正如我们所发现的一样，注意到这些实现有多大差异及其潜在的副作用也是非常重要的。 .NET 框架为模式实现者在设计所需的功能类型方面提供了很大的帮助，实现者无需处理本文中所讨论的很多副作用。 在正确实现后，可以证实模式的最初目的的有效性。</p>
<p>设计模式是非常有用的软件设计概念，可使小组将重点放在提供最佳类型的应用程序上，而不考虑它们是什么应用程序。 关键在于正确而有效地使用设计模式，目前有很多关于将设计模式用于 Microsoft .NET 方面的 MSDN 系列文档，其中介绍了如何正确而有效地使用设计模式。</p>
<img src ="http://www.cnblogs.com/solucky/aggbug/890455.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41789/" target="_blank">[新闻]亚洲社交网站Friendster将兼容竞争对手窗件</a>]]></description></item><item><title>.Net平台下开发中文语音应用程序[转]</title><link>http://www.cnblogs.com/solucky/archive/2007/08/31/877440.html</link><dc:creator>只吃豆芽猪</dc:creator><author>只吃豆芽猪</author><pubDate>Fri, 31 Aug 2007 09:18:00 GMT</pubDate><guid>http://www.cnblogs.com/solucky/archive/2007/08/31/877440.html</guid><wfw:comment>http://www.cnblogs.com/solucky/comments/877440.html</wfw:comment><comments>http://www.cnblogs.com/solucky/archive/2007/08/31/877440.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/solucky/comments/commentRss/877440.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/solucky/services/trackbacks/877440.html</trackback:ping><description><![CDATA[http://www.lionsky.net/MyWebSite/Article/list.aspx?id=437<br />
<span id="content" twffan="done"><span twffan="done">程序下载：<a style="color: #8cacfc" href="http://www.lionsky.net/MyWebSite/DownSoft/list.aspx?id=200" target="_blank">点击下载</a><br />
源文件：<a style="color: #8cacfc" href="http://www.lionsky.net/MyWebSite/downsoft/List.Aspx?id=202" target="_blank">点击下载</a><br />
</span></span><br />
语音是人类最自然的交互方式，也是现阶段软件用户界面发展的最高目标。微软公司一直积极推动语音技术的发展，并且公布了语音开发平台Speech SDK帮助开发人员实现语音应用。<br />
随着.net技术深入人心，越来越多的程序员开始转到.net平台上进行开发。然而，在新发布的.net speech SDK里面并没有对中文语音进行支持，目前支持中文的Speech SDK最高版本为Windows平台下的SAPI 5.1()，本文介绍如何在.net平台下利用SAPI5.1开发中文语音应用程序。
<p><br />
<strong>1． SAPI.51 SDK浅析以及安装<br />
</strong>SAPI SDK是微软公司免费提供的语音应用开发工具包，这个SDK中包含了语音应用设计接口（SAPI）、微软的连续语音识别引擎（MCSR）以及微软的语音合成（TTS）引擎等等。目前的5.1版本一共可以支持3种语言的识别 (英语，汉语和日语)以及2种语言的合成（英语和汉语）。SAPI中还包括对于低层控制和高度适应性的直接语音管理、训练向导、事件、语法编译、资源、语音识别(SR)管理以及TTS管理等强大的设计接口。其结构如图(1)：<br />
<br />
<img height="124" src="http://www.lionsky.net/MyWebsite/article/Images/200401081730.jpg" width="309" border="0" twffan="done"  alt="" /><br />
图(1)<br />
语音引擎则通过DDI层（设备驱动接口）和SAPI(SpeechAPI)进行交互，应用程序通过API层和SAPI通信。通过使用这些API，用户可以快速开发在语音识别或语音合成方面应用程序。<br />
SAPI5.1 SDK可以从微软网站下载：<a style="color: #8cacfc" href="http://www.microsoft.com/speech/download/sdk51/">http://www.microsoft.com/speech/download/sdk51/</a> 需要安装程序的有Speech SDK 5.1（68M）和5.1 Language Pack （81.5M）。</p>
<p><br />
<strong>2． 导入COM对象到.Net</strong><br />
SAPI5.1的基于Windows平台的，通过COM接口进行调用。在.Net平台下要应用SAPI5.1，我们可以利用.Net Framework自带的强大工具TlbImp.exe来把SAPI SDK的COM对象导入到.Net中。TlbImp.exe产生一个管制的包装类，管理客户端可以使用它。包装类管理实际的COM对象的参考数。当包装类当作收集的垃圾时，包装类释放掉它包装的COM对象。当然，你也可以在VS.NET环境中通过从项目参考对话框选择COM对象，实现COM对象的导入，这个过程也是通过TlbImp.exe来完成的。<br />
下面演示如何导入SAPI的COM对象：<br />
D:\Program Files\Common Files\Microsoft Shared\Speech&gt;Tlbimp sapi.dll /out: DotNetSpeech.dll</p>
<p>在安转SDK以后，可以在D:\Program Files\Common Files\Microsoft Shared\Speech\目录下面找到SAPI.dll，这里面定义了SAPI的COM对象，用Tlbimp.exe工具将该dll转换成.net平台下的Assembly---DotNetSpeech.dll，转换的过程会提示不少的警告(warning)，但这部影响我们的开发，可以忽略。最后，我们可以用ildasm查看DotnetSpeech.dll里面的对象。</p>
<p><strong>3． 用C#开发中文TTS应用程序示例</strong><br />
下面通过一个实例来介绍如何利用C# 进行开发语音应用程序，开发环境为：<br />
操作系统： Windows 2000 中文版+ SP3<br />
.Net Framework: 1.0.3705（英文版）<br />
Visual Studio.Net 7.0.9466（英文版）<br />
首先，新建一个C#的Windows Application工程SpeechApp，在开发环境的右边的解决方案管理器(Solution Explorer)中，添加DotNetSpeech对象库。右键点击"Reference"(参考)，选择"Add Reference"（添加参考），在弹出的文件选择对话框中找到刚才生成的DotNetSpeech.dll。<br />
<img height="252" src="http://www.lionsky.net/MyWebsite/article/Images/200401081731.jpg" width="255" border="0" twffan="done"  alt="" /><br />
打开Form1.cs代码文件,在代码开头添加名字空间（注意大小写）。<br />
using DotNetSpeech;<br />
这样就实现了SAPI SDK的导入，下面我们就可以开始编写应用代码了。本示例演示如何把文本通过喇叭朗读出来以及把文本转化成语音信号（Wave声音文件），程序界面如图(3)：<br />
<img height="217" src="http://www.lionsky.net/MyWebsite/article/Images/200401081732.jpg" width="299" border="0" twffan="done"  alt="" /><br />
</p>
<pre>//朗读<br />
private void buttonSynthesis_Click(object sender, System.EventArgs e)<br />
{<br />
&nbsp;try<br />
{<br />
&nbsp;&nbsp;SpeechVoiceSpeakFlags SpFlags = SpeechVoiceSpeakFlags.SVSFlagsAsync;<br />
&nbsp;&nbsp;SpVoice Voice = new SpVoice();&nbsp;<br />
&nbsp;&nbsp;Voice.Speak(this.textBoxText.Text, SpFlags);<br />
&nbsp;}<br />
&nbsp;catch(Exception er)<br />
&nbsp;{<br />
MessageBox.Show("An Error Occured!","SpeechApp", MessageBoxButtons.OK, MessageBoxIcon.Error);<br />
&nbsp;}<br />
}<br />
//生成声音文件(Wav)<br />
private void buttonTTStoWave_Click(object sender, System.EventArgs e)<br />
{<br />
&nbsp;try<br />
{<br />
&nbsp;&nbsp;SpeechVoiceSpeakFlags SpFlags = SpeechVoiceSpeakFlags.SVSFlagsAsync;<br />
&nbsp;&nbsp;SpVoice Voice = new SpVoice();&nbsp;<br />
&nbsp;&nbsp;SaveFileDialog sfd = new SaveFileDialog();<br />
&nbsp;&nbsp;sfd.Filter = "All files (*.*)|*.*|wav files (*.wav)|*.wav";<br />
&nbsp;&nbsp;sfd.Title = "Save to a wave file";<br />
&nbsp;&nbsp;sfd.FilterIndex = 2;<br />
&nbsp;&nbsp;sfd.RestoreDirectory = true;<br />
&nbsp;&nbsp;if (sfd.ShowDialog()== DialogResult.OK) <br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;SpeechStreamFileMode SpFileMode = SpeechStreamFileMode.SSFMCreateForWrite;<br />
&nbsp;&nbsp;&nbsp;SpFileStream SpFileStream = new SpFileStream();<br />
&nbsp;&nbsp;&nbsp;SpFileStream.Open(sfd.FileName, SpFileMode, false);<br />
&nbsp;&nbsp;&nbsp;Voice.AudioOutputStream = SpFileStream;<br />
&nbsp;&nbsp;&nbsp;Voice.Speak(txtSpeakText.Text, SpFlags);<br />
&nbsp;&nbsp;&nbsp;Voice.WaitUntilDone(Timeout.Infinite);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SpFileStream.Close();<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
&nbsp;catch(Exception er)<br />
&nbsp;{<br />
MessageBox.Show("An Error Occured!","SpeechApp", MessageBoxButtons.OK, MessageBoxIcon.Error);<br />
&nbsp;}<br />
}</pre>
<p>接下来,还要去控制面板配置Speech SDK引擎当前所处理语言。打开"控制面板"，打开"语音"配置项目，可以看到在这里我们可以指定当前可以对何种语言进行识别或者合成，还可以配置相关的硬件设备以及控制语速。（如图4）<br />
<img height="420" src="http://www.lionsky.net/MyWebsite/article/Images/200401081733.jpg" width="399" border="0" twffan="done"  alt="" /><br />
在"文字-语音转换"的"语音选择"组合框中选择简体中文(Microsoft Simplified Chinese)。这样就可以合成汉语文字了。<br />
回到VS.Net，F5编译运行刚才的应用程序，在文本框里输入汉字，戴上耳机，点击"朗读"按钮，开始体验新一代的智能人机界面吧，呵呵：）</p>
<p>&nbsp;</p>
<p><strong>4． 结论</strong><br />
微软为语音人机界面提供了强大的平台，.net环境更使这种开发方便快捷。赶快去下载SAPI5.1 SDK，让你的应用程序"绘声绘色"，体现Nature UI，Let&#8217;s GO!!!<br />
<br />
<strong>5． 参考文献</strong><br />
[1] Speech SDK自带的说明文档(SAPI.chm)<br />
[2] MSDN (msdn.microsoft.com)<br />
</p>
<img src ="http://www.cnblogs.com/solucky/aggbug/877440.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41788/" target="_blank">[新闻]百度宣布服务器全面换装闪存 替代硬盘</a>]]></description></item></channel></rss>