﻿<?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>博客园-ipointer</title><link>http://www.cnblogs.com/ipointer/</link><description>给我最爱的宝宝</description><language>zh-cn</language><lastBuildDate>Tue, 09 Feb 2010 20:37:12 GMT</lastBuildDate><pubDate>Tue, 09 Feb 2010 20:37:12 GMT</pubDate><ttl>60</ttl><item><title>关于Join</title><link>http://www.cnblogs.com/ipointer/archive/2009/08/19/1549735.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Wed, 19 Aug 2009 04:24:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2009/08/19/1549735.html</guid><description><![CDATA[<p>阅读: 48 评论: 0 作者: <a href="http://www.cnblogs.com/ipointer/" target="_blank">栖息的熊</a> 发表于 2009-08-19 12:24 <a href="http://www.cnblogs.com/ipointer/archive/2009/08/19/1549735.html" target="_blank">原文链接</a></p><span style="font-family: Arial; font-size: 14px; color: #333333; line-height: 20px; "><strong style="line-height: normal; ">cross join</strong>&nbsp;<span style="line-height: normal; font-size: 10pt; color: black; ">是笛卡儿乘积</span>&nbsp;<span style="line-height: normal; font-size: 10pt; color: black; ">就是一张表的行数乘以另一张表的行数</span><span style="line-height: normal; font-size: 10pt; "><br style="line-height: normal; " />
<strong style="line-height: normal; ">left join</strong>&nbsp;</span><span style="line-height: normal; font-size: 10pt; color: black; ">第一张表的连接列在第二张表中没有匹配是</span><span style="line-height: normal; font-size: 10pt; ">,</span><span style="line-height: normal; font-size: 10pt; color: black; ">第二张表中的值返回</span><span style="line-height: normal; font-size: 10pt; ">null<br style="line-height: normal; " />
<strong style="line-height: normal; ">right join</strong>&nbsp;</span><span style="line-height: normal; font-size: 10pt; color: black; ">第二张表的连接列在第一张表中没有匹配是</span><span style="line-height: normal; font-size: 10pt; ">,</span><span style="line-height: normal; font-size: 10pt; color: black; ">第一张表中的值返回</span><span style="line-height: normal; font-size: 10pt; ">null&nbsp;<br style="line-height: normal; " />
<strong style="line-height: normal; ">full join</strong>&nbsp;</span><span style="line-height: normal; font-size: 10pt; color: black; ">返回两张表中的行</span><span style="line-height: normal; font-size: 10pt; ">&nbsp;left join+right join<br style="line-height: normal; " />
<strong style="line-height: normal; ">inner join</strong>&nbsp;</span><span style="line-height: normal; font-size: 10pt; color: black; ">只返回两张表连接列的匹配项</span></span><img src="http://www.cnblogs.com/ipointer/aggbug/1549735.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/ipointer/archive/2009/08/19/1549735.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/ipointer/archive/2009/08/19/1549735.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</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://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>异常诡异的mysql连接异常：Fatal error encountered during command execution.</title><link>http://www.cnblogs.com/ipointer/archive/2009/07/19/1526754.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Sun, 19 Jul 2009 15:49:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2009/07/19/1526754.html</guid><description><![CDATA[<p>阅读: 289 评论: 0 作者: <a href="http://www.cnblogs.com/ipointer/" target="_blank">栖息的熊</a> 发表于 2009-07-19 23:49 <a href="http://www.cnblogs.com/ipointer/archive/2009/07/19/1526754.html" target="_blank">原文链接</a></p>两个完全一致的存储过程，只是名字不一样，居然一个执行成功，一个执行失败。错误的一个改了个名字居然好使，但是又造成了其他原来很正常的存储过程莫名其妙的出现异常。
<div>都是一个问题：<span  style="font-family: 宋体, 'courier new'; font-size: 13px; line-height: normal; border-collapse: collapse; white-space: pre; ">Fatal error encountered during command execution.</span></div>
<div>堆栈往里看也看不出什么特别的问题。</div>
<div><br />
</div>
<div>最后把编译模式改成release居然都可以了，但心里非常不踏实，那位高人可以指点一下迷津。</div><img src="http://www.cnblogs.com/ipointer/aggbug/1526754.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/ipointer/archive/2009/07/19/1526754.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/ipointer/archive/2009/07/19/1526754.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</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://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>误人子弟的面试题答案</title><link>http://www.cnblogs.com/ipointer/archive/2008/11/18/1336268.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Tue, 18 Nov 2008 14:32:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2008/11/18/1336268.html</guid><description><![CDATA[<p>阅读: 249 评论: 0 作者: <a href="http://www.cnblogs.com/ipointer/" target="_blank">栖息的熊</a> 发表于 2008-11-18 22:32 <a href="http://www.cnblogs.com/ipointer/archive/2008/11/18/1336268.html" target="_blank">原文链接</a></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;看到一道.net的面试题，下面附上题目和网上的答案（注意答案是错误的）</p>
<p><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;根据线程安全的相关知识，分析以下代码，当调用<span lang="EN-US">test</span>方法时<span lang="EN-US">i&gt;10</span>时是否会引起死锁<span lang="EN-US">?</span>并简要说明理由。</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void test(int i)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lock (this)<br />
&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; if (i &gt; 10)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i--;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test(i);<br />
&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; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;网上的答案：<span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">不会发生死锁，（但有一点<span lang="EN-US">int</span>是按值传递的，所以每次改变的都只是一个副本，因此不会出现死锁。但如果把<span lang="EN-US">int</span>换做一个<span lang="EN-US">object</span>，那么死锁会发生）</span>。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;答案确实是不会发生死锁，但理由是错的，看看MSDN上的解释：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lock确保当一个线程位于代码的临界区时，另一个线程不进入临界区。如果其他线程试图进入锁定的代码，则它将一直等待（即被阻止），直到该对象被释放。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 原来的递归明明在一个线程中，哪来的阻塞呢。</p>
<img src="http://www.cnblogs.com/ipointer/aggbug/1336268.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/ipointer/archive/2008/11/18/1336268.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/ipointer/archive/2008/11/18/1336268.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</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://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>.Net中的安全机制</title><link>http://www.cnblogs.com/ipointer/archive/2008/10/15/1311979.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Wed, 15 Oct 2008 09:12:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2008/10/15/1311979.html</guid><description><![CDATA[<p>阅读: 242 评论: 1 作者: <a href="http://www.cnblogs.com/ipointer/" target="_blank">栖息的熊</a> 发表于 2008-10-15 17:12 <a href="http://www.cnblogs.com/ipointer/archive/2008/10/15/1311979.html" target="_blank">原文链接</a></p>这部分内容由于工作中接触的不多，所以理解起来用了不少时间，下面只是作简单的说明：
<p>&nbsp;&nbsp;&nbsp;&nbsp; Windows中的安全机制主要是这几个概念：我是谁（身份）、我要做什么（操作）、我要访问什么（资源）。而.Net中将其修改为我从哪里来（位置）、我要做什么（操作）、我要访问什么（资源）。由此.Net的安全机制中有这几个概念：代码组、程序集、权限、权限集。
<p>&nbsp;&nbsp;&nbsp;&nbsp; 代码组是对程序集在安全方面的一个分类，它是一个树状结构，程序集可以属于代码组中的某个节点。这个隶属关系不需要用户去指定，每个代码有且仅有一个代表自身的条件，如zone、site、strong name、url等，程序集自动的会属于代码树状结构中的一条分支。下面是典型的本机代码组的设置：
<p>&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://c8zgfw.blu.livefilestore.com/y1p9Sq3XXQU7VMIWjpDuDcykO2WgDyJYnojCY_jialKPTx-V02HdWzc9-gQC7-OOlgDIQgZ5UsRucQGzUjHyjb_SA?PARTNER=WRITER"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="341" alt="image" src="http://c8zgfw.blu.livefilestore.com/y1pAPoNhsTDKn-3p3kToAZdtWBLce5ChoXhIChv-pK40WspmG68yuTRg88XNj7v9o0jn5Fvt1IgGctiOw6e8KFJmg?PARTNER=WRITER" width="644" border="0" /></a>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 我们就可以看几个例子，如：本机上的一个程序集，自然会属于代码组1.1. Zone - MyComputer（这个代码组的条件就是zone为本机）；而我们从某台服务器的共享目录中访问的程序集就会属于1.3. Zone - Internet。当然如果有其他更细条件的代码组，而程序集也符合这样的条件，他就会隶属于更明细的代码组。
<p>&nbsp;&nbsp;&nbsp;&nbsp; 权限在.Net Framework中的体现就是自带的权限类，.Net Framework中实现了很多权限实例类，如FileIOPermission、UIPermission、FileDialogPermission（都继承自CodeAccessPermission），每个权限实体类还定义了对此权限的操作，如FileIOPermission中有Read、Write等。
<p>&nbsp;&nbsp;&nbsp;&nbsp; 权限集，顾名思义就是权限的集合，定义这个集合是为了方便给代码组分配权限，一个代码组对应着一个权限集。这个权限集使用xml来表示，明确表达了这个集合所拥有的权限。下面是名为Internet的权限集的详细描述：
<p>&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://blufiles.storage.msn.com/y1pu30qejcecZtB8wWAFuOdQYkRO4uN5GRdaS7GM_rdsJejnz7pqDt2qcSQKB81RZJ7Hpp3DnMilP0?PARTNER=WRITER"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="484" alt="image" src="http://blufiles.storage.msn.com/y1p84PdD-JUMZbaA6geV8-3PzIFN6CbJbJJ684mKEfuh44Qgcbw315n5wfSDGZ5QIAXgyB7Ua4X03c?PARTNER=WRITER" width="593" border="0" /></a>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 可以看到每一条都代表着一个权限，也明确对应着一个权限实体类，在运行时这个xml会被反射成权限对象以供使用。
<p>&nbsp;&nbsp;&nbsp;&nbsp; 下图就是安全机制中元素的关系图：
<p>&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://blufiles.storage.msn.com/y1p8dWjba7a10W9IViIiCGNXUA0xjB9xWu8Go0yNtqjw3aa0M7AGTu4OHTXlD7jTvW12ReRX9idxQQ?PARTNER=WRITER"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="199" alt="image" src="http://blufiles.storage.msn.com/y1p2jipv1tBXkmg01uhG48_Kg7_s2dmmyq_oi_Wn2UiSwQRJxuvJHQG2AQyaolfC86XA9ApeLLxfXw?PARTNER=WRITER" width="325" border="0" /></a>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 一个程序集隶属于某个代码组，而代码组被分配了一个权限集，这样一个程序集就知道了自己在运行时所拥有的权限的集合。当程序集中的代码在运行时进行某个操作时，.Net Framework就会去检查这个程序集所拥有的权限，如果没有权限则抛出SecurityException，下面就是创建StreamReader实例时的调用堆栈，从中可以看到.Net Framework进行了权限检查。
<p>at System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark&amp; stackMark, Boolean isPermSet)<br />
at System.Security.CodeAccessPermission.Demand()<br />
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy)<br />
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)<br />
at System.IO.StreamReader..ctor(String path, Encoding encoding, Boolean detectEncodingFromByteOrderMarks, Int32 bufferSize)<br />
at System.IO.StreamReader..ctor(String path)
<p>&nbsp;&nbsp;&nbsp;&nbsp; 而对于自己编写的权限，就可以在自己的代码中做类似的检查。
<p>&nbsp;&nbsp;&nbsp;&nbsp; 还可以更细的定义程序集的权限，现在的程序集的权限主要是根据其所属的代码组，程序集本身也可以拥有自身的权限定义。如：要求一个必须的权限，如果代码组中没有此权限，则程序不能启动；如可以否定某个权限，则即使在代码组中有此权限，程序集以及其调用的其他程序集也没有这个权限。程序集权限可以在Security选项卡中指定，也可以在代码中通过代码或者是特性来指定。
<p>&nbsp;&nbsp;&nbsp;&nbsp; 还有值得注意的，对权限的检查不光是对本程序集的权限检查，还包括对调用堆栈上的较高的位置的程序集权限的检查。像这样的场景：有一个服务器端的组件可以操作本机的某个Windows Service，这个组件在服务器本机上有Full Trust的权限集合，因此从服务器端启动它来访问某个Windows Service是没有问题的。但如果想从客户端通过WebService来调用此组件，则是不行的，因为权限检查在调用堆栈中从这个组件开始一直检查到这个调用的起始处，发现这个程序集来自Internet，因此就使用Internet权限组，而这个权限组没有操作Windows Service的权限。要使这个调用成功，就需要改服务器上的代码组权限，最好的是新增一个条件比较明确的代码组，否则就将带来安全问题。 </p>
<img src="http://www.cnblogs.com/ipointer/aggbug/1311979.html?type=1" width="1" height="1" alt=""/><p>评论: 1　<a href="http://www.cnblogs.com/ipointer/archive/2008/10/15/1311979.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/ipointer/archive/2008/10/15/1311979.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</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://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>用定制特性规范构件调用</title><link>http://www.cnblogs.com/ipointer/archive/2008/10/10/1308239.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Fri, 10 Oct 2008 08:21:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2008/10/10/1308239.html</guid><description><![CDATA[<p>阅读: 76 评论: 0 作者: <a href="http://www.cnblogs.com/ipointer/" target="_blank">栖息的熊</a> 发表于 2008-10-10 16:21 <a href="http://www.cnblogs.com/ipointer/archive/2008/10/10/1308239.html" target="_blank">原文链接</a></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在GSP平台中，构件扮演着让平台更灵活，让用户需求更容易变化的重要角色，.net方法的调用，用户自定义窗体的展现等等都是最常见的应用场景。但由于我们的构件平台能力较弱，长久以来构件平台只是起着通用反射调用器的作用。让构件标准化，是我们发展构件平台的必经之路。这篇文章只是从使用定制特性这个角度来增强构件的标准化程度。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;定制特性从我的角度理解，就是给程序集、类型、方法、属性等等元素加上的辅助信息，我们可以告诉调用者调用前要做什么，调用后再做什么，或者是要让编译器做什么等等。我们经常使用的是.net framework中已经存在的特性，而自己定制特性的场景还很少。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 下面我描述一下我们在构件使用过程中的两个问题，并说明如何使用特性来解决：</p>
<blockquote>
<p>1、在工作流的人工活动节点上，我们需要用户定义一个单据，作为人工执行工作的一个数据参考。这里需要传入一些参数（权限、取数条件、单据分类等等），我们的构件平台将窗体描述为构件，描述信息中包含了如何调用这个窗体的信息。但在实现时却有小小的限制，对于web窗体使用URL后跟参数的方式就可以很好的实现，而对于winform窗体，就必须要求与参数匹配的构造函数。但是很多单据的作者却更喜欢将这些参数实现为属性，而非构造函数中的参数。这样的情况我们除了强识别形参名称，并与窗体属性一致，就没有太好的办法。</p>
<p>2、与1中类似的情况，我们给这些构件的形参定义实参是，一般情况下是使用单据数据Schema中的字段，但这个过程也是把我们最终用户晕头转向，除非我们约定形参名称必须与Schema中的字段匹配，不然我们也不好解决这个问题。</p>
</blockquote>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以上两个问题都可以用定制特性的方式，稍微优雅一些的解决。我们设计下面的特性：</p>
<blockquote>
<p>[AttributeUsage(AttributeTargets.Property,AllowMultiple=false,Inherited=false)]<br />
class GspParamsAttribute:Attribute<br />
{<br />
&nbsp;&nbsp;&nbsp; private string paramName;
<p>&nbsp;&nbsp;&nbsp; public string ParamName<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get { return paramName; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set { paramName = value; }<br />
&nbsp;&nbsp;&nbsp; }
<p>&nbsp;&nbsp;&nbsp; private string actualParamName;
<p>&nbsp;&nbsp;&nbsp; public string ActualParamName<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get { return actualParamName; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set { actualParamName = value; }<br />
&nbsp;&nbsp;&nbsp; }
<p>&nbsp;&nbsp;&nbsp; private string actualParamPath;
<p>&nbsp;&nbsp;&nbsp; public string ActualParamPath<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get { return actualParamPath; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set { actualParamPath = value; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}
<p>[AttributeUsage(AttributeTargets.Class)]<br />
class GspSupportParamSpecifyAttribute : Attribute<br />
{ <br />
}</p>
</blockquote>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 对于单据的作者，就可以这样标记他的单据：
<blockquote>
<p>[GspSupportParamSpecify()]<br />
class MyForm:Form<br />
{<br />
&nbsp;&nbsp;&nbsp; private string someProperty;
<p>&nbsp;&nbsp;&nbsp; [GspParams(ParamName="SomeProperty",ActualParamName="OtherProPerty")]<br />
&nbsp;&nbsp;&nbsp; public string SomProperty<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get { return someProperty; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set { someProperty = value; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
</blockquote>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 对于我们的构件设计器，就发现了一个需要在GSP平台中作为参数的属性SomProperty；对于流程设计在引用这个构件配参数时，就发现需要在Schema中找OtherProPerty字段作为实参来配置这个形参；对于构件调用的运行时，在发现GspSupportParamSpecify特性时，就知道这个类型中的某些属性需要被赋值，进而又从SomProperty属性上发现了GspParams特性，就知道使用哪个参数来给这个属性赋值了。
<p>&nbsp;&nbsp;&nbsp;&nbsp; 而发现特性，需要使用反射，Type类型为我们提够了足够的信息，使用Attribute.GetCustomAttribute（）的多个重载，可以方便我们运用于多个场景。</p>
<img src="http://www.cnblogs.com/ipointer/aggbug/1308239.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/ipointer/archive/2008/10/10/1308239.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/ipointer/archive/2008/10/10/1308239.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</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://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>用重载操作符实现用户数据类型的转换</title><link>http://www.cnblogs.com/ipointer/archive/2008/10/04/1303832.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Sat, 04 Oct 2008 08:29:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2008/10/04/1303832.html</guid><description><![CDATA[<p>阅读: 128 评论: 0 作者: <a href="http://www.cnblogs.com/ipointer/" target="_blank">栖息的熊</a> 发表于 2008-10-04 16:29 <a href="http://www.cnblogs.com/ipointer/archive/2008/10/04/1303832.html" target="_blank">原文链接</a></p><div class="t_msgfont" id="message233">
<div id="ad_thread3_1"></div>
<div id="firstpost">本文所提的类型转换是指两个类型之间没有继承关系，但其本意上又是很大的相似关系的，再某些场景下需要转换，因为不是C#的预置类型，所以语言本身不能提供这样的转化，需要我们自己实现。<br />
举一个我们开发中的场景，工作项的实体类有两个版本BasicWorkItem和GSPWorkItem，两个在不同的程序集中，部署位置也不同，BasicWorkItem的程序集可以在服务器和客户端都部署，而GSPWorkItem的程序集只能在服务器上部署。BasicWorkItem是GSPWorkItem的简化版本，只包含成员字段，GSPWorkItem中包含的成员函数可以做很多服务器端的操作。<br />
在工作流引擎的运行时都是使用的GSPWorkItem，但查询工作项的操作需要将工作项返回到客户端，因此才诞生了BasicWorkItem，在过webService的时候将GSPWorkItem转换为BasicWorkItem。<br />
有人说可以将BasicWorkItem作为GSPWorkItem的基类呀，这样就可以隐式转换了呀。但是BasicWorkItem引用指向的对象其实是GSPWorkItem类型的，在WebServiceClient端反序列化对象时，就是因为缺少GSPWorkItem的程序集而出错。<br />
这里只能新建BasicWorkItem对象，将其一个个字段的赋值。现在代码里的写法是在过webService的一层上加一个Convert方法，但这样代码就很零散了，不好维护。但如果我们在BasicWorkItem类中重载显示类型转换的操作符，这个过程就会很优雅，而且代码集中，易于管理。<br />
这里就写个示例。<br />
BasicWorkItem.cs<br />
<br />
//ect.<br />
public static explicit operator BasicWorkItem(GspWorkItem gspWorkItem)<br />
{<br />
BasicWorkItem result = new BasicWorkItem();<br />
result.WorkItemId = gspWorkItem.WorkItemId;<br />
return result;<br />
}<br />
//ect.<br />
<br />
这样在调用时就可以像预置类型一样转换了。<br />
BasicWorkItem basicWorkItem = (BasicWorkItem)gspWorkItem; </div>
</div>

<img src="http://www.cnblogs.com/ipointer/aggbug/1303832.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/ipointer/archive/2008/10/04/1303832.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/ipointer/archive/2008/10/04/1303832.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</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://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>搞不清楚的云计算</title><link>http://www.cnblogs.com/ipointer/archive/2008/10/03/1303534.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Fri, 03 Oct 2008 09:41:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2008/10/03/1303534.html</guid><description><![CDATA[<p>阅读: 95 评论: 1 作者: <a href="http://www.cnblogs.com/ipointer/" target="_blank">栖息的熊</a> 发表于 2008-10-03 17:41 <a href="http://www.cnblogs.com/ipointer/archive/2008/10/03/1303534.html" target="_blank">原文链接</a></p><p>对云计算的概念有很多疑问，想请各位参与讨论一下。</p>
<p>在网上看到如下的帖子：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #3366ff">伴随云计算的概念的出现，SAAS、DAAS、PAAS⋯纷繁众多的技术名称和定义在IT创新领域层出不穷。实际上，这些概念很多都存在相当大的交集、模糊或者重复命名，比如SAAS就只是早先失败的ASP的新瓶装旧酒。而云计算的概念刚由Google提出，Amazon便声称自己早已向客户提供云服务，戴尔和FaceBook甚至宣称已经着手&#8220;下一代云计算&#8221;，国内的一些软件开发商也号称自己进入了云时代。在我看来，种种迹象表明，即使不能简单地把云计算看成是旧有技术的一种新鲜说辞，它也只是一种营销比重很大、技术比重很小的&#8220;创新&#8221;概念。<br />
　　我们都知道，罗马的马车轮距决定了现代火车的铁轨间距，而为解决卡键问题设计的QWERTY低效键盘决定了现代计算机的键盘布局。争取路径依赖，是迈克尔&#183;波特竞争优势理论以外的第四种竞争战略。技术提供商和开发商们深谙其中的道理，云计算的争夺并非真正的技术创新使然，这只是一场争取路径依赖的激烈博弈。<br />
　　但如果云计算不是一种真正的技术创新，那么它是否是一种能够有效地改变用户结构和用户使用方式的创新呢？<br />
　　云计算的目标是&#8220;象使用水电一样地使用计算&#8221;，这与之前业界著名的ASP和当下流行的SAAS有着&#8220;同一个梦想&#8221;。在我看来，计算永远不会像水电一样地被使用。原因不在于不能，而在于不需要。不是每一种产品或者服务，都以水电化为终极目标。确实如Google所说，我们&#8220;不需要在家里安装一台发电机&#8221;，但千家万户有哪一个没有自己的炉灶呢？哪怕快餐店再快捷再美味，我们也还是会选择大部分时候在家做饭。问题恰恰在于饮食不是一个可以标准化的需要，美食的变化和人们对美食的要求永远没有止境。云计算并非用户的真正需求——超级计算也许是一些发烧友的梦想，但对于大多数用户，互联网只是看看新闻和花边消息的媒体，只是聊聊天拉拉家常的工具。<br />
　　如此看来，云计算就只是时下流行的又一次营销创新而已。而营销过度创新的危害甚至比创新不足更令人担忧，并且意味着忽略风险。<br />
　　健康的营销创新体现为对市场竞争格局的结构性改革，现有市场的各种压力在营销创新的过程中得到释放。如果营销创新会对企业竞争力产生持久的影响，那么它们之间必须是相互协调的，并且必须与战略目标相符以适应新生的竞争格局。否则，无论推行的营销创新多么令人眼花缭乱，终将成为一现的昙花。<br />
　　从18世纪产业革命以来，企业的创新一直都有实干的传统；但受所谓&#8220;金融创新&#8221;的传染，现代企业的创新有越来越务虚的趋势。我们看看所谓&#8220;金融创新&#8221;的危害：次债问题造成的金融危机短时间内根本得不到解决，不仅给美国，也给与美国相关的金融体系造成不可估量和难以恢复的破坏性影响。如同传销的华丽说辞不能提升传销产品本身与传销价格严重背离的低价值一样，次贷的高收益外衣也并不会提升贷款人的偿贷能力，不能改变其中蕴藏的巨大风险。<br />
　　回到我们关于云计算的反思，一个分不清是技术创新还是营销创新、务虚远胜于务实的概念，究竟能给我们造成什么影响呢？</span></p>
<p><span style="color: #3366ff">&nbsp;</span>我最初理解的云计算是：用整个互联网的运算能力来代替超级主机，连接上互联网的用户与计算提供商签订个协议，我的本地PC可以为其提供计算能力。当计算提供商接到大型的计算任务时，将计算分解为很多的小块，分发给很多的终端PC，最后将所有的计算结果汇总，以此来提供强大的计算能力。<br />
而如上文所提到的云计算，确实仅仅是常见的应用软件的互联网版本而已，这就没有特别大的创新意义。<br />
当然如果用户体验是上文提到的，而底层实现技术是我所描述的，还是有很多意义的。</p>
<img src="http://www.cnblogs.com/ipointer/aggbug/1303534.html?type=1" width="1" height="1" alt=""/><p>评论: 1　<a href="http://www.cnblogs.com/ipointer/archive/2008/10/03/1303534.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/ipointer/archive/2008/10/03/1303534.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</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://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>override和new关键词的差别</title><link>http://www.cnblogs.com/ipointer/archive/2008/10/03/1303527.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Fri, 03 Oct 2008 09:14:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2008/10/03/1303527.html</guid><description><![CDATA[<p>阅读: 115 评论: 0 作者: <a href="http://www.cnblogs.com/ipointer/" target="_blank">栖息的熊</a> 发表于 2008-10-03 17:14 <a href="http://www.cnblogs.com/ipointer/archive/2008/10/03/1303527.html" target="_blank">原文链接</a></p>继承和多态是我们常用的面向对象的特性，其中override和new关键词是我们最经常用到的，用下面的例子解释其用法。<br />
假设我们我们有基类BaseClass和ChildClass，都有方法DoSomething。<br />
在调用端使用下面的测试代码:<br />
ChildClass cc = new ChildClass();<br />
BaseClass bs = cc;<br />
Console.Write(bs.DoSomething());<br />
<br />
在基类和子类的DoSomething方法上的不同标记会对执行产生不同的影响。<br />
override一般翻译成&#8220;覆盖&#8221;或&#8220;重写&#8221;，其完整的说法应该是子类中的方法覆盖基类中的方法；<br />
new翻译成&#8220;隐藏&#8221;，其完整的说法应该是基类的方法隐藏子类中的方法。<br />
下面描述标记不同，调用效果的不同。<br />
a、如果基类和子类都没有特殊标记，按照&#8220;new&#8221;来处理，用基类引用指向子类对象，调用的是基类的方法；<br />
b、如果基类未标记，子类标记为new，效果同a；<br />
c、如果基类标记为virtual，子类未标记，效果还是同a；<br />
d、如果基类标记virtual，子类标记为override，即为&#8220;覆盖&#8221;处理，用基类引用指向子类，调用的是子类的方法；<br />
e、如果基类标记为virtual，子类标记为new，效果还是同a。<br />
<br />
需要注意的是a和c会出现警告，提醒程序员使用清晰的写法。d和e是推荐的写法，明确的表明了用意。<br />
对于b，即使基类中没有DoSomething方法，使用new标记也没有任何问题。但如果基类没有标记virtual，子类标记为override，则会出现编译时的错误。
<img src="http://www.cnblogs.com/ipointer/aggbug/1303527.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/ipointer/archive/2008/10/03/1303527.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/ipointer/archive/2008/10/03/1303527.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</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://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>你必须知道的值传递和引用传递</title><link>http://www.cnblogs.com/ipointer/archive/2008/10/02/1303083.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Thu, 02 Oct 2008 03:31:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2008/10/02/1303083.html</guid><description><![CDATA[<p>阅读: 393 评论: 2 作者: <a href="http://www.cnblogs.com/ipointer/" target="_blank">栖息的熊</a> 发表于 2008-10-02 11:31 <a href="http://www.cnblogs.com/ipointer/archive/2008/10/02/1303083.html" target="_blank">原文链接</a></p><div class="t_msgfont" id="message229">
<div id="ad_thread3_1"></div>
<div id="firstpost">C#中默认使用的是值传递，加ref关键词则标记为引用传递。两者的差别是值传递是传递标识符所代表的变量的副本，而引用传递是传递的本身。以此概念来推敲值类型和引用类型在两种不同传递方式下的区别，这可能是很多人都忽视的，下面的例子表达了这些区别。<br />
using System;<br />
<br />
namespace TestMethodParams<br />
{<br />
&nbsp; &nbsp; /// &lt;summary&gt;<br />
&nbsp; &nbsp; /// Class1 的摘要说明。<br />
&nbsp; &nbsp; /// &lt;/summary&gt;<br />
&nbsp; &nbsp; class Class1<br />
&nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; /// &lt;summary&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; /// 应用程序的主入口点。<br />
&nbsp; &nbsp; &nbsp; &nbsp; /// &lt;/summary&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; [STAThread]<br />
&nbsp; &nbsp; &nbsp; &nbsp; static void Main(string[] args)<br />
&nbsp; &nbsp; &nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // TODO: 在此处添加代码以启动应用程序<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int i = 0;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //值类型的值传递<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ValueTypeTransByVale(i);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine("值类型的值传递:");<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine(i);<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //值类型的引用传递<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ValueTypeTransByRef(ref i);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine("值类型的引用传递:");<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine(i);<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MyClass m = new MyClass();<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //引用类型的值传递1<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m.X = 0;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; RefTypeTransByValue1(m);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine("引用类型的值传递1:");<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine(m.X);<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //引用类型的值传递2<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m.X = 0;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; RefTypeTransByValue2(m);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine("引用类型的值传递2:");<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine(m.X);<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //引用类型的引用传递1<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m.X = 0;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; RefTypeTransByRef1(ref m);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine("引用类型的引用传递1:");<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine(m.X);<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //引用类型的引用传递2<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m.X = 0;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; RefTypeTransByRef2(ref m);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine("引用类型的引用传递2:");<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine(m.X);<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.Read();<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; static void ValueTypeTransByVale(int i)<br />
&nbsp; &nbsp; &nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i = 100;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; static void ValueTypeTransByRef(ref int i)<br />
&nbsp; &nbsp; &nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i = 100;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; static void RefTypeTransByValue1(MyClass m)<br />
&nbsp; &nbsp; &nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m.X = 100;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; static void RefTypeTransByValue2(MyClass m)<br />
&nbsp; &nbsp; &nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m = new MyClass();<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m.X = 100;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; static void RefTypeTransByRef1(ref MyClass m)<br />
&nbsp; &nbsp; &nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m.X = 100;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; static void RefTypeTransByRef2(ref MyClass m)<br />
&nbsp; &nbsp; &nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m = new MyClass();<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m.X = 100;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; public class MyClass<br />
&nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; public int X;<br />
&nbsp; &nbsp; }<br />
} </div>
</div>

<img src="http://www.cnblogs.com/ipointer/aggbug/1303083.html?type=1" width="1" height="1" alt=""/><p>评论: 2　<a href="http://www.cnblogs.com/ipointer/archive/2008/10/02/1303083.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/ipointer/archive/2008/10/02/1303083.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</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://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>windows用户配置文件的复制</title><link>http://www.cnblogs.com/ipointer/archive/2008/09/22/1296099.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Mon, 22 Sep 2008 10:12:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2008/09/22/1296099.html</guid><description><![CDATA[<p>阅读: 1237 评论: 0 作者: <a href="http://www.cnblogs.com/ipointer/" target="_blank">栖息的熊</a> 发表于 2008-09-22 18:12 <a href="http://www.cnblogs.com/ipointer/archive/2008/09/22/1296099.html" target="_blank">原文链接</a></p><p>本文的信息都来自互联网，并非本人原创，为了个人以后使用方便，在此标记一下。</p>
<p>本人快要离职，一个很重要的工作就是整理机器的环境。本人在公司一直使用域用户，但离职了公司的域就登不了了，以前很多的用户设置都用惯了，要用新的本地用户再配一次，不亚于重装一次系统。我很懒，才不愿意那么干呢，于是网上开始寻找解决办法，看到了一篇为了使本地用户的配置到域用户中继续使用的帖子，根据其中核心内容稍加改动就完成了本来觉得异常麻烦的事情。</p>
<p>核心思想就是使用windows系统信息中的用户配置文件复制功能，以前一直不知道干嘛的，呵呵，bs自己一下。</p>
<p>1、因为以后要使用本地帐户了，所以需要先建一个并加入管理员组，假设就叫localuser吧，下面的命令行建起来很方便。</p>
<p>net user localuser 123456a? /add </p>
<p>net localgroup administrators localuser /add</p>
<p>2、因为要在域用户和本地用户间复制，所以操作的过程必须使用第三方用户，否则必然会有文件被使用的提示。</p>
<p>重复1中的命令再建一个trans用户</p>
<p>3、将localuser登录一次，创建好本地目录</p>
<p>4、使用trans用户登录，我的电脑-&gt;属性-&gt;高级选项卡-&gt;用户配置文件区域点&#8220;设置&#8221;，弹出用户配置文件页面，选中复制源用户，即我的域用户，点复制到，在新弹出的界面上&#8220;浏览&#8221;，选要复制的目录，并点&#8220;更改&#8221;，因为域控上还有一些信息，而本地用户无法从域控上复制，所以需要你输入一下域登录信息，接着就开始等着复制吧。</p>
<p>5、复制结束后，使用localuser用户登录，呵呵，是不是很完美，和使用几年的用户设置几乎一模一样。检查一下visualstudio，重输了VSTFS的密码后，几乎所有的设置都没有变。还有邮箱，呵呵，重输了密码也都ok了，帐户设置，原来的邮件都在。</p>
<p>十几分钟搞定了很多事情，有一个疑问是，这个复制到操作到底做了什么，是不是我们都可以手工来做呢？</p>
<img src="http://www.cnblogs.com/ipointer/aggbug/1296099.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/ipointer/archive/2008/09/22/1296099.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/ipointer/archive/2008/09/22/1296099.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</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://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item></channel></rss>