<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>守望轩 &#187; c#</title>
	<atom:link href="http://www.watch-life.net/tag/c/feed" rel="self" type="application/rss+xml" />
	<link>http://www.watch-life.net</link>
	<description>关注IT,审视自我,守望生活, 宁静雅致的小轩馆.</description>
	<lastBuildDate>Tue, 20 Jul 2010 00:46:12 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>web developer tips (26):在 App_Code目录下同时放c#和VB.NET文件</title>
		<link>http://www.watch-life.net/visual-studio/have-c-and-vb-net-files-inside-your-app-code-directory.html</link>
		<comments>http://www.watch-life.net/visual-studio/have-c-and-vb-net-files-inside-your-app-code-directory.html#comments</comments>
		<pubDate>Sun, 19 Jul 2009 14:21:12 +0000</pubDate>
		<dc:creator>xjb</dc:creator>
				<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[Asp.net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[VB.net]]></category>
		<category><![CDATA[web developer tips]]></category>
		<category><![CDATA[web.config]]></category>

		<guid isPermaLink="false">http://www.watch-life.net/?p=417</guid>
		<description><![CDATA[原文地址：How to have C# and VB.NET files inside your App_Code directory
如果你利用App_Code目录来开发一个Asp.net web网站，有时候需要写用不同net语言的代码文件。例如，如果你想用在同一个web网站同时使用c#和VB.net

http://www.watch-life.net/visual-studio/have-c-and-vb-net-files-inside-your-app-code-directory.html
要支持这一点，就需要在web.config的compilation节点配置App_Code子文件夹进行分别编译。

&#60;compilation debug=&#34;true&#34;&#62;
&#60;codeSubDirectories&#62;
&#60;add directoryName=&#34;VBFiles&#34; /&#62;
&#60;/codeSubDirectories&#62;
&#60;/compilation&#62;

有关web.config 的compilation节点配置详见msdn：http://msdn.microsoft.com/zh-cn/library/221faf8e(VS.80).aspx


	你可能也会喜欢以下文章：
	
	让GridView中CheckBox列支持FireFox (0)
	web developer tips (56):手动更新JScript的智能感知 (0)
	web developer tips (6):关于标记导航功能 (0)
	web developer tips (60):如何对ASP.Net网站进行性能分析 (0)
	web developer tips (82):Visual Studio 2005web应用项目迁移到Visual Studio 2008 (1)
	web developer tips (71): 关于FastCGI 1.5beta几个新配置设置 (0)
	web developer tips (61):如何创建Asp.net Dynamic Data网站 (0)
	web developer tips (34)：在IIS7.0使用网址重写防止盗链 (1)


转载请注明作者，出处，以及原始超链接。评论数：0 &#124; 评论这篇文章&#124;关注作者最近动态,欢迎 [...]]]></description>
			<content:encoded><![CDATA[<p>原文地址：<a href="http://blogs.msdn.com/webdevelopertips/archive/2008/11/21/tip-26-did-you-know-how-to-have-c-and-vb-net-files-inside-your-app-code-directory.aspx" target="_blank">How to have C# and VB.NET files inside your App_Code directory</a></p>
<p>如果你利用App_Code目录来开发一个<a href="http://www.watch-life.net/category/aspnet" target="_blank">Asp.net</a> web网站，有时候需要写用不同net语言的代码文件。例如，如果你想用在同一个web网站同时使用<a href="http://www.watch-life.net/category/csharp" target="_blank">c#</a>和VB.net</p>
<p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="242" alt="image" src="http://blogs.msdn.com/blogfiles/webdevelopertips/WindowsLiveWriter/Tip2.NETfilesinsideyourApp_Codedirectory_8AE5/image_thumb.png" width="240" border="0" /><br />
<a href="http://www.watch-life.net/visual-studio/have-c-and-vb-net-files-inside-your-app-code-directory.html" target="_blank">http://www.watch-life.net/visual-studio/have-c-and-vb-net-files-inside-your-app-code-directory.html</a><br />
要支持这一点，就需要在web.config的compilation节点配置App_Code子文件夹进行分别编译。</p>
<div class=code>
&lt;compilation debug=&quot;true&quot;&gt;<br />
&lt;codeSubDirectories&gt;<br />
&lt;add directoryName=&quot;VBFiles&quot; /&gt;<br />
&lt;/codeSubDirectories&gt;<br />
&lt;/compilation&gt;
</div>
<p>有关web.config 的compilation节点配置详见<a href="http://msdn.microsoft.com" target="_blank">msdn</a>：<a href="http://msdn.microsoft.com/zh-cn/library/221faf8e(VS.80).aspx" target="_blank">http://msdn.microsoft.com/zh-cn/library/221faf8e(VS.80).aspx</a></p>
<p class="akst_link">
</p>
	<h4>你可能也会喜欢以下文章：</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.watch-life.net/aspnet/gridview-checkbox-firefox.html" title="让GridView中CheckBox列支持FireFox (2008-07-08)">让GridView中CheckBox列支持FireFox</a> (0)</li>
	<li><a href="http://www.watch-life.net/visual-studio/update-jscript-intellisense-manually.html" title="web developer tips (56):手动更新JScript的智能感知 (2009-10-29)">web developer tips (56):手动更新JScript的智能感知</a> (0)</li>
	<li><a href="http://www.watch-life.net/visual-studio/about-the-tag-navigator-feature.html" title="web developer tips (6):关于标记导航功能 (2009-06-14)">web developer tips (6):关于标记导航功能</a> (0)</li>
	<li><a href="http://www.watch-life.net/visual-studio/profiling-an-asp-net-site.html" title="web developer tips (60):如何对ASP.Net网站进行性能分析 (2009-11-05)">web developer tips (60):如何对ASP.Net网站进行性能分析</a> (0)</li>
	<li><a href="http://www.watch-life.net/visual-studio/migrating-vs-2005-web-application-project-to-vs-2008.html" title="web developer tips (82):Visual Studio 2005web应用项目迁移到Visual Studio 2008 (2010-03-29)">web developer tips (82):Visual Studio 2005web应用项目迁移到Visual Studio 2008</a> (1)</li>
	<li><a href="http://www.watch-life.net/visual-studio/there-are-several-new-configuration-settings-available-in-fastcgi-extension-1-5-beta.html" title="web developer tips (71): 关于FastCGI 1.5beta几个新配置设置 (2010-01-07)">web developer tips (71): 关于FastCGI 1.5beta几个新配置设置</a> (0)</li>
	<li><a href="http://www.watch-life.net/visual-studio/create-an-asp-net-dynamic-data-web-site.html" title="web developer tips (61):如何创建Asp.net Dynamic Data网站 (2009-11-09)">web developer tips (61):如何创建Asp.net Dynamic Data网站</a> (0)</li>
	<li><a href="http://www.watch-life.net/visual-studio/stop-hot-linking-from-your-site-using-url-rewrite-in-iis-7-0.html" title="web developer tips (34)：在IIS7.0使用网址重写防止盗链 (2009-08-13)">web developer tips (34)：在IIS7.0使用网址重写防止盗链</a> (1)</li>
</ul>

转载请注明作者，出处，以及原始超链接。<br />评论数：0 | <b><a href='http://www.watch-life.net/visual-studio/have-c-and-vb-net-files-inside-your-app-code-directory.html#comment'>评论这篇文章</a></b>|关注作者最近动态,欢迎 follow me <a href='https://twitter.com/xjb' target='_blank'>xjb@twitter.com</a>|联络作者：iamxjb@gmail.com<br/>© 2010 守望轩 <a href='http://www.watch-life.net/visual-studio/have-c-and-vb-net-files-inside-your-app-code-directory.html'>www.watch-life.net</a>]]></content:encoded>
			<wfw:commentRss>http://www.watch-life.net/visual-studio/have-c-and-vb-net-files-inside-your-app-code-directory.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sqlite数据库的加密</title>
		<link>http://www.watch-life.net/net-tip/sqlite-encrypted.html</link>
		<comments>http://www.watch-life.net/net-tip/sqlite-encrypted.html#comments</comments>
		<pubDate>Fri, 25 Jul 2008 15:06:56 +0000</pubDate>
		<dc:creator>xjb</dc:creator>
				<category><![CDATA[NET 点滴]]></category>
		<category><![CDATA[ADO.NET]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[net]]></category>
		<category><![CDATA[sqlite]]></category>
		<category><![CDATA[加密]]></category>
		<category><![CDATA[数据库]]></category>
		<category><![CDATA[点滴]]></category>

		<guid isPermaLink="false">http://www.watch-life.net/?p=169</guid>
		<description><![CDATA[最近在做一个winform的程序，考虑用Sqlite的数据库，小巧而实用，比Access强多了，不过需要加密，不过free版本没有实现加密，有一些c++的实现：比如：http://www.sqlite.com.cn/MySqlite/3/253.Html 和http://www.cppblog.com/niewenlong/archive/2007/06/01/25261.html 。不过，鉴于我对c++不是很精通，于是就采用了ADO.NET 2.0 SQLite Data Provider   这样可以直接利用它来创建一个加密的sqlite数据库。
有关c#代码如下：
1、创建空的sqlite数据库。

//数据库名的后缀你可以直接指定，甚至没有后缀都可以
//方法一：创建一个空sqlite数据库，用IO的方式
FileStream&#160;fs&#160;=&#160;File.Create(&#8220;c:\\test.db&#8220;);
//方法二：用SQLiteConnection
SQLiteConnection.CreateFile(&#8220;c:\\test.db&#8220;);


创建的数据库是个0字节的文件。
2、创建加密的空sqlite数据库

//创建一个密码为password的空的sqlite数据库
SQLiteConnection.CreateFile（&#8220;c:\\test2.db&#8220;);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
SQLiteConnection&#160;cnn&#160;=&#160;new&#160;SQLiteConnection(&#8220;Data&#160;Source=c:\\test2.db&#8220;);
&#160;SQLiteConnection&#160;cnn&#160;=&#160;new&#160;SQLiteConnection(&#8220;Data&#160;Source=D:\\test2.db&#8220;);
cnn.Open();
cnn.ChangePassword(&#8220;password&#8220;);

3、给未加密的数据库加密

SQLiteConnection&#160;cnn&#160;=&#160;new&#160;SQLiteConnection(&#8220;Data&#160;Source=c:\\test.db&#8220;);
cnn.Open();
cnn.ChangePassword(&#8220;password&#8220;);

4、打开加密sqlite数据库

//方法一
SQLiteConnection&#160;cnn&#160;=&#160;new&#160;SQLiteConnection(&#8220;Data&#160;Source=c:\\test2.db&#8220;);
cnn.SetPassword(&#8220;password&#8220;);
cnn.Open();
//方法二
SQLiteConnectionStringBuilder&#160;builder&#160;=&#160;new&#160;SQLiteConnectionStringBuilder();
&#160;builder.DataSource&#160;=&#160;@&#8221;c:\test.db&#8220;;
builder.Password&#160;=&#160;@&#8221;password&#8220;;
SQLiteConnection&#160;cnn&#160;=&#160;new&#160;SQLiteConnection(builder.ConnectionString);
cnn&#160;.Open();

注：
A、因为加密的函数是利用windows api，故加密后的数据库只能适用在windows平台，加密的方式是整体文件加密。
B、加密的算法是RC4，如果你想采用别的加密算法来加密，请参考ADO.NET 2.0 SQLite Data Provider 的源码来修改。
c、相关sqlite数据库操作类似ADO.NET 2.0。详见ADO.NET 2.0 SQLite Data Provider的帮助文档。
c、ADO.NET 2.0 SQLite Data Provider 版本为：1.0.53.0 ，SQLite版本 : 3.6.0。
d、开发环境为vs2008。
ADO.NET 2.0 SQLite Data Provider的下载地址：http://sourceforge.net/project/showfiles.php?group_id=132486&#038;package_id=145568
有关sqlite的中文介绍，你可以看看这里：http://www.cnblogs.com/shanyou/archive/2007/01/08/615245.html
本文地址：http://www.watch-life.net/net-tip/sqlite-encrypted.html


	你可能也会喜欢以下文章：
	
	web developer tips (26):在 App_Code目录下同时放c#和VB.NET文件 (0)
	html页面表格导出到excel总结 (3)
	c#细节&#8211;Property和Attribute迷局 (1)
	c#的细节(二)-修饰符 (0)
	c#细节(三)-AS和IS (0)
	温故知新的经典&#8211;书评《Programming C# 》中文版第4版 (1)
	c#的细节(一)-问号的细节 (0)
	WebResponse 跨域访问 (1)


转载请注明作者，出处，以及原始超链接。评论数：0 &#124; 评论这篇文章&#124;关注作者最近动态,欢迎 follow me xjb@twitter.com&#124;联络作者：iamxjb@gmail.com© 2010 守望轩 [...]]]></description>
			<content:encoded><![CDATA[<p>最近在做一个winform的程序，考虑用<a href="http://www.sqlite.org/" target="_blank">Sqlite</a>的数据库，小巧而实用，比Access强多了，不过需要加密，不过free版本没有实现加密，有一些c++的实现：比如：<a href="http://www.sqlite.com.cn/MySqlite/3/253.Html" target=“_blank”>http://www.sqlite.com.cn/MySqlite/3/253.Html</a> 和<a href="http://www.cppblog.com/niewenlong/archive/2007/06/01/25261.html" target="_blank">http://www.cppblog.com/niewenlong/archive/2007/06/01/25261.html</a> 。不过，鉴于我对c++不是很精通，于是就采用了<a href="http://sqlite.phxsoftware.com/">ADO.NET 2.0 SQLite Data Provider </a>  这样可以直接利用它来创建一个<a href="http://www.watch-life.net/net-tip/sqlite-encrypted.html">加密的sqlite数据库</a>。<br />
有关c#代码如下：<br />
1、创建空的sqlite数据库。</p>
<div class=code>
<span style="color: #008000">//</span><span style="color: #008000">数据库名的后缀你可以直接指定，甚至没有后缀都可以<br />
</span><span style="color: #008000">//</span><span style="color: #008000">方法一：创建一个空sqlite数据库，用IO的方式</span><span style="color: #008000"><br />
</span><span style="color: #000000">FileStream&nbsp;fs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;File.Create(</span><span style="color: #800000">&#8220;</span><span style="color: #800000">c:\\test.db</span><span style="color: #800000">&#8220;</span><span style="color: #000000">);<br />
</span><span style="color: #008000">//</span><span style="color: #008000">方法二：用SQLiteConnection</span><span style="color: #008000"><br />
</span><span style="color: #000000">SQLiteConnection.CreateFile(</span><span style="color: #800000">&#8220;</span><span style="color: #800000">c:\\test.db</span><span style="color: #800000">&#8220;</span><span style="color: #000000">);</p>
<p></span>
</div>
<p>创建的数据库是个0字节的文件。</p>
<p>2、创建加密的空sqlite数据库</p>
<div class=code>
<span style="color: #008000">//</span><span style="color: #008000">创建一个密码为password的空的sqlite数据库</span><span style="color: #008000"><br />
</span><span style="color: #000000">SQLiteConnection.CreateFile（</span><span style="color: #800000">&#8220;</span><span style="color: #800000">c:\\test2.db</span><span style="color: #800000">&#8220;</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
SQLiteConnection&nbsp;cnn&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SQLiteConnection(</span><span style="color: #800000">&#8220;</span><span style="color: #800000">Data&nbsp;Source=c:\\test2.db</span><span style="color: #800000">&#8220;</span><span style="color: #000000">);<br />
&nbsp;SQLiteConnection&nbsp;cnn&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SQLiteConnection(</span><span style="color: #800000">&#8220;</span><span style="color: #800000">Data&nbsp;Source=D:\\test2.db</span><span style="color: #800000">&#8220;</span><span style="color: #000000">);<br />
cnn.Open();<br />
cnn.ChangePassword(</span><span style="color: #800000">&#8220;</span><span style="color: #800000">password</span><span style="color: #800000">&#8220;</span><span style="color: #000000">);</span>
</div>
<p>3、给未加密的数据库加密</p>
<div class=code>
<span style="color: #000000">SQLiteConnection&nbsp;cnn&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SQLiteConnection(</span><span style="color: #800000">&#8220;</span><span style="color: #800000">Data&nbsp;Source=c:\\test.db</span><span style="color: #800000">&#8220;</span><span style="color: #000000">);<br />
cnn.Open();<br />
cnn.ChangePassword(</span><span style="color: #800000">&#8220;</span><span style="color: #800000">password</span><span style="color: #800000">&#8220;</span><span style="color: #000000">);</span>
</div>
<p>4、打开加密sqlite数据库</p>
<div class=code>
<p><span style="color: #008000">//</span><span style="color: #008000">方法一</span><span style="color: #008000"><br />
</span><span style="color: #000000">SQLiteConnection&nbsp;cnn&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SQLiteConnection(</span><span style="color: #800000">&#8220;</span><span style="color: #800000">Data&nbsp;Source=c:\\test2.db</span><span style="color: #800000">&#8220;</span><span style="color: #000000">);<br />
cnn.SetPassword(</span><span style="color: #800000">&#8220;</span><span style="color: #800000">password</span><span style="color: #800000">&#8220;</span><span style="color: #000000">);<br />
cnn.Open();<br />
</span><span style="color: #008000">//</span><span style="color: #008000">方法二</span><span style="color: #008000"><br />
</span><span style="color: #000000">SQLiteConnectionStringBuilder&nbsp;builder&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SQLiteConnectionStringBuilder();<br />
&nbsp;builder.DataSource&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">@&#8221;c</span><span style="color: #800000">:\test.db</span><span style="color: #800000">&#8220;</span><span style="color: #000000">;<br />
builder.Password&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">@&#8221;</span><span style="color: #800000">password</span><span style="color: #800000">&#8220;</span><span style="color: #000000">;<br />
SQLiteConnection&nbsp;cnn&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SQLiteConnection(builder.ConnectionString);<br />
cnn&nbsp;.Open();</span>
</div>
<p>注：<br />
A、因为加密的函数是利用windows api，故加密后的数据库只能适用在windows平台，加密的方式是整体文件加密。<br />
B、加密的算法是<a href="http://www.google.cn/search?complete=1&#038;hl=zh-CN&#038;newwindow=1&#038;q=rc4&#038;btnG=Google+%E6%90%9C%E7%B4%A2&#038;meta=&#038;aq=f" target="_blank">RC4</a>，如果你想采用别的加密算法来加密，请参考ADO.NET 2.0 SQLite Data Provider 的源码来修改。<br />
c、相关sqlite数据库操作类似ADO.NET 2.0。详见ADO.NET 2.0 SQLite Data Provider的帮助文档。<br />
c、ADO.NET 2.0 SQLite Data Provider 版本为：1.0.53.0 ，SQLite版本 : 3.6.0。<br />
d、开发环境为vs2008。</p>
<p>ADO.NET 2.0 SQLite Data Provider的下载地址：<a href="http://sourceforge.net/project/showfiles.php?group_id=132486&#038;package_id=145568" target="_blank">http://sourceforge.net/project/showfiles.php?group_id=132486&#038;package_id=145568</a></p>
<p>有关sqlite的中文介绍，你可以看看这里：<a href="http://www.cnblogs.com/shanyou/archive/2007/01/08/615245.html" target="_blank">http://www.cnblogs.com/shanyou/archive/2007/01/08/615245.html</a></p>
<p>本文地址：<a href="http://www.watch-life.net/net-tip/sqlite-encrypted.html" target="_blank">http://www.watch-life.net/net-tip/sqlite-encrypted.html</a></p>
<p class="akst_link">
</p>
	<h4>你可能也会喜欢以下文章：</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.watch-life.net/visual-studio/have-c-and-vb-net-files-inside-your-app-code-directory.html" title="web developer tips (26):在 App_Code目录下同时放c#和VB.NET文件 (2009-07-19)">web developer tips (26):在 App_Code目录下同时放c#和VB.NET文件</a> (0)</li>
	<li><a href="http://www.watch-life.net/programming-notes/html-table-2-excel.html" title="html页面表格导出到excel总结 (2008-06-23)">html页面表格导出到excel总结</a> (3)</li>
	<li><a href="http://www.watch-life.net/csharp/csharp-detail-property-attribute.html" title="c#细节&#8211;Property和Attribute迷局 (2008-07-17)">c#细节&#8211;Property和Attribute迷局</a> (1)</li>
	<li><a href="http://www.watch-life.net/csharp/csharp-detail-modifiers.html" title="c#的细节(二)-修饰符 (2008-07-06)">c#的细节(二)-修饰符</a> (0)</li>
	<li><a href="http://www.watch-life.net/csharp/csharp-detail-modifiers-as-is.html" title="c#细节(三)-AS和IS (2008-07-07)">c#细节(三)-AS和IS</a> (0)</li>
	<li><a href="http://www.watch-life.net/technology-book-review/programming-csharp-bookreview.html" title="温故知新的经典&#8211;书评《Programming C# 》中文版第4版 (2007-10-30)">温故知新的经典&#8211;书评《Programming C# 》中文版第4版</a> (1)</li>
	<li><a href="http://www.watch-life.net/csharp/csharp-detail-question-marks.html" title="c#的细节(一)-问号的细节 (2008-07-03)">c#的细节(一)-问号的细节</a> (0)</li>
	<li><a href="http://www.watch-life.net/aspnet/webresponse-cross-site-visit.html" title="WebResponse 跨域访问 (2008-07-07)">WebResponse 跨域访问</a> (1)</li>
</ul>

转载请注明作者，出处，以及原始超链接。<br />评论数：0 | <b><a href='http://www.watch-life.net/net-tip/sqlite-encrypted.html#comment'>评论这篇文章</a></b>|关注作者最近动态,欢迎 follow me <a href='https://twitter.com/xjb' target='_blank'>xjb@twitter.com</a>|联络作者：iamxjb@gmail.com<br/>© 2010 守望轩 <a href='http://www.watch-life.net/net-tip/sqlite-encrypted.html'>www.watch-life.net</a>]]></content:encoded>
			<wfw:commentRss>http://www.watch-life.net/net-tip/sqlite-encrypted.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>c#细节&#8211;Property和Attribute迷局</title>
		<link>http://www.watch-life.net/csharp/csharp-detail-property-attribute.html</link>
		<comments>http://www.watch-life.net/csharp/csharp-detail-property-attribute.html#comments</comments>
		<pubDate>Thu, 17 Jul 2008 15:10:45 +0000</pubDate>
		<dc:creator>xjb</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[Attribute]]></category>
		<category><![CDATA[Property]]></category>
		<category><![CDATA[细节]]></category>

		<guid isPermaLink="false">http://www.watch-life.net/?p=155</guid>
		<description><![CDATA[《c#的细节》是我当初学习c#时候，做的一些学习笔记的整理，现在回头看来这些都是非常浅显的知识，是c#非常细节的地方，同时也是不能忽略的地方，”细节决定成败“，也许有些严重。我希望把这些整理出来，可以给初学者一个参考,也给自己一个温故知新的机会。高手就不必花时间来看了。;-)
——————————————————————————&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;
C#中Property和Attribute本是两个非常好区分的概念，但翻译过来都叫“属性”，似乎让人迷惑。造成Property和Attribute迷局的原因有两个：
1、不知道是中文翻译词汇的贫乏，还是英文词汇的贫乏，导致两者的混淆。于是有人建议把Attribute翻译成“特性”。这虽然在称呼上把两者区分开来，但并不能从本质上揭开迷局。
2、在c#中引入了所谓“字段”（Field），把OOA/OOD中的Attribute给替换了，而同时有引入了自己的“Attribute”。
看看下面的表格，你也许就了解 ，在c#中所谓“字段”的渊源了。




OOA/OOD


C++


.NET(C#)




Attribute


Member Variable


Field




Method


Member Function


Method




 
原来“field”就是原来c++中的“Member Variable” ，也就是OOA/OOD中的“Attribute”，按OOA/OOD的规定理所当然“field”是只能用private限定了。
下面来说说c#的“Property”，先看看下面的代码

public class cName
{
// C#中Field（字段），C++中Member Variable，OOA/OOD中Attribute（属性）
private string m_Field;
public string Prop { // C#中称为Property（属性）
get
{
return m_Field;
}
set
{
name = m_Field;
}
}
}
 
通过上面可以知道“Property”其实本质就是一个一对get/set方法（用public来限定），因此它就相当于c++的Member Function或者OOA/OOD中的Method，一个比较特殊一点的方法。
而c#中的“Attribute”则完全和OOA/OOD中的“Attribute” 完全不一样了，而是c#（net）全新引入的一个概念。
msdn官方的解释如下：
公共语言运行时允许你添加类似关键字的描述声明，叫做attributes, 它对程序中的元素进行标注，如类型、字段、方法和属性等。Attributes和Microsoft .NET Framework文件的元数据保存在一起，可以用来向运行时描述你的代码，或者在程序运行的时候影响应用程序的行为。
说的通俗些Attribute是类,不过是一类比较特殊的类，Attribute必须写在一对方括符中，用来处理net中多种问题：序列化、程序的安全特征等等，在net中的作用非同凡响。那么关于Attribute的用法，不再是本文条论范围了，你可以看看dudu写的一个系列文章,链接如下http://www.cnblogs.com/dudu/articles/4449.html
本文地址：http://www.watch-life.net/csharp/csharp-detail-property-attribute.html


	你可能也会喜欢以下文章：
	
	html页面表格导出到excel总结 (3)
	c#的细节(一)-问号的细节 (0)
	WebResponse 跨域访问 (1)
	web developer tips (26):在 App_Code目录下同时放c#和VB.NET文件 (0)
	c#细节(三)-AS和IS (0)
	求职与做人 (6)
	web developer tips (66):输入属性时自动插入引号 (0)
	温故知新的经典&#8211;书评《Programming C# 》中文版第4版 (1)


转载请注明作者，出处，以及原始超链接。评论数：1 &#124; 评论这篇文章&#124;关注作者最近动态,欢迎 follow me xjb@twitter.com&#124;联络作者：iamxjb@gmail.com© 2010 守望轩 www.watch-life.net]]></description>
			<content:encoded><![CDATA[<p><span style="color: #3366ff;">《c#的细节》是我当初学习c#时候，做的一些学习笔记的整理，现在回头看来这些都是非常浅显的知识，是c#非常细节的地方，同时也是不能忽略的地方，”细节决定成败“，也许有些严重。我希望把这些整理出来，可以给初学者一个参考,也给自己一个温故知新的机会。高手就不必花时间来看了。;-)</span></p>
<p>——————————————————————————&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>C#中Property和Attribute本是两个非常好区分的概念，但翻译过来都叫“属性”，似乎让人迷惑。造成Property和Attribute迷局的原因有两个：<br />
1、不知道是中文翻译词汇的贫乏，还是英文词汇的贫乏，导致两者的混淆。于是有人建议把Attribute翻译成“特性”。这虽然在称呼上把两者区分开来，但并不能从本质上揭开<a href="http://www.watch-life.net/csharp/csharp-detail-property-attribute.html">迷局</a>。<br />
2、在c#中引入了所谓“字段”（Field），把OOA/OOD中的Attribute给替换了，而同时有引入了自己的“Attribute”。</p>
<p>看看下面的表格，你也许就了解 ，在c#中所谓“字段”的渊源了。</p>
<table style="border-collapse: collapse;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; border-left-color: #ebedec; padding-bottom: 0cm; width: 106.5pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent;" width="142" valign="top">
<p style="margin: 0cm 0cm 0pt; text-align: center;" align="center">OOA/OOD</p>
</td>
<td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; border-left-color: #ebedec; padding-bottom: 0cm; width: 106.55pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent;" width="142" valign="top">
<p style="margin: 0cm 0cm 0pt; text-align: center;" align="center">C++</p>
</td>
<td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; border-left-color: #ebedec; padding-bottom: 0cm; width: 106.55pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent;" width="142" valign="top">
<p style="margin: 0cm 0cm 0pt; text-align: center;" align="center">.NET(C#)</p>
</td>
</tr>
<tr>
<td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ebedec; padding-bottom: 0cm; width: 106.5pt; border-top-color: #ebedec; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent;" width="142" valign="top">
<p style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><span style="color: #ff0000;">Attribute</span></p>
</td>
<td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ebedec; padding-bottom: 0cm; width: 106.55pt; border-top-color: #ebedec; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent;" width="142" valign="top">
<p style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><span style="color: #ff0000;">Member Variable</span></p>
</td>
<td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ebedec; padding-bottom: 0cm; width: 106.55pt; border-top-color: #ebedec; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent;" width="142" valign="top">
<p style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><span style="color: #ff0000;">Field</span></p>
</td>
</tr>
<tr>
<td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ebedec; padding-bottom: 0cm; width: 106.5pt; border-top-color: #ebedec; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent;" width="142" valign="top">
<p style="margin: 0cm 0cm 0pt; text-align: center;" align="center">Method</p>
</td>
<td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ebedec; padding-bottom: 0cm; width: 106.55pt; border-top-color: #ebedec; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent;" width="142" valign="top">
<p style="margin: 0cm 0cm 0pt; text-align: center;" align="center">Member Function</p>
</td>
<td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ebedec; padding-bottom: 0cm; width: 106.55pt; border-top-color: #ebedec; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent;" width="142" valign="top">
<p style="margin: 0cm 0cm 0pt; text-align: center;" align="center">Method</p>
</td>
</tr>
</tbody>
</table>
<div> </div>
<div>原来“field”就是原来c++中的“Member Variable” ，也就是OOA/OOD中的“Attribute”，按OOA/OOD的规定理所当然“field”是只能用<span style="color: #0000ff;">private<span style="color: #000000;">限定了。</span></span></div>
<div><span style="color: #0000ff;"><span style="color: #000000;">下面来说说c#的“Property”，先看看下面的代码</span></span></div>
<div class="code">
<p>public class cName<br />
{<br />
// C#中Field（字段），C++中Member Variable，OOA/OOD中Attribute（属性）<br />
private string m_Field;<br />
public string Prop { // C#中称为Property（属性）<br />
get<br />
{<br />
return m_Field;<br />
}<br />
set<br />
{<br />
name = m_Field;<br />
}</p>
<p>}<br />
}<br />
 </p></div>
<p>通过上面可以知道“Property”其实本质就是一个一对get/set方法（用public来限定），因此它就相当于c++的<span>Member Function或者OOA/OOD中的Method，一个比较特殊一点的方法。</span></p>
<p><span>而c#中的“<span style="color: #ff0000;">Attribute</span>”则完全和OOA/OOD中的“<span style="color: #0000ff;">Attribute</span>” 完全不一样了，而是c#（net）全新引入的一个概念。</span><br />
msdn官方的解释如下：</p>
<blockquote><p>公共语言运行时允许你添加类似关键字的描述声明，叫做attributes, 它对程序中的元素进行标注，如类型、字段、方法和属性等。Attributes和Microsoft .NET Framework文件的元数据保存在一起，可以用来向运行时描述你的代码，或者在程序运行的时候影响应用程序的行为。</p></blockquote>
<p>说的通俗些Attribute是类,不过是一类比较特殊的类，Attribute必须写在一对方括符中，用来处理net中多种问题：序列化、程序的安全特征等等，在net中的作用非同凡响。那么关于Attribute的用法，不再是本文条论范围了，你可以看看<a href="http://www.cnblogs.com/dudu" target="_blank">dudu</a>写的一个系列文章,链接如下<a href="http://www.cnblogs.com/dudu/articles/4449.html" target="_blank">http://www.cnblogs.com/dudu/articles/4449.html</a></p>
<p>本文地址：h<a href="http://www.watch-life.net/csharp/csharp-detail-property-attribute.html">ttp://www.watch-life.net/csharp/csharp-detail-property-attribute.html</a></p>
<p class="akst_link">
</p>
	<h4>你可能也会喜欢以下文章：</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.watch-life.net/programming-notes/html-table-2-excel.html" title="html页面表格导出到excel总结 (2008-06-23)">html页面表格导出到excel总结</a> (3)</li>
	<li><a href="http://www.watch-life.net/csharp/csharp-detail-question-marks.html" title="c#的细节(一)-问号的细节 (2008-07-03)">c#的细节(一)-问号的细节</a> (0)</li>
	<li><a href="http://www.watch-life.net/aspnet/webresponse-cross-site-visit.html" title="WebResponse 跨域访问 (2008-07-07)">WebResponse 跨域访问</a> (1)</li>
	<li><a href="http://www.watch-life.net/visual-studio/have-c-and-vb-net-files-inside-your-app-code-directory.html" title="web developer tips (26):在 App_Code目录下同时放c#和VB.NET文件 (2009-07-19)">web developer tips (26):在 App_Code目录下同时放c#和VB.NET文件</a> (0)</li>
	<li><a href="http://www.watch-life.net/csharp/csharp-detail-modifiers-as-is.html" title="c#细节(三)-AS和IS (2008-07-07)">c#细节(三)-AS和IS</a> (0)</li>
	<li><a href="http://www.watch-life.net/life-thinking/work-and-life.html" title="求职与做人 (2008-10-30)">求职与做人</a> (6)</li>
	<li><a href="http://www.watch-life.net/visual-studio/insert-quotes-values-automatically-while-typing-the-attrib-values.html" title="web developer tips (66):输入属性时自动插入引号 (2009-11-19)">web developer tips (66):输入属性时自动插入引号</a> (0)</li>
	<li><a href="http://www.watch-life.net/technology-book-review/programming-csharp-bookreview.html" title="温故知新的经典&#8211;书评《Programming C# 》中文版第4版 (2007-10-30)">温故知新的经典&#8211;书评《Programming C# 》中文版第4版</a> (1)</li>
</ul>

转载请注明作者，出处，以及原始超链接。<br />评论数：1 | <b><a href='http://www.watch-life.net/csharp/csharp-detail-property-attribute.html#comment'>评论这篇文章</a></b>|关注作者最近动态,欢迎 follow me <a href='https://twitter.com/xjb' target='_blank'>xjb@twitter.com</a>|联络作者：iamxjb@gmail.com<br/>© 2010 守望轩 <a href='http://www.watch-life.net/csharp/csharp-detail-property-attribute.html'>www.watch-life.net</a>]]></content:encoded>
			<wfw:commentRss>http://www.watch-life.net/csharp/csharp-detail-property-attribute.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>c#细节(三)-AS和IS</title>
		<link>http://www.watch-life.net/csharp/csharp-detail-modifiers-as-is.html</link>
		<comments>http://www.watch-life.net/csharp/csharp-detail-modifiers-as-is.html#comments</comments>
		<pubDate>Mon, 07 Jul 2008 09:26:54 +0000</pubDate>
		<dc:creator>xjb</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[AS]]></category>
		<category><![CDATA[IS]]></category>
		<category><![CDATA[操作符]]></category>
		<category><![CDATA[细节]]></category>

		<guid isPermaLink="false">http://www.watch-life.net/?p=150</guid>
		<description><![CDATA[《c#的细节》是我当初学习c#时候，做的一些学习笔记的整理，现在回头看来这些都是非常浅显的知识，是c#非常细节的地方，同时也是不能忽略的地方，”细节决定成败“，也许有些严重。我希望把这些整理出来，可以给初学者一个参考,也给自己一个温故知新的机会。高手就不必花时间来看了。;-)
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-
在c#中类型的转换分两种：显式和隐式，基本的规则如下：
1、基类对象转化为子类对象，必须显式转换，规则：(类型名) 对象。
2、值类型和引用类型的转换采用装箱(boxing)或拆箱(unboxing).
3、子类转化为基类对象。
4、基本类型互相之间转化可以用Covent类来实现。
5、字符串类型转换为对应的基本类型用Parse方法，除了String类型外其他的类型都可以用Parse方法。
6、用GetType可以取得对象的精确类型。
7、子类转化为基类，采用隐式转换。
下面来说说AS和IS操作符。
AS：用于在兼容的引用类型之间执行转换。
IS：检查对象是否与给定类型兼容
从概念来分析：
1、AS在转换的同事兼判断兼容性，如果无法进行转换，则 as 返回 null（没有产生新的对象）而不是引发异常。有了AS我想以后就不要再用try-catch来做类型转换的判断了。因此as转换成功要判断是否为null。
2、AS是引用类型类型的转换或者装箱转换，不能用与值类型的转换。如果是值类型只能结合is来强制转换，代码如下：
object objTest = 11;    

if( objTest is int )
	
    {
        &#160;&#160;&#160; int nValue = (int )objTest;

    }

3、IS只是做类型兼容判断，并不执行真正的类型转换。返回true或false，不会返回null，对象为null也会返回false。
4、AS模式的效率要比IS模式的高，因为借助IS进行类型转换的化，需要执行两次类型兼容检查。而AS只需要做一次类型兼容，一次null检查，null检查要比类型兼容检查快。
本文地址：http://www.watch-life.net/csharp/csharp-detail-modifiers-as-is.html


	你可能也会喜欢以下文章：
	
	温故知新的经典&#8211;书评《Programming C# 》中文版第4版 (1)
	WebResponse 跨域访问 (1)
	c#的细节(一)-问号的细节 (0)
	web developer tips (26):在 App_Code目录下同时放c#和VB.NET文件 (0)
	c#的细节(二)-修饰符 (0)
	html页面表格导出到excel总结 (3)
	Sqlite数据库的加密 (0)
	求职与做人 (6)


转载请注明作者，出处，以及原始超链接。评论数：0 &#124; 评论这篇文章&#124;关注作者最近动态,欢迎 follow [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #0000ff;">《c#的细节》是我当初学习c#时候，做的一些学习笔记的整理，现在回头看来这些都是非常浅显的知识，是c#非常细节的地方，同时也是不能忽略的地方，”细节决定成败“，也许有些严重。我希望把这些整理出来，可以给初学者一个参考,也给自己一个温故知新的机会。高手就不必花时间来看了。;-)</span></p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
在<a href="http://www.watch-life.net/category/csharp" target="_blank">c#</a>中类型的转换分两种：显式和隐式，基本的规则如下：<br />
1、基类对象转化为子类对象，必须显式转换，规则：(类型名) 对象。<br />
2、值类型和引用类型的转换采用装箱(boxing)或拆箱(unboxing).<br />
3、子类转化为基类对象。<br />
4、基本类型互相之间转化可以用Covent类来实现。<br />
5、字符串类型转换为对应的基本类型用Parse方法，除了String类型外其他的类型都可以用Parse方法。<br />
6、用GetType可以取得对象的精确类型。<br />
7、子类转化为基类，采用隐式转换。</p>
<p>下面来说说<a href="http://www.watch-life.net/csharp/csharp-detail-modifiers-as-is.html">AS和IS操作符</a>。<br />
AS：用于在兼容的引用类型之间执行转换。<br />
IS：检查对象是否与给定类型兼容</p>
<p>从概念来分析：<br />
1、AS在转换的同事兼判断兼容性，如果无法进行转换，则 as 返回 null（没有产生新的对象）而不是引发异常。有了AS我想以后就不要再用try-catch来做类型转换的判断了。因此as转换成功要判断是否为null。<br />
2、AS是引用类型类型的转换或者装箱转换，不能用与值类型的转换。如果是值类型只能结合is来强制转换，代码如下：</p>
<div class="code"><span style="color: #0000ff;">object</span><span style="color: #000000;"> objTest </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">11</span><span style="color: #000000;">;    </span></p>
<p>
<span style="color: #000000;"><span style="color: #0000ff;">if</span><span style="color: #000000;">( objTest </span><span style="color: #0000ff;">is</span><span style="color: #000000;"> </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> )</span></span>
	</p>
<p><span style="color: #000000;">    {</span><br />
<span style="color: #000000;">        <span style="color: #0000ff;">&nbsp;&nbsp;&nbsp; int</span><span style="color: #000000;"> nValue </span><span style="color: #000000;">=</span><span style="color: #000000;"> (</span><span style="color: #0000ff;">int</span><span style="color: #000000;"> )objTest;</span></span></p>
<p>
<span style="color: #000000;"><span style="color: #000000;">    }<br />
</span></div>
<p>3、IS只是做类型兼容判断，并不执行真正的类型转换。返回true或false，不会返回null，对象为null也会返回false。<br />
4、AS模式的效率要比IS模式的高，因为借助IS进行类型转换的化，需要执行两次类型兼容检查。而AS只需要做一次类型兼容，一次null检查，null检查要比类型兼容检查快。</p>
<p>本文地址：<a href="http://www.watch-life.net/csharp/csharp-detail-modifiers-as-is.html">http://www.watch-life.net/csharp/csharp-detail-modifiers-as-is.html</a></p>
<p class="akst_link">
</p>
	<h4>你可能也会喜欢以下文章：</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.watch-life.net/technology-book-review/programming-csharp-bookreview.html" title="温故知新的经典&#8211;书评《Programming C# 》中文版第4版 (2007-10-30)">温故知新的经典&#8211;书评《Programming C# 》中文版第4版</a> (1)</li>
	<li><a href="http://www.watch-life.net/aspnet/webresponse-cross-site-visit.html" title="WebResponse 跨域访问 (2008-07-07)">WebResponse 跨域访问</a> (1)</li>
	<li><a href="http://www.watch-life.net/csharp/csharp-detail-question-marks.html" title="c#的细节(一)-问号的细节 (2008-07-03)">c#的细节(一)-问号的细节</a> (0)</li>
	<li><a href="http://www.watch-life.net/visual-studio/have-c-and-vb-net-files-inside-your-app-code-directory.html" title="web developer tips (26):在 App_Code目录下同时放c#和VB.NET文件 (2009-07-19)">web developer tips (26):在 App_Code目录下同时放c#和VB.NET文件</a> (0)</li>
	<li><a href="http://www.watch-life.net/csharp/csharp-detail-modifiers.html" title="c#的细节(二)-修饰符 (2008-07-06)">c#的细节(二)-修饰符</a> (0)</li>
	<li><a href="http://www.watch-life.net/programming-notes/html-table-2-excel.html" title="html页面表格导出到excel总结 (2008-06-23)">html页面表格导出到excel总结</a> (3)</li>
	<li><a href="http://www.watch-life.net/net-tip/sqlite-encrypted.html" title="Sqlite数据库的加密 (2008-07-25)">Sqlite数据库的加密</a> (0)</li>
	<li><a href="http://www.watch-life.net/life-thinking/work-and-life.html" title="求职与做人 (2008-10-30)">求职与做人</a> (6)</li>
</ul>

转载请注明作者，出处，以及原始超链接。<br />评论数：0 | <b><a href='http://www.watch-life.net/csharp/csharp-detail-modifiers-as-is.html#comment'>评论这篇文章</a></b>|关注作者最近动态,欢迎 follow me <a href='https://twitter.com/xjb' target='_blank'>xjb@twitter.com</a>|联络作者：iamxjb@gmail.com<br/>© 2010 守望轩 <a href='http://www.watch-life.net/csharp/csharp-detail-modifiers-as-is.html'>www.watch-life.net</a>]]></content:encoded>
			<wfw:commentRss>http://www.watch-life.net/csharp/csharp-detail-modifiers-as-is.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WebResponse 跨域访问</title>
		<link>http://www.watch-life.net/aspnet/webresponse-cross-site-visit.html</link>
		<comments>http://www.watch-life.net/aspnet/webresponse-cross-site-visit.html#comments</comments>
		<pubDate>Mon, 07 Jul 2008 03:10:09 +0000</pubDate>
		<dc:creator>xjb</dc:creator>
				<category><![CDATA[Asp.net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[WebResponse]]></category>
		<category><![CDATA[xmlhttp]]></category>
		<category><![CDATA[跨域]]></category>

		<guid isPermaLink="false">http://www.watch-life.net/?p=149</guid>
		<description><![CDATA[前两天，一个朋友让我帮他写这样一个程序：在asp.net里面访问asp的页面，把数据提交对方的数据库后，根据返回的值（返回值为：OK或ERROR），如果为OK再把填入本地数据库。当时，想当然，觉得很简单，用js的xmlhttp ，如果根据response 的值是“OK”就执行提交本地数据库。很快写完发过去，让朋友试试，一试发现不行，后来一问，原来是跨域访问，我给忽略了，于是让朋友把asp改成web service，可朋友说程序是合作公司做的，只会asp，不会用web service ，狂晕ing。没办法，只能请出asp.net的 WebResponse了，很多网站采集程序都是用这个。第一版写完了，倒是可以跨域访问了，不过是乱码，调整有关编码的方式，终于可以了。这个应用虽小可是涉及的知识点不少：
1、xmlhttp 不能跨域提交。
当然XMLHttpRequest还是权宜的解决的方法，可以参考思归写的一篇文章：http://blog.joycode.com/saucer/archive/2006/10/03/84572.aspx
2、webresponse可以进行跨域访问，不过要注意
1）、get和post的区别。
2）、注意Timeout的问题。
这些都是简单的程序，记下来备忘，高手就不必看了。
不废话了，下面是相关的c#代码：

///&#160;&#60;summary&#62;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;///&#160;使用Post方法发送数据
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;///&#160;&#60;/summary&#62;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;///&#160;&#60;param&#160;name=”pi_strPostURl”&#62;提交地址&#60;/param&#62;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;///&#160;&#60;param&#160;name=”pi_strParm”&#62;参数&#60;/param&#62;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;///&#160;&#60;returns&#62;&#60;/returns&#62;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;public&#160;static&#160;string&#160;PostResponse(string&#160;pi_strPostURl,&#160;string&#160;pi_strParm)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;try
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//编码
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Encoding&#160;t_Encoding&#160;=&#160;Encoding.GetEncoding(“GB2312“);&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Uri&#160;t_Uri&#160;=&#160;new&#160;Uri(pi_strPostURl);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;byte[]&#160;paramBytes&#160;=&#160;t_Encoding.GetBytes(pi_strParm);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;WebRequest&#160;t_WebRequest&#160;=&#160;WebRequest.Create(t_Uri);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;t_WebRequest.Timeout&#160;=&#160;100000;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//设置ContentType
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;t_WebRequest.ContentType&#160;=&#160;“application/x-www-form-urlencoded“;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;t_WebRequest.Method&#160;=&#160;EnumMethod.POST.ToString();&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//初始化
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;using&#160;(Stream&#160;t_REStream&#160;=&#160;t_WebRequest.GetRequestStream())
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//发送数据
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;requestStream.Write(paramBytes,&#160;0
,&#160;paramBytes.Length);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;WebResponse&#160;t_WebResponse&#160;=
&#160;t_WebRequest.GetResponse();
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;using&#160;(StreamReader&#160;t_StreamReader&#160;=&#160;new&#160;StreamReader(t_WebResponse&#160;.GetResponseStream(),&#160;t_Encoding))
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;t_StreamReader.ReadToEnd();
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;catch
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;“ERROR“;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;
public&#160;static&#160;string&#160;GetResponse(string&#160;pi_strPostURl,&#160;string&#160;pi_strParm)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;try
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//编码
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Encoding&#160;t_Encoding&#160;=&#160;Encoding.GetEncoding(“GB2312“);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Uri&#160;t_Uri&#160;=&#160;new&#160;Uri(string.Format(“{0}?{1}“,&#160;pi_strPostURl,&#160;pi_strParm));
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;WebRequest&#160;t_WebRequest&#160;=
&#160;WebRequest.Create(t_Uri);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;t_WebRequest.Timeout&#160;=&#160;100000;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;t_WebRequest.ContentType&#160;=&#160;“application/x-www-form-urlencoded“;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;t_WebRequest.Method&#160;=&#160;EnumMethod.GET.ToString();&#160;&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;WebResponse&#160;t_WebResponse&#160;=
&#160;t_WebRequest.GetResponse();
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;using&#160;(StreamReader&#160;t_StreamReader&#160;=&#160;new&#160;StreamReader(t_WebResponse.GetResponseStream(),&#160;t_Encoding))
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;t_StreamReader.ReadToEnd();
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;catch&#160;(Exception&#160;e)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;e.ToString();
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
public&#160;static&#160;string&#160;AtionResponse(string&#160;pi_Url,&#160;EnumMethod&#160;pi_Method)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;string&#160;t_strUrlPath=“”;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;string&#160;t_parm&#160;=&#160;“”;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Uri&#160;&#160;t_Url&#160;=&#160;new&#160;Uri(pi_Url);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;t_parm=&#160;t_Url.Query;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if&#160;(parmString.StartsWith(“?“))
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;t_parm&#160;=&#160;t_parm.Remove(0,&#160;1);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;t_strUrlPath&#160;=&#160;“http://“&#160;+&#160;t_Url&#160;.Authority&#160;+&#160;t_Url&#160;.AbsolutePath;&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;GetResponse(t_strUrlPath,&#160;t_parm,&#160;pi_Method);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;public&#160;enum&#160;EnumMethod
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;POST,
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;GET
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;

本文地址：http://www.watch-life.net/aspnet/webresponse-cross-site-visit.html


	你可能也会喜欢以下文章：
	
	web developer tips (10):Visual Web Developer 2008中新的样式生成器 (0)
	英文阅读：如何成为更好的程序员 (1)
	备忘：base 标签和ShowModalDialog 、showModelessDialog (0)
	web developer tips (75):PostBack后保持滚动条的位置 (1)
	&#8220;Visual Studio 2008&#8243;背后的勃勃野心 (0)
	遍历页面上的所有控件 (0)
	web developer tips (15):在ASP.NET Ajax里使用跟踪 (0)
	web developer tips (30):在vs2008中Ajax Extender 控件UI与vs2005中差异 (0)


转载请注明作者，出处，以及原始超链接。评论数：1 &#124; 评论这篇文章&#124;关注作者最近动态,欢迎 follow me xjb@twitter.com&#124;联络作者：iamxjb@gmail.com© 2010 守望轩 www.watch-life.net]]></description>
			<content:encoded><![CDATA[<p>前两天，一个朋友让我帮他写这样一个程序：在asp.net里面访问asp的页面，把数据提交对方的数据库后，根据返回的值（返回值为：OK或ERROR），如果为OK再把填入本地数据库。当时，想当然，觉得很简单，用js的xmlhttp ，如果根据response 的值是“OK”就执行提交本地数据库。很快写完发过去，让朋友试试，一试发现不行，后来一问，原来是跨域访问，我给忽略了，于是让朋友把asp改成web service，可朋友说程序是合作公司做的，只会asp，不会用web service ，狂晕ing。没办法，只能请出asp.net的 <a href="http://msdn.microsoft.com/en-us/library/system.net.webresponse.aspx" target="_blank">WebResponse</a>了，很多网站采集程序都是用这个。第一版写完了，倒是可以跨域访问了，不过是乱码，调整有关编码的方式，终于可以了。这个应用虽小可是涉及的知识点不少：<br />
1、xmlhttp 不能跨域提交。<br />
当然XMLHttpRequest还是权宜的解决的方法，可以参考<a href="http://blog.joycode.com/saucer/Default.aspx" target="_blank">思归</a>写的一篇文章：<a href="http://blog.joycode.com/saucer/archive/2006/10/03/84572.aspx" target="_blank">http://blog.joycode.com/saucer/archive/2006/10/03/84572.aspx</a></p>
<p>2、<a href="http://www.watch-life.net/aspnet/webresponse-cross-site-visit.html">webresponse可以进行跨域访问</a>，不过要注意<br />
1）、get和post的区别。<br />
2）、注意Timeout的问题。</p>
<p>这些都是简单的程序，记下来备忘，高手就不必看了。</p>
<p>不废话了，下面是相关的c#代码：</p>
<div class="code"><span style="color: #000000"><br />
</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;summary&gt;</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;使用Post方法发送数据<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;/summary&gt;</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;param&nbsp;name=”pi_strPostURl”&gt;</span><span style="color: #008000">提交地址</span><span style="color: #808080">&lt;/param&gt;</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;param&nbsp;name=”pi_strParm”&gt;</span><span style="color: #008000">参数</span><span style="color: #808080">&lt;/param&gt;</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;returns&gt;&lt;/returns&gt;</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;PostResponse(</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;pi_strPostURl,&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;pi_strParm)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">编码</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Encoding&nbsp;t_Encoding&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Encoding.GetEncoding(“GB2312“);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uri&nbsp;t_Uri&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Uri(pi_strPostURl);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;paramBytes&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;t_Encoding.GetBytes(pi_strParm);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WebRequest&nbsp;t_WebRequest&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;WebRequest.Create(t_Uri);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t_WebRequest.Timeout&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">100000</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">设置ContentType</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t_WebRequest.ContentType&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;“application</span><span style="color: #000000">/</span><span style="color: #000000">x</span><span style="color: #000000">-</span><span style="color: #000000">www</span><span style="color: #000000">-</span><span style="color: #000000">form</span><span style="color: #000000">-</span><span style="color: #000000">urlencoded“;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t_WebRequest.Method&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;EnumMethod.POST.ToString();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">初始化</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;(Stream&nbsp;t_REStream&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;t_WebRequest.GetRequestStream())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">发送数据</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;requestStream.Write(paramBytes,&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000"><br />
,&nbsp;paramBytes.Length);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WebResponse&nbsp;t_WebResponse&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000"><br />
&nbsp;t_WebRequest.GetResponse();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;(StreamReader&nbsp;t_StreamReader&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;StreamReader(t_WebResponse&nbsp;.GetResponseStream(),&nbsp;t_Encoding))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;t_StreamReader.ReadToEnd();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;“ERROR“;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;GetResponse(</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;pi_strPostURl,&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;pi_strParm)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">编码</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Encoding&nbsp;t_Encoding&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Encoding.GetEncoding(“GB2312“);&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;Uri&nbsp;t_Uri&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Uri(</span><span style="color: #0000ff">string</span><span style="color: #000000">.Format(“{</span><span style="color: #800080">0</span><span style="color: #000000">}</span><span style="color: #000000">?</span><span style="color: #000000">{</span><span style="color: #800080">1</span><span style="color: #000000">}“,&nbsp;pi_strPostURl,&nbsp;pi_strParm));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WebRequest&nbsp;t_WebRequest&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000"><br />
&nbsp;WebRequest.Create(t_Uri);<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;t_WebRequest.Timeout&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">100000</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t_WebRequest.ContentType&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;“application</span><span style="color: #000000">/</span><span style="color: #000000">x</span><span style="color: #000000">-</span><span style="color: #000000">www</span><span style="color: #000000">-</span><span style="color: #000000">form</span><span style="color: #000000">-</span><span style="color: #000000">urlencoded“;<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;t_WebRequest.Method&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;EnumMethod.GET.ToString();&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WebResponse&nbsp;t_WebResponse&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000"><br />
&nbsp;t_WebRequest.GetResponse();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;(StreamReader&nbsp;t_StreamReader&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;StreamReader(t_WebResponse.GetResponseStream(),&nbsp;t_Encoding))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;t_StreamReader.ReadToEnd();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Exception&nbsp;e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;e.ToString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;AtionResponse(</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;pi_Url,&nbsp;EnumMethod&nbsp;pi_Method)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;t_strUrlPath</span><span style="color: #000000">=</span><span style="color: #000000">“”;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;t_parm&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&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;Uri&nbsp;&nbsp;t_Url&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Uri(pi_Url);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t_parm</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;t_Url.Query;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(parmString.StartsWith(“</span><span style="color: #000000">?</span><span style="color: #000000">“))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t_parm&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;t_parm.Remove(</span><span style="color: #800080">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t_strUrlPath&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;“http:</span><span style="color: #000000">//</span><span style="color: #000000">“&nbsp;+&nbsp;t_Url&nbsp;.Authority&nbsp;+&nbsp;t_Url&nbsp;.AbsolutePath;&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;GetResponse(t_strUrlPath,&nbsp;t_parm,&nbsp;pi_Method);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">enum</span><span style="color: #000000">&nbsp;EnumMethod<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;POST,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GET<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;<br />
</span></div>
<p>本文地址：<a href="http://www.watch-life.net/aspnet/webresponse-cross-site-visit.html">http://www.watch-life.net/aspnet/webresponse-cross-site-visit.html</a></p>
<p class="akst_link">
</p>
	<h4>你可能也会喜欢以下文章：</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.watch-life.net/visual-studio/visual-web-developer-2008-has-a-new-style-builder-dialog.html" title="web developer tips (10):Visual Web Developer 2008中新的样式生成器 (2009-06-23)">web developer tips (10):Visual Web Developer 2008中新的样式生成器</a> (0)</li>
	<li><a href="http://www.watch-life.net/programming-notes/read-how-to-be-a-better-developer.html" title="英文阅读：如何成为更好的程序员 (2008-02-17)">英文阅读：如何成为更好的程序员</a> (1)</li>
	<li><a href="http://www.watch-life.net/aspnet/html-base-showmodaldialog-notes.html" title="备忘：base 标签和ShowModalDialog 、showModelessDialog (2008-01-24)">备忘：base 标签和ShowModalDialog 、showModelessDialog</a> (0)</li>
	<li><a href="http://www.watch-life.net/visual-studio/maintain-scrollposition-after-post-back.html" title="web developer tips (75):PostBack后保持滚动条的位置 (2010-03-17)">web developer tips (75):PostBack后保持滚动条的位置</a> (1)</li>
	<li><a href="http://www.watch-life.net/it-review/visual-studio-2008-ambition.html" title="&#8220;Visual Studio 2008&#8243;背后的勃勃野心 (2008-02-10)">&#8220;Visual Studio 2008&#8243;背后的勃勃野心</a> (0)</li>
	<li><a href="http://www.watch-life.net/aspnet/ergodic-children-controls.html" title="遍历页面上的所有控件 (2007-11-20)">遍历页面上的所有控件</a> (0)</li>
	<li><a href="http://www.watch-life.net/visual-studio/use-tracing-with-asp-net-ajax.html" title="web developer tips (15):在ASP.NET Ajax里使用跟踪 (2009-07-02)">web developer tips (15):在ASP.NET Ajax里使用跟踪</a> (0)</li>
	<li><a href="http://www.watch-life.net/visual-studio/ajax-extender-controls-ui-behaves-differently-in-vs-2008-than-in-vs-2005.html" title="web developer tips (30):在vs2008中Ajax Extender 控件UI与vs2005中差异 (2009-07-27)">web developer tips (30):在vs2008中Ajax Extender 控件UI与vs2005中差异</a> (0)</li>
</ul>

转载请注明作者，出处，以及原始超链接。<br />评论数：1 | <b><a href='http://www.watch-life.net/aspnet/webresponse-cross-site-visit.html#comment'>评论这篇文章</a></b>|关注作者最近动态,欢迎 follow me <a href='https://twitter.com/xjb' target='_blank'>xjb@twitter.com</a>|联络作者：iamxjb@gmail.com<br/>© 2010 守望轩 <a href='http://www.watch-life.net/aspnet/webresponse-cross-site-visit.html'>www.watch-life.net</a>]]></content:encoded>
			<wfw:commentRss>http://www.watch-life.net/aspnet/webresponse-cross-site-visit.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>c#的细节(二)-修饰符</title>
		<link>http://www.watch-life.net/csharp/csharp-detail-modifiers.html</link>
		<comments>http://www.watch-life.net/csharp/csharp-detail-modifiers.html#comments</comments>
		<pubDate>Sat, 05 Jul 2008 16:44:12 +0000</pubDate>
		<dc:creator>xjb</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[修饰符]]></category>
		<category><![CDATA[细节]]></category>

		<guid isPermaLink="false">http://www.watch-life.net/?p=148</guid>
		<description><![CDATA[写在最前面的话：

《c#的细节》是我当初学习c#时候，做的一些学习笔记的整理，现在回头看来这些都是非常浅显的知识，是c#非常细节的地方，同时也是不能忽略的地方，”细节决定成败“，也许有些严重。我希望把这些整理出来，可以给初学者一个参考,也给自己一个温故知新的机会。高手就不必花时间来看了。;-)
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;
在c#的中修饰符的概念，最让初学者有些头痛了，理解起来也不是想象中那么简单，关键是不要搞乱了。
c#的修饰符大概分3类：
1、访问型修饰符，就是控制所修饰成员的可访问域，包括：public、private、protected、internal 和protected internal。其中只能protected internal 组合，其他都不能。
public：访问不受限制。
private：访问仅限于包含类型。只有包含该成员的类可以存取.
protected：访问仅限于包含类或从包含类派生的类型。只有包含该成员的类以及继承的类可以存取.
Internal：访问仅限于当前程序集。只有当前项目（工程）可以存取.
protected internal：访问仅限于当前程序集或从包含类派生的类型。
上面的概念好像很绕口。不过在如果你对面向对象大致了解的话，理解这些概念并不难，需要明确两个东东：程序集和项目。这里不详细讨论程序集和项目（如果你想全面了解有关程序集，项目，命名空间等东东，可以去看看这里），你可以大致理解，一个项目可以是一个程序集。
public、private、proteced我觉得非常比较好理解，麻烦点就是Internal，只能在一个项目中使用，不能跨项目调用，只能自己的项目内使用，即使是子类也不能访问。

namespace space1
{
    internal class Class1
    {
        public int a
    }

    class Class2
    {
        public void b()
      [...]]]></description>
			<content:encoded><![CDATA[<p>写在最前面的话：<br />
<span style="color: #0000ff;"><br />
《c#的细节》是我当初学习c#时候，做的一些学习笔记的整理，现在回头看来这些都是非常浅显的知识，是c#非常细节的地方，同时也是不能忽略的地方，”细节决定成败“，也许有些严重。我希望把这些整理出来，可以给初学者一个参考,也给自己一个温故知新的机会。高手就不必花时间来看了。;-)</span><br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
在c#的中<a href="http://www.watch-life.net/csharp/csharp-detail-modifiers.html">修饰符</a>的概念，最让初学者有些头痛了，理解起来也不是想象中那么简单，关键是不要搞乱了。</p>
<p>c#的修饰符大概分3类：</p>
<p>1、访问型修饰符，就是控制所修饰成员的可访问域，包括：public、private、protected、internal 和protected internal。其中只能protected internal 组合，其他都不能。</p>
<p>public：访问不受限制。<br />
private：访问仅限于包含类型。只有包含该成员的类可以存取.<br />
protected：访问仅限于包含类或从包含类派生的类型。只有包含该成员的类以及继承的类可以存取.<br />
Internal：访问仅限于当前程序集。只有当前项目（工程）可以存取.<br />
protected internal：访问仅限于当前程序集或从包含类派生的类型。</p>
<p>上面的概念好像很绕口。不过在如果你对面向对象大致了解的话，理解这些概念并不难，需要明确两个东东：程序集和项目。这里不详细讨论程序集和项目（如果你想全面了解有关程序集，项目，命名空间等东东，可以去看看<a href="http://www.cnblogs.com/wayfarer/archive/2006/04/07/369371.html">这里</a>），你可以大致理解，一个项目可以是一个程序集。</p>
<p>public、private、proteced我觉得非常比较好理解，麻烦点就是Internal，只能在一个项目中使用，不能跨项目调用，只能自己的项目内使用，即使是子类也不能访问。</p>
<blockquote>
<pre><span style="color: #0000ff;">namespace</span> space1
{
    <span style="color: #0000ff;">internal</span> <span style="color: #0000ff;">class</span> Class1
    {
        <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span> a
    }

    <span style="color: #0000ff;">class</span> Class2
    {
        <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> b()
        {
            Class1 cc = <span style="color: #0000ff;">new</span> Class1();
        }

    }
}

<span style="color: #0000ff;">namespace</span> space2
{
    <span style="color: #0000ff;">class</span> App
    {
      <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> Main(<span style="color: #0000ff;">string</span>[] args)
        {
           space1.Class1 t_xA = <span style="color: #0000ff;">new</span> space1.Class1();//error</pre>
<pre>        }
   }
 }</pre>
</blockquote>
<p>以上的代码表明，Internal 是不能跨项目访问的。</p>
<p>对于protected internal 简单些理解，就是protected 和internal 的并集。protected就只能被子类内部所访问，于是它们的并集就是：同一个项目内或者子类内部可以访问。如果既不是同一程序集也不是子类，就无法访问。如下面的代码所示：</p>
<blockquote>
<pre><span style="color: #0000ff;">namespace</span> space3
{
    <span style="color: #0000ff;">public</span>  <span style="color: #0000ff;">class</span> Class1
    {
       <span style="color: #0000ff;">internal</span>  <span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">int</span>  a;
        <span style="color: #0000ff;">internal</span> <span style="color: #0000ff;">int</span> b;
        <span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">int</span> c;
    }

    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> <span style="color: #0000ff;">class</span>2
    {
        <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span>  bbb()
        {
            Class1 t_x1=<span style="color: #0000ff;">new</span> Class1();
	   t_x1.a <span style="color: #008000;">//ok</span>
	   t_x1.b <span style="color: #008000;">//ok</span>
            t_x1.b  <span style="color: #008000;">//error</span>

        }
    }

    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> <span style="color: #0000ff;">class</span>3:Class1
    {
        <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> bbb()
        {
                 <span style="color: #0000ff;">base</span>.a...<span style="color: #008000;">//ok</span>
	        <span style="color: #0000ff;">base</span>.b...<span style="color: #008000;">//ok</span>
                 <span style="color: #0000ff;">base</span>.c ...<span style="color: #008000;">//ok</span>
        }
    }
}

<span style="color: #0000ff;">namespace</span> space4
{
    <span style="color: #0000ff;">class</span> Application1:space3.Class1
    {
      <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span>  a()
        {
            <span style="color: #0000ff;">base</span>.aa...
            <span style="color: #0000ff;">base</span>.cc...
        }
   }

    <span style="color: #0000ff;">class</span> bbb
    {
          <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span>  ccc()
        {
            space3..Class2 d = <span style="color: #0000ff;">new</span> space3.Class2();
            d.a.. <span style="color: #008000;">//error</span>
	   d.b...<span style="color: #008000;">//error</span>
            d.c... <span style="color: #008000;">//error</span>

        }

    }

 }</pre>
</blockquote>
<p>2、类修饰符：<br />
abstract:标识一个类只能作为其它类的基类.　　<br />
sealed:标识一个类不能被继承.<br />
partial ：局部类。将你的 class 分为多个部分，编译器会将多个部分拼合在一起。关于局部类部分你可以看看<a href="http://blog.csdn.net/SmartJavaer/archive/2006/10/12/1331151.aspx" target="_blank">这里</a></p>
<p>3、成员修饰符:<br />
　　<br />
　　abstract:指示该方法或属性没有实现.<br />
　　<br />
　　const:指定域或局部变量的值不能被改动.<br />
　　<br />
　　event:声明一个事件.<br />
　　<br />
　　extern:指示方法在外部实现.<br />
　　<br />
　　override:对由基类继承成员的新实现.<br />
　　<br />
　　readonly:指示一个域只能在声明时以及相同类的内部被赋值.<br />
　　<br />
　　static:指示一个成员属于类型本身,而不是属于特定的对象.<br />
　　<br />
　　virtual:指示一个方法或存取器的实现可以在继承类中被覆盖.</p>
<p>注意：1、命名空间不能使用访问修饰符。对命名空间没有访问是不受限制的，它的引入是主要是避免相同对象名的冲突。<br />
2、如果在成员声明中未指定访问修饰符，则使用默认的可访问性。</p>
<table id="table1" class="MsoNormalTable" style="width: 100%; border-collapse: collapse;" border="1" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td style="border: 1pt solid #dddddd; padding: 3.75pt; background-image: none; background-repeat: repeat; background-attachment: scroll; background-position: 0% 0%" valign="bottom">
<p class="MsoNormal" style="text-align: left; margin: 7.5pt 0cm" align="left"><strong><span style="font-size: 8.5pt; font-family: 宋体;">属于 </span></strong></p>
</td>
<td style="border-left: medium none #ece9d8; border-right: 1pt solid #dddddd; border-top: 1pt solid #dddddd; border-bottom: 1pt solid #dddddd; padding: 3.75pt; background-image: none; background-repeat: repeat; background-attachment: scroll; background-position: 0% 0%" valign="bottom">
<p class="MsoNormal" style="text-align: left; margin: 7.5pt 0cm" align="left"><strong><span style="font-size: 8.5pt; font-family: 宋体;">默认的成员可访问性 </span></strong></p>
</td>
<td style="border-left: medium none #ece9d8; border-right: 1pt solid #dddddd; border-top: 1pt solid #dddddd; border-bottom: 1pt solid #dddddd; padding: 3.75pt; background-image: none; background-repeat: repeat; background-attachment: scroll; background-position: 0% 0%" valign="bottom">
<p class="MsoNormal" style="text-align: left; margin: 7.5pt 0cm" align="left"><strong><span style="font-size: 8.5pt; font-family: 宋体;">该成员允许的声明的可访问性 </span><br />
</strong></p>
</td>
</tr>
<tr>
<td style="border-left: 1pt solid #dddddd; border-right: 1pt solid #dddddd; border-top: medium none #ece9d8; border-bottom: 1pt solid #dddddd; padding: 3.75pt; background: white" valign="top">
<p class="MsoNormal" style="text-align: left; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm; margin-bottom: 0pt" align="left"><strong><span style="font-size: 8.5pt; font-family: 宋体;">enum</span></strong><span style="font-size: 8.5pt; font-family: 宋体;"><br />
</span></p>
</td>
<td style="border-left: medium none #ece9d8; border-right: 1pt solid #dddddd; border-top: medium none #ece9d8; border-bottom: 1pt solid #dddddd; padding: 3.75pt; background: white" valign="top">
<p class="MsoNormal" style="text-align: left; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm; margin-bottom: 0pt" align="left"><strong><span style="font-size: 8.5pt; font-family: 宋体;">public</span></strong><span style="font-size: 8.5pt; font-family: 宋体;"><br />
</span></p>
</td>
<td style="border-left: medium none #ece9d8; border-right: 1pt solid #dddddd; border-top: medium none #ece9d8; border-bottom: 1pt solid #dddddd; padding: 3.75pt; background: white" valign="top">
<p class="MsoNormal" style="text-align: left; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm; margin-bottom: 0pt" align="left"><span style="font-size: 8.5pt; font-family: 宋体;">无</span></p>
</td>
</tr>
<tr>
<td style="border-left: 1pt solid #dddddd; border-right: 1pt solid #dddddd; border-top: medium none #ece9d8; border-bottom: 1pt solid #dddddd; padding: 3.75pt; background: white" valign="top">
<p class="MsoNormal" style="text-align: left; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm; margin-bottom: 0pt" align="left"><strong><span style="font-size: 8.5pt; font-family: 宋体;">class</span></strong><span style="font-size: 8.5pt; font-family: 宋体;"><br />
</span></p>
</td>
<td style="border-left: medium none #ece9d8; border-right: 1pt solid #dddddd; border-top: medium none #ece9d8; border-bottom: 1pt solid #dddddd; padding: 3.75pt; background: white" valign="top">
<p class="MsoNormal" style="text-align: left; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm; margin-bottom: 0pt" align="left"><strong><span style="font-size: 8.5pt; font-family: 宋体;">private</span></strong><span style="font-size: 8.5pt; font-family: 宋体;"><br />
</span></p>
</td>
<td style="border-left: medium none #ece9d8; border-right: 1pt solid #dddddd; border-top: medium none #ece9d8; border-bottom: 1pt solid #dddddd; padding: 3.75pt; background: white" valign="top">
<p class="MsoNormal" style="text-align: left; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm; margin-bottom: 0pt" align="left"><strong><span style="font-size: 8.5pt; font-family: 宋体;">public</span></strong><span style="font-size: 8.5pt; font-family: 宋体;"><br />
</span></p>
<p class="MsoNormal" style="text-align: left; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm; margin-bottom: 0pt" align="left"><strong><span style="font-size: 8.5pt; font-family: 宋体;"><br />
protected</span></strong><span style="font-size: 8.5pt; font-family: 宋体;"><br />
</span></p>
<p class="MsoNormal" style="text-align: left; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm; margin-bottom: 0pt" align="left"><strong><span style="font-size: 8.5pt; font-family: 宋体;">internal</span></strong><span style="font-size: 8.5pt; font-family: 宋体;"><br />
</span></p>
<p class="MsoNormal" style="text-align: left; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm; margin-bottom: 0pt" align="left"><strong><span style="font-size: 8.5pt; font-family: 宋体;">private</span></strong><span style="font-size: 8.5pt; font-family: 宋体;"><br />
</span></p>
<p class="MsoNormal" style="text-align: left; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm; margin-bottom: 0pt" align="left"><strong><span style="font-size: 8.5pt; font-family: 宋体;"><br />
protected</span></strong><span style="font-size: 8.5pt; font-family: 宋体;"><br />
<strong>internal</strong> </span></p>
</td>
</tr>
<tr>
<td style="border-left: 1pt solid #dddddd; border-right: 1pt solid #dddddd; border-top: medium none #ece9d8; border-bottom: 1pt solid #dddddd; padding: 3.75pt; background: white" valign="top">
<p class="MsoNormal" style="text-align: left; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm; margin-bottom: 0pt" align="left"><strong><span style="font-size: 8.5pt; font-family: 宋体;"><br />
interface</span></strong><span style="font-size: 8.5pt; font-family: 宋体;"><br />
</span></p>
</td>
<td style="border-left: medium none #ece9d8; border-right: 1pt solid #dddddd; border-top: medium none #ece9d8; border-bottom: 1pt solid #dddddd; padding: 3.75pt; background: white" valign="top">
<p class="MsoNormal" style="text-align: left; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm; margin-bottom: 0pt" align="left"><strong><span style="font-size: 8.5pt; font-family: 宋体;">public</span></strong><span style="font-size: 8.5pt; font-family: 宋体;"><br />
</span></p>
</td>
<td style="border-left: medium none #ece9d8; border-right: 1pt solid #dddddd; border-top: medium none #ece9d8; border-bottom: 1pt solid #dddddd; padding: 3.75pt; background: white" valign="top">
<p class="MsoNormal" style="text-align: left; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm; margin-bottom: 0pt" align="left"><span style="font-size: 8.5pt; font-family: 宋体;">无</span></p>
</td>
</tr>
<tr>
<td style="border-left: 1pt solid #dddddd; border-right: 1pt solid #dddddd; border-top: medium none #ece9d8; border-bottom: 1pt solid #dddddd; padding: 3.75pt; background: white" valign="top">
<p class="MsoNormal" style="text-align: left; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm; margin-bottom: 0pt" align="left"><strong><span style="font-size: 8.5pt; font-family: 宋体;">struct</span></strong><span style="font-size: 8.5pt; font-family: 宋体;"><br />
</span></p>
</td>
<td style="border-left: medium none #ece9d8; border-right: 1pt solid #dddddd; border-top: medium none #ece9d8; border-bottom: 1pt solid #dddddd; padding: 3.75pt; background: white" valign="top">
<p class="MsoNormal" style="text-align: left; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm; margin-bottom: 0pt" align="left"><strong><span style="font-size: 8.5pt; font-family: 宋体;">private</span></strong><span style="font-size: 8.5pt; font-family: 宋体;"><br />
</span></p>
</td>
<td style="border-left: medium none #ece9d8; border-right: 1pt solid #dddddd; border-top: medium none #ece9d8; border-bottom: 1pt solid #dddddd; padding: 3.75pt; background: white" valign="top">
<p class="MsoNormal" style="text-align: left; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm; margin-bottom: 0pt" align="left"><strong><span style="font-size: 8.5pt; font-family: 宋体;">public</span></strong><span style="font-size: 8.5pt; font-family: 宋体;"><br />
</span></p>
<p class="MsoNormal" style="text-align: left; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm; margin-bottom: 0pt" align="left"><strong><span style="font-size: 8.5pt; font-family: 宋体;">internal</span></strong><span style="font-size: 8.5pt; font-family: 宋体;"><br />
</span></p>
<p class="MsoNormal" style="text-align: left; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm; margin-bottom: 0pt" align="left"><strong><span style="font-size: 8.5pt; font-family: 宋体;">private</span></strong><span style="font-size: 8.5pt; font-family: 宋体;"><br />
</span></p>
</td>
</tr>
</tbody>
</table>
<p>本文地址：<a href="http://www.watch-life.net/csharp/csharp-detail-modifiers.html">http://www.watch-life.net/csharp/csharp-detail-modifiers.html</a></p>
<p class="akst_link">
</p>
	<h4>你可能也会喜欢以下文章：</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.watch-life.net/aspnet/webresponse-cross-site-visit.html" title="WebResponse 跨域访问 (2008-07-07)">WebResponse 跨域访问</a> (1)</li>
	<li><a href="http://www.watch-life.net/visual-studio/have-c-and-vb-net-files-inside-your-app-code-directory.html" title="web developer tips (26):在 App_Code目录下同时放c#和VB.NET文件 (2009-07-19)">web developer tips (26):在 App_Code目录下同时放c#和VB.NET文件</a> (0)</li>
	<li><a href="http://www.watch-life.net/csharp/csharp-detail-modifiers-as-is.html" title="c#细节(三)-AS和IS (2008-07-07)">c#细节(三)-AS和IS</a> (0)</li>
	<li><a href="http://www.watch-life.net/life-thinking/work-and-life.html" title="求职与做人 (2008-10-30)">求职与做人</a> (6)</li>
	<li><a href="http://www.watch-life.net/technology-book-review/programming-csharp-bookreview.html" title="温故知新的经典&#8211;书评《Programming C# 》中文版第4版 (2007-10-30)">温故知新的经典&#8211;书评《Programming C# 》中文版第4版</a> (1)</li>
	<li><a href="http://www.watch-life.net/csharp/csharp-detail-property-attribute.html" title="c#细节&#8211;Property和Attribute迷局 (2008-07-17)">c#细节&#8211;Property和Attribute迷局</a> (1)</li>
	<li><a href="http://www.watch-life.net/programming-notes/html-table-2-excel.html" title="html页面表格导出到excel总结 (2008-06-23)">html页面表格导出到excel总结</a> (3)</li>
	<li><a href="http://www.watch-life.net/net-tip/sqlite-encrypted.html" title="Sqlite数据库的加密 (2008-07-25)">Sqlite数据库的加密</a> (0)</li>
</ul>

转载请注明作者，出处，以及原始超链接。<br />评论数：0 | <b><a href='http://www.watch-life.net/csharp/csharp-detail-modifiers.html#comment'>评论这篇文章</a></b>|关注作者最近动态,欢迎 follow me <a href='https://twitter.com/xjb' target='_blank'>xjb@twitter.com</a>|联络作者：iamxjb@gmail.com<br/>© 2010 守望轩 <a href='http://www.watch-life.net/csharp/csharp-detail-modifiers.html'>www.watch-life.net</a>]]></content:encoded>
			<wfw:commentRss>http://www.watch-life.net/csharp/csharp-detail-modifiers.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>c#的细节(一)-问号的细节</title>
		<link>http://www.watch-life.net/csharp/csharp-detail-question-marks.html</link>
		<comments>http://www.watch-life.net/csharp/csharp-detail-question-marks.html#comments</comments>
		<pubDate>Wed, 02 Jul 2008 16:40:37 +0000</pubDate>
		<dc:creator>xjb</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[细节]]></category>
		<category><![CDATA[问号]]></category>

		<guid isPermaLink="false">http://www.watch-life.net/?p=145</guid>
		<description><![CDATA[写在最前面的话：
《c#的细节》是我当初学习c#时候，做的一些学习笔记的整理，现在回头看来这些都是非常浅显的知识，是c#非常细节的地方，同时也是不能忽略的地方，”细节决定成败“，也许有些严重。我希望把这些整理出来，可以给初学者一个参考,也给自己一个温故知新的机会。高手就不必花时间来看了。;-)
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-
我想你一定写过下面这样类似的代码：

string strParam = Request.Params["param"];
if ( strParam== null )
{
    strParam= "";
}

或者这样的代码：

string strParam=
  Request.Params["param"] == null ? "": Request.Params["param"];

你发现，尽管实现的同一个功能，但第二段代码要比第一段代码是不是更简洁。这里的” ？：“就是一个三元的操作符。利用这个三元操作符也称条件操作符，就很简单的把一个if语句给实现了。
在使用条件操作符的时候要注意，假定条件表达式是这样 x？y：z，表达式类型的只能是使y 和z的变量类型之一，换句话说就是
y和z的变量类型决定这个条件表达式的类型，无论y和z是同一类型，还是y和z不是同一类型。
如果表达式的类型和赋值类型不一致，发生编译时错误 ，例如：如果你想实现如下代码：

string strTemp ;
object obj;
....

if(strTemp ==  "")
          obj   =   DBNull.Value;
  else
       [...]]]></description>
			<content:encoded><![CDATA[<p>写在最前面的话：</p>
<p><strong><span style="color: #0000ff;">《c#的细节》是我当初学习c#时候，做的一些学习笔记的整理，现在回头看来这些都是非常浅显的知识，是c#非常细节的地方，同时也是不能忽略的地方，”细节决定成败“，也许有些严重。我希望把这些整理出来，可以给初学者一个参考,也给自己一个温故知新的机会。高手就不必花时间来看了。;-)</span></strong><br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>我想你一定写过下面这样类似的代码：</p>
<blockquote>
<pre><span style="color: #0000ff;">string</span> strParam = Request.Params["<span style="color: #8b0000;">param</span>"];
<span style="color: #0000ff;">if</span> ( strParam== <span style="color: #0000ff;">null</span> )
{
    strParam= "";
}</pre>
</blockquote>
<p>或者这样的代码：</p>
<blockquote>
<pre><span style="color: #0000ff;">string</span> strParam=</pre>
<pre>  Request.Params["<span style="color: #8b0000;">param</span>"] == <span style="color: #0000ff;">null</span> ? "": Request.Params["<span style="color: #8b0000;">param</span>"];</pre>
</blockquote>
<p>你发现，尽管实现的同一个功能，但第二段代码要比第一段代码是不是更简洁。这里的” <span style="color: #ff0000;">？：</span>“就是一个三元的操作符。利用这个三元操作符也称条件操作符，就很简单的把一个if语句给实现了。</p>
<p>在使用条件操作符的时候要注意，假定条件表达式是这样 x？y：z，表达式类型的只能是使y 和z的变量类型之一，换句话说就是<br />
y和z的变量类型决定这个条件表达式的类型，无论y和z是同一类型，还是y和z不是同一类型。<br />
如果表达式的类型和赋值类型不一致，发生编译时错误 ，例如：如果你想实现如下代码：</p>
<blockquote>
<pre><span style="color: #0000ff;">string</span> strTemp ;
<span style="color: #0000ff;">object</span> obj;
....

<span style="color: #0000ff;">if</span>(strTemp ==  "")
          obj   =   DBNull.Value;
  <span style="color: #0000ff;">else</span>
          obj   =   strTemp ;</pre>
</blockquote>
<p>然后为了简单，改成下面这种形式：</p>
<blockquote>
<pre><span style="color: #0000ff;">string</span> strTemp;
<span style="color: #0000ff;">object</span> obj = strTemp == ""?DBNull.Value:strTemp;</pre>
</blockquote>
<p>你编译的时候，会报错。因为DBNull和string之间没隐式转换，修改成如下代码就可以了：</p>
<blockquote>
<pre><span style="color: #0000ff;">object</span> obj = strTemp == ""? DBNull.Value: (<span style="color: #0000ff;">object</span>)strTemp;</pre>
</blockquote>
<p>另外条件操作符是向右关联的，从左到右进行计算，于是a?b:c?d:e 应理解为 a?b:(c?d:e)。</p>
<p>上面提到了DBNull，在c#2.0里面实现了Nullable数据类型，别小看这个数据类型，其实非常有用，从此我们就可以放弃对object数据进行 if（object==null）这样的判断了。同时你会发现，在数据库应用上，数据库中有的字段允许取空值，在C#世界中引入nullable类型正好与之对应，，从（C#）对象映射到关系数据库对象，或者反过来，转换都是比较平滑。如果你想进一步了解Nullable数据类型可以去查msdn(ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.en/cpref2/html/T_System_Nullable.htm) 或者去<a href="http://msdn.microsoft.com/en-us/vcsharp/aa336809.aspx" target="_blank">这里</a>看看. 为了实现Nullable数据类型转换成non-Nullable型数据，就有了一个这样的操作符”<span style="color: #ff0000;">？？</span>（两个问号）“，双问号操作符意思是取所赋值??左边的，如果左边为null，取所赋值??右边的，比如int y = x ?? -1 如果x为空，那么y的值为-1.</p>
<p>于是这时候就可以把最上面第二段代码改成：</p>
<blockquote>
<pre><span style="color: #0000ff;">string</span> strParam= Request.Params["<span style="color: #8b0000;">param</span>"]?? "";</pre>
</blockquote>
<p>嘿嘿，是不是更简洁了。</p>
<p>另外还有”<span style="color: #ff0000;">？</span>（单问号）“修饰符，是System.Nullable&lt;T&gt;的缩写形式，比如int?代表是可空的整形，例如：int? a = 1 或者 int? b=null。Nullable类型具有一个HasValue的bool类型只读属性，当Nullable类型实例的该属性为true时，则表示该实例是非空实例，包含一个已知值Value，HasValue为false时，访问Value属性将导致System.InvalidOperationException。</p>
<p>怎么样？这里有关“？”号的细节，就不单单关注<a href="http://www.watch-life.net/csharp/csharp-detail-question-marks.html">问号</a>本身了</p>
<p> </p>
<p>本文地址：<a href="http://www.watch-life.net/csharp/csharp-detail-question-marks.html">http://www.watch-life.net/csharp/csharp-detail-question-marks.html</a></p>
<p class="akst_link">
</p>
	<h4>你可能也会喜欢以下文章：</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.watch-life.net/net-tip/sqlite-encrypted.html" title="Sqlite数据库的加密 (2008-07-25)">Sqlite数据库的加密</a> (0)</li>
	<li><a href="http://www.watch-life.net/visual-studio/have-c-and-vb-net-files-inside-your-app-code-directory.html" title="web developer tips (26):在 App_Code目录下同时放c#和VB.NET文件 (2009-07-19)">web developer tips (26):在 App_Code目录下同时放c#和VB.NET文件</a> (0)</li>
	<li><a href="http://www.watch-life.net/life-thinking/work-and-life.html" title="求职与做人 (2008-10-30)">求职与做人</a> (6)</li>
	<li><a href="http://www.watch-life.net/csharp/csharp-detail-modifiers-as-is.html" title="c#细节(三)-AS和IS (2008-07-07)">c#细节(三)-AS和IS</a> (0)</li>
	<li><a href="http://www.watch-life.net/programming-notes/html-table-2-excel.html" title="html页面表格导出到excel总结 (2008-06-23)">html页面表格导出到excel总结</a> (3)</li>
	<li><a href="http://www.watch-life.net/technology-book-review/programming-csharp-bookreview.html" title="温故知新的经典&#8211;书评《Programming C# 》中文版第4版 (2007-10-30)">温故知新的经典&#8211;书评《Programming C# 》中文版第4版</a> (1)</li>
	<li><a href="http://www.watch-life.net/csharp/csharp-detail-modifiers.html" title="c#的细节(二)-修饰符 (2008-07-06)">c#的细节(二)-修饰符</a> (0)</li>
	<li><a href="http://www.watch-life.net/aspnet/webresponse-cross-site-visit.html" title="WebResponse 跨域访问 (2008-07-07)">WebResponse 跨域访问</a> (1)</li>
</ul>

转载请注明作者，出处，以及原始超链接。<br />评论数：0 | <b><a href='http://www.watch-life.net/csharp/csharp-detail-question-marks.html#comment'>评论这篇文章</a></b>|关注作者最近动态,欢迎 follow me <a href='https://twitter.com/xjb' target='_blank'>xjb@twitter.com</a>|联络作者：iamxjb@gmail.com<br/>© 2010 守望轩 <a href='http://www.watch-life.net/csharp/csharp-detail-question-marks.html'>www.watch-life.net</a>]]></content:encoded>
			<wfw:commentRss>http://www.watch-life.net/csharp/csharp-detail-question-marks.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>html页面表格导出到excel总结</title>
		<link>http://www.watch-life.net/programming-notes/html-table-2-excel.html</link>
		<comments>http://www.watch-life.net/programming-notes/html-table-2-excel.html#comments</comments>
		<pubDate>Mon, 23 Jun 2008 14:13:12 +0000</pubDate>
		<dc:creator>xjb</dc:creator>
				<category><![CDATA[编程札记]]></category>
		<category><![CDATA[Asp.net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[excel]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[导出]]></category>
		<category><![CDATA[表格]]></category>

		<guid isPermaLink="false">http://www.watch-life.net/?p=140</guid>
		<description><![CDATA[最近一个项目需要把报表的表格导入excel，在网上找了一些方法，比较研究了一下，记在这里，备忘。
表格例子如下：
&#60;table id="tableExcel" width="100%" border="1" cellspacing="0" cellpadding="0"&#62;
    &#60;tr&#62;
        &#60;td colspan="5" align="center"&#62;html 表格导出道Excel&#60;/td&#62;
    &#60;/tr&#62;
    &#60;tr&#62;
        &#60;td&#62;列标题1&#60;/td&#62;
        &#60;td&#62;列标题2&#60;/td&#62;
        &#60;td&#62;类标题3&#60;/td&#62;
   [...]]]></description>
			<content:encoded><![CDATA[<p>最近一个项目需要把报表的<a href="http://www.watch-life.net/programming-notes/html-table-2-excel.html">表格导入excel</a>，在网上找了一些方法，比较研究了一下，记在这里，备忘。</p>
<p>表格例子如下：</p>
<pre><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">table</span> <span style="color: #ff0000;">id</span>=<span style="color: #0000ff;">"tableExcel"</span> <span style="color: #ff0000;">width</span>=<span style="color: #0000ff;">"100%"</span> <span style="color: #ff0000;">border</span>=<span style="color: #0000ff;">"1"</span> <span style="color: #ff0000;">cellspacing</span>=<span style="color: #0000ff;">"0"</span> <span style="color: #ff0000;">cellpadding</span>=<span style="color: #0000ff;">"0"</span><span style="color: #0000ff;">&gt;</span>
    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">tr</span><span style="color: #0000ff;">&gt;</span>
        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">td</span> <span style="color: #ff0000;">colspan</span>=<span style="color: #0000ff;">"5"</span> <span style="color: #ff0000;">align</span>=<span style="color: #0000ff;">"center"</span><span style="color: #0000ff;">&gt;html 表格导出道Excel</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span>
    <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">tr</span><span style="color: #0000ff;">&gt;</span>
    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">tr</span><span style="color: #0000ff;">&gt;</span>
        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;列标题1</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span>
        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;列标题2</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span>
        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;类标题3</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span>
        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;列标题4</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span>
        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;列标题5</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span>
    <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">tr</span><span style="color: #0000ff;">&gt;</span>
    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">tr</span><span style="color: #0000ff;">&gt;</span>
        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span>aaa<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span>
        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span>bbb<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span>
        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span>ccc<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span>
        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span>ddd<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span>
        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span>eee<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span>
    <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">tr</span><span style="color: #0000ff;">&gt;</span>
    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">tr</span><span style="color: #0000ff;">&gt;</span>
        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span>AAA<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span>
        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span>BBB<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span>
        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span>CCC<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span>
        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span>DDD<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span>
        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span>EEE<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span>
    <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">tr</span><span style="color: #0000ff;">&gt;</span>
    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">tr</span><span style="color: #0000ff;">&gt;</span>
        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span>FFF<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span>
        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span>GGG<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span>
        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span>HHH<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span>
        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span>III<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span>
        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span>JJJ<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span>
   <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">tr</span><span style="color: #0000ff;">&gt;</span>
<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">table</span><span style="color: #0000ff;">&gt;</span></pre>
<p> </p>
<p><strong>1、js的方法</strong></p>
<p>A、将整个表格拷贝到EXCEL中</p>
<pre><span style="color: #0000ff;">function</span> method1(tableid) {

    <span style="color: #0000ff;">var</span> curTbl = <span style="color: #0000ff;">document</span>.getElementById(tableid);
    <span style="color: #0000ff;">var</span> oXL = <span style="color: #0000ff;">new</span> ActiveXObject("<span style="color: #8b0000;">Excel.Application</span>");
    <span style="color: #0000ff;">var</span> oWB = oXL.Workbooks.Add();
    <span style="color: #0000ff;">var</span> oSheet = oWB.ActiveSheet;
    <span style="color: #0000ff;">var</span> sel = <span style="color: #0000ff;">document</span>.body.createTextRange();
    sel.moveToElementText(curTbl);
    sel.select();
    sel.execCommand("<span style="color: #8b0000;">Copy</span>");
    oSheet.Paste();
    oXL.Visible = <span style="color: #0000ff;">true</span>;

}</pre>
<p> B、读取表格中每个单元到EXCEL中：</p>
<pre>function method2(tableid)
{

    var curTbl = document.getElementById(tableid);
    var oXL = <span style="color: #0000ff;">new</span> ActiveXObject("<span style="color: #8b0000;">Excel.Application</span>");
    var oWB = oXL.Workbooks.Add();
    var oSheet = oWB.ActiveSheet;
    var Lenr = curTbl.rows.length;
    <span style="color: #0000ff;">for</span> (i = 0; i &lt; Lenr; i++)
    {</pre>
<pre>        var Lenc = curTbl.rows(i).cells.length;
        <span style="color: #0000ff;">for</span> (j = 0; j &lt; Lenc; j++)
        {
            oSheet.Cells(i + 1, j + 1).<span style="color: #0000ff;">value</span> = curTbl.rows(i).cells(j).innerText;

        }

    }
    oXL.Visible = <span style="color: #0000ff;">true</span>;
}</pre>
<p> c、把表格输出到另一个页面，然后存成cvs格式</p>
<p> </p>
<pre><span style="color: #0000ff;">function</span> getXlsFromTbl(inTblId, inWindow)</pre>
<pre>{

    <span style="color: #0000ff;">try</span> {
        <span style="color: #0000ff;">var</span> allStr = "";
        <span style="color: #0000ff;">var</span> curStr = "";
        <span style="color: #0000ff;">if</span> (inTblId != <span style="color: #0000ff;">null</span> &amp;&amp; inTblId != "" &amp;&amp; inTblId != "<span style="color: #8b0000;">null</span>") {

            curStr = getTblData(inTblId, inWindow);

        }
        <span style="color: #0000ff;">if</span> (curStr != <span style="color: #0000ff;">null</span>) {
            allStr += curStr;
        }

        <span style="color: #0000ff;">else</span> {

            <span style="color: #0000ff;">alert</span>("你要导出的表不存在");
            <span style="color: #0000ff;">return</span>;
        }
        <span style="color: #0000ff;">var</span> fileName = getExcelFileName();
        doFileExport(fileName, allStr);

    }

    <span style="color: #0000ff;">catch</span>(e) {

        <span style="color: #0000ff;">alert</span>("导出发生异常<span style="color: #8b0000;">:</span>" + e.<span style="color: #0000ff;">name</span> + "<span style="color: #8b0000;">-&gt;</span>" + e.description + "<span style="color: #8b0000;">!</span>");

    }

}

<span style="color: #0000ff;">function</span> getTblData(inTbl, inWindow) {

    <span style="color: #0000ff;">var</span> rows = 0;
    <span style="color: #0000ff;">var</span> tblDocument = <span style="color: #0000ff;">document</span>;
    <span style="color: #0000ff;">if</span> (!!inWindow &amp;&amp; inWindow != "") {

        <span style="color: #0000ff;">if</span> (!<span style="color: #0000ff;">document</span>.all(inWindow)) {
            <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">null</span>;
        }

        <span style="color: #0000ff;">else</span> {
            tblDocument = <span style="color: #0000ff;">eval</span>(inWindow).<span style="color: #0000ff;">document</span>;
        }

    }

    <span style="color: #0000ff;">var</span> curTbl = tblDocument.getElementById(inTbl);
    <span style="color: #0000ff;">var</span> outStr = "";
    <span style="color: #0000ff;">if</span> (curTbl != <span style="color: #0000ff;">null</span>) {
        <span style="color: #0000ff;">for</span> (<span style="color: #0000ff;">var</span> j = 0; j &lt; curTbl.rows.<span style="color: #0000ff;">length</span>; j++) {
            <span style="color: #0000ff;">for</span> (<span style="color: #0000ff;">var</span> i = 0; i &lt; curTbl.rows[j].cells.<span style="color: #0000ff;">length</span>; i++) {

                <span style="color: #0000ff;">if</span> (i == 0 &amp;&amp; rows &gt; 0) {
                    outStr += "<span style="color: #8b0000;"> \t</span>";
                    rows -= 1;
                }

                outStr += curTbl.rows[j].cells[i].innerText + "<span style="color: #8b0000;">\t</span>";
                <span style="color: #0000ff;">if</span> (curTbl.rows[j].cells[i].colSpan &gt; 1) {
                    <span style="color: #0000ff;">for</span> (<span style="color: #0000ff;">var</span> k = 0; k &lt; curTbl.rows[j].cells[i].colSpan - 1; k++) {
                        outStr += "<span style="color: #8b0000;"> \t</span>";
                    }
                }
                <span style="color: #0000ff;">if</span> (i == 0) {
                    <span style="color: #0000ff;">if</span> (rows == 0 &amp;&amp; curTbl.rows[j].cells[i].rowSpan &gt; 1) {
                        rows = curTbl.rows[j].cells[i].rowSpan - 1;
                    }
                }
            }
            outStr += "<span style="color: #8b0000;">\r\n</span>";
        }
    }

    <span style="color: #0000ff;">else</span> {
        outStr = <span style="color: #0000ff;">null</span>;
        <span style="color: #0000ff;">alert</span>(inTbl + "不存在 <span style="color: #8b0000;">!</span>");
    }
    <span style="color: #0000ff;">return</span> outStr;
}

<span style="color: #0000ff;">function</span> getExcelFileName() {
    <span style="color: #0000ff;">var</span> d = <span style="color: #0000ff;">new</span> <span style="color: #0000ff;">Date</span>();
    <span style="color: #0000ff;">var</span> curYear = d.getYear();
    <span style="color: #0000ff;">var</span> curMonth = "" + (d.getMonth() + 1);
    <span style="color: #0000ff;">var</span> curDate = "" + d.getDate();
    <span style="color: #0000ff;">var</span> curHour = "" + d.getHours();
    <span style="color: #0000ff;">var</span> curMinute = "" + d.getMinutes();
    <span style="color: #0000ff;">var</span> curSecond = "" + d.getSeconds();
    <span style="color: #0000ff;">if</span> (curMonth.<span style="color: #0000ff;">length</span> == 1) {
        curMonth = "<span style="color: #8b0000;">0</span>" + curMonth;
    }

    <span style="color: #0000ff;">if</span> (curDate.<span style="color: #0000ff;">length</span> == 1) {
        curDate = "<span style="color: #8b0000;">0</span>" + curDate;
    }

    <span style="color: #0000ff;">if</span> (curHour.<span style="color: #0000ff;">length</span> == 1) {
        curHour = "<span style="color: #8b0000;">0</span>" + curHour;
    }

    <span style="color: #0000ff;">if</span> (curMinute.<span style="color: #0000ff;">length</span> == 1) {
        curMinute = "<span style="color: #8b0000;">0</span>" + curMinute;
    }

    <span style="color: #0000ff;">if</span> (curSecond.<span style="color: #0000ff;">length</span> == 1) {
        curSecond = "<span style="color: #8b0000;">0</span>" + curSecond;
    }
    <span style="color: #0000ff;">var</span> fileName = "<span style="color: #8b0000;">table</span>" + "<span style="color: #8b0000;">_</span>" + curYear + curMonth + curDate + "<span style="color: #8b0000;">_</span>"
            + curHour + curMinute + curSecond + "<span style="color: #8b0000;">.csv</span>";
    <span style="color: #0000ff;">return</span> fileName;

}

<span style="color: #0000ff;">function</span> doFileExport(inName, inStr) {
    <span style="color: #0000ff;">var</span> xlsWin = <span style="color: #0000ff;">null</span>;
    <span style="color: #0000ff;">if</span> (!!<span style="color: #0000ff;">document</span>.all("<span style="color: #8b0000;">glbHideFrm</span>")) {
        xlsWin = glbHideFrm;
    }
    <span style="color: #0000ff;">else</span> {
        <span style="color: #0000ff;">var</span> width = 6;
        <span style="color: #0000ff;">var</span> height = 4;
       <span style="color: #0000ff;">var</span> openPara = "<span style="color: #8b0000;">left=</span>" + (<span style="color: #0000ff;">window</span>.screen.width / 2 - width / 2)
                + "<span style="color: #8b0000;">,top=</span>" + (<span style="color: #0000ff;">window</span>.screen.height / 2 - height / 2)
                + "<span style="color: #8b0000;">,scrollbars=no,width=</span>" + width + "<span style="color: #8b0000;">,height=</span>" + height;
        xlsWin = <span style="color: #0000ff;">window</span>.<span style="color: #0000ff;">open</span>("", "<span style="color: #8b0000;">_blank</span>", openPara);
    }
    xlsWin.<span style="color: #0000ff;">document</span>.write(inStr);
    xlsWin.<span style="color: #0000ff;">document</span>.<span style="color: #0000ff;">close</span>();
    xlsWin.<span style="color: #0000ff;">document</span>.execCommand('Saveas', <span style="color: #0000ff;">true</span>, inName);
    xlsWin.<span style="color: #0000ff;">close</span>();

}</pre>
<p> <strong>总结：比较上面3种方法，感觉第一种方法比较完美一些，因为这种方法比较完整的输出表格的格式。但，第一和第二种方法都用了ActiveX 对象，对客户端的安全有要求，而且最大的问题还有一个，就是excel 对象无法关闭。第3中方法虽然没有用ActiveX 对象，但是用了弹出窗口输出， 如果禁止了弹出窗口则无法使用。</strong></p>
<p>对于execl 对象无法关闭的问题，下面的方法是一个权宜方法：</p>
<pre><span style="color: #0000ff;">function</span> Cleanup() {
    <span style="color: #0000ff;">window</span>.<span style="color: #0000ff;">clearInterval</span>(idTmr);
    CollectGarbage();
  }</pre>
<p> 调用方法：</p>
<pre>idTmr = <span style="color: #0000ff;">window</span>.<span style="color: #0000ff;">setInterval</span>("<span style="color: #8b0000;">Cleanup();</span>",1);</pre>
<pre><strong>2、<a href="http://www.watch-life.net/category/aspnet" target="_blank">Asp.net</a>(c#)中的方法</strong></pre>
<pre>这种方法其实类似上面的js的第3中方法(也可以在其他的web脚本来实现，比如asp中vbscript，或者php)，把表格用文件流的方式</pre>
<pre>输出为excel。实例代码如下：</pre>
<pre><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> OutPutExcel(<span style="color: #0000ff;">string</span> title)
    {

        Response.Clear();
        Response.Buffer = <span style="color: #0000ff;">true</span>;
        Response.Charset = "<span style="color: #8b0000;">utf-8</span>";

        Response.AddHeader("<span style="color: #8b0000;">Content-Disposition</span>", "<span style="color: #8b0000;">attachment;filename=</span>" + HttpUtility.UrlEncode(title + "<span style="color: #8b0000;">.xls</span>"));
        Response.ContentEncoding = System.Text.Encoding.GetEncoding("<span style="color: #8b0000;">utf-8</span>");

        Response.ContentType = "<span style="color: #8b0000;">application/ms-excel</span>";
        Page.EnableViewState = <span style="color: #0000ff;">false</span>;

        System.IO.StringWriter oStringWriter = <span style="color: #0000ff;">new</span> System.IO.StringWriter();
        System.Web.UI.HtmlTextWriter oHtmlTextWriter = <span style="color: #0000ff;">new</span> System.Web.UI.HtmlTextWriter(oStringWriter);

        <span style="color: #0000ff;">this</span>.Page.RenderControl(oHtmlTextWriter);

        <span style="color: #0000ff;">string</span> temp = oStringWriter.ToString();

        Response.Write(temp);
        Response.End();
    }</pre>
<pre><strong>这种方法的从本质上说并非标准的excel格式，不过把html格式的文件另存为excel的格式，然后用excel打开罢了。</strong></pre>
<pre><strong>3、利用</strong>ExceL Application或者MSOWC 或者ado.net</pre>
<pre>这种方法都是利用服务器的组件来时实现，要求服务端要安装excel，具体的代码可以看下面的链接：</pre>
<pre><a href="http://www.cnblogs.com/pucumt/archive/2006/09/13/503120.html">http://www.cnblogs.com/pucumt/archive/2006/09/13/503120.html</a></pre>
<pre><a href="http://support.microsoft.com/default.aspx?scid=kb;zh-cn;306023#top">http://support.microsoft.com/default.aspx?scid=kb;zh-cn;306023#top</a></pre>
<pre>我不提倡用这种方法，因为需要占用服务器的资源。</pre>
<pre>本文地址：<a href="http://www.watch-life.net/programming-notes/html-table-2-excel.html">http://www.watch-life.net/programming-notes/html-table-2-excel.html</a></pre>
<pre><strong></strong></pre>
<pre><strong></strong></pre>
<p> </p>
<p class="akst_link">
</p>
	<h4>你可能也会喜欢以下文章：</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.watch-life.net/aspnet/webresponse-cross-site-visit.html" title="WebResponse 跨域访问 (2008-07-07)">WebResponse 跨域访问</a> (1)</li>
	<li><a href="http://www.watch-life.net/visual-studio/import-export-html-per-tag-options-in-vs.html" title="web developer tips (58):在vs里导入导出每一个HTML的标记 (2009-11-03)">web developer tips (58):在vs里导入导出每一个HTML的标记</a> (0)</li>
	<li><a href="http://www.watch-life.net/visual-studio/enable-page-level-tracing-for-your-asp-net-pages.html" title="web developer tips (77):在ASP.NET启动启动页面级跟踪 (2010-03-23)">web developer tips (77):在ASP.NET启动启动页面级跟踪</a> (0)</li>
	<li><a href="http://www.watch-life.net/visual-studio/quickly-comment-and-uncomment-in-your-web-pages.html" title="web developer tips (79):在web页面快速添加和取消注释 (2010-03-28)">web developer tips (79):在web页面快速添加和取消注释</a> (0)</li>
	<li><a href="http://www.watch-life.net/visual-studio/how-to-create-an-asp-net-web-user-control-and-include-it-in-your-web-page.html" title="web developer tips (8):创建web用户控件并包含在web页面里 (2009-06-17)">web developer tips (8):创建web用户控件并包含在web页面里</a> (1)</li>
	<li><a href="http://www.watch-life.net/visual-studio/change-wap-to-use-an-iis-web-server.html" title="web developer tips (20):使用IIS作为web服务器 (2009-07-12)">web developer tips (20):使用IIS作为web服务器</a> (0)</li>
	<li><a href="http://www.watch-life.net/net-tip/sqlite-encrypted.html" title="Sqlite数据库的加密 (2008-07-25)">Sqlite数据库的加密</a> (0)</li>
	<li><a href="http://www.watch-life.net/aspnet/aspnet-textbox-readonly.html" title="比较郁闷的textbox（asp.net 2.0）控件 (2007-11-07)">比较郁闷的textbox（asp.net 2.0）控件</a> (0)</li>
</ul>

转载请注明作者，出处，以及原始超链接。<br />评论数：3 | <b><a href='http://www.watch-life.net/programming-notes/html-table-2-excel.html#comment'>评论这篇文章</a></b>|关注作者最近动态,欢迎 follow me <a href='https://twitter.com/xjb' target='_blank'>xjb@twitter.com</a>|联络作者：iamxjb@gmail.com<br/>© 2010 守望轩 <a href='http://www.watch-life.net/programming-notes/html-table-2-excel.html'>www.watch-life.net</a>]]></content:encoded>
			<wfw:commentRss>http://www.watch-life.net/programming-notes/html-table-2-excel.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>温故知新的经典&#8211;书评《Programming C# 》中文版第4版</title>
		<link>http://www.watch-life.net/technology-book-review/programming-csharp-bookreview.html</link>
		<comments>http://www.watch-life.net/technology-book-review/programming-csharp-bookreview.html#comments</comments>
		<pubDate>Tue, 30 Oct 2007 03:07:17 +0000</pubDate>
		<dc:creator>xjb</dc:creator>
				<category><![CDATA[技术书评]]></category>
		<category><![CDATA[Asp.net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[下载]]></category>
		<category><![CDATA[中文版]]></category>
		<category><![CDATA[书评]]></category>
		<category><![CDATA[电子版]]></category>
		<category><![CDATA[第四版]]></category>
		<category><![CDATA[经典]]></category>
		<category><![CDATA[编程札记]]></category>

		<guid isPermaLink="false">http://www.watch-life.net/programming-notes/programming-csharp-bookreview.html</guid>
		<description><![CDATA[  中文版第4版终于到手了。
  这是一本迟来的经典书，本书的英文版早在2005年2月就已经出版了，隔了两年多了，中文版才在国内上市。在2006年的时候，看英文版的时候，我就喜欢这本书了（尽管我是在字典的帮助下一点点看完的）。不过，毕竟有语言的隔膜，总期望有中文版，可以畅快淋漓地看。好事多磨吧，隔了一年多才实现这个愿望。对于一个程序员来说，英文的阅读能力是多么重要 ，国外最新的图书、资料的资讯都可以及时的获取，如果依赖中文版的话，就只能“落后”不少，国内的出版业的步伐恐怕要加快了，当然这是题外话了。 
  一个小插曲，那天我在看书的时候，老婆看见说，你也看“菜鸟”的书呀，我一愣，我老婆可是一点也不懂程序哟，她居然知道这本书适合菜鸟，嘿嘿，原来老婆是看到书的封面印着一张“冠鹤”的图片，给我开了个玩笑，说这是只“菜鸟”，哈哈哈。也许是巧合(或许这正是O&#8217;reilly当初的暗喻吧)，本书确实非常适合c#初学者，甚至我觉得是所有入门的c#书中最好的，比《C#入门经典》、《C# Primer》（个人觉得《C# Primer》算Stanley Lippman比较失败的作品，远不及《C++ Primer》深度）等都要优秀。对于c#高手来说，此书也可以做到温故知新，查漏补缺。 
    这是一本对“新手”“高手”皆宜的书，有什么特点呢，下面是我看后的心得：
 1、书的结构和章节安排的合理，完全从初学者角度来安排，循序渐进。在简单介绍C#与.NET框架后（这部分对于初学者没必要深入），开始逐步展开，c#的基础知识（什么变量、循环、语句、操作符）、类和对象、结构体等等，涉及c#所有的知识点，非常全面。
2、第四章、第五章可以算本书的比较精华的章节了，对c#这种面向对象的语言，面向对象是不容错过之处，作者在论述的时候浓墨重彩，从基础开始充分讲述了如何通过c#来实现OOP。
3、简洁、细致、易懂、严谨，是Jesse Liberty 写书风格，让人感觉很舒服，对基础细节的关注非常多，甚至到了不厌其烦的程度，告诉你是什么，为什么是这样，“警告”提示你不能怎样，如果看了这样的书，你还不能在c#门语言上有所得，恐怕就没什么书可以帮你了。难怪有人说这本书是面试“必读”。Jesse Liberty写的一系列的书包括经典的《Programming ASP.NET》都是这种风格：清楚的讲述来龙去脉，并告诉你思考和解决方法。同时，提供的代码案例也是非常有针对性，思路明晰，论述和验证相得益彰。
4、非常适合从c/c++、java转向c#的程序员，经过非常舒服而平滑的转换过程，对于有c/c++或java经验的程序员在很短的时间就可以掌握c#的基础要点所在，同时告诉你c#和c/c++/java 的不同点。对于已经掌握c#基础的高手来说，在使用c#的过程中，回头来查查这本书，你会发现也许你曾经的一些概念是错误的，或者是不全面的。
5、翻译的质量中等。刚拿到书时候，看见译者有3个人，不免有些担心，一般来说对于一本书如果译者超过2人的，在风格和内容的把握上就比较难统一了。不过，在看完全书，中文版本基本保持的原书的风貌，虽然在个别词语的翻译上还需要商榷，在翻译上做到了忠实原文，至少我没发现重大的错误。特别的是，中文版的译注，起到了不错的补充作用，翻译  
作品，应该是作者和译者的公共创造，译者不是翻译机，除了做到“信”（真实体现原文），还要能在原著的基础上有一些自己的独立思考，中文版的译注就很好的体现这一点，没有一定的技术和实践功底的译者恐怕做不到这一点。
  c#语言本身也在不断发展，已经发展到3.0版本了。书的出版总是赶不上语言本身的变化，但无论c#如何变化发展，总是在继承前面版本，根本的基础是稳定的，所以本书原版虽然是2005年初的作品，但仍然是学习c#不可多得的一本好书。
在网上看，Jesse Liberty着手写《Programming C#》 第五版了，那么《Programming C# 》中文版第4版算不算迟来的经典呢？:-)
 
更新：2009-03-31
该书的第5版已经出版，书名为《Programming C# 3.0》.从目录来看只是把在第四版的基础上增加有关c#3.0的内容。
 
下载：《Programming C# 》第5版（英文）
更新：2008-11-18
下面给出这本书的电子版的下载地址，如果你觉得不错请支持正版
英文原版：http://watch-life.googlecode.com/files/ProgrammingCsharp-4th.rar
中文版：http://download.csdn.net/user/laodan


	你可能也会喜欢以下文章：
	
	web developer tips (75):PostBack后保持滚动条的位置 (1)
	防止刷新重复提交数据解决方法的分析 (4)
	WebResponse 跨域访问 (1)
	关于二级域名(泛二级域名)的实现 (0)
	c#细节&#8211;Property和Attribute迷局 (1)
	web developer tips (26):在 App_Code目录下同时放c#和VB.NET文件 (0)
	web developer tips (13):用ASP.NET Ajax获取浏览器的agent (0)
	web developer tips (9):在Web.config文件中注册web用户控件 (1)


转载请注明作者，出处，以及原始超链接。评论数：1 &#124; 评论这篇文章&#124;关注作者最近动态,欢迎 follow me xjb@twitter.com&#124;联络作者：iamxjb@gmail.com© 2010 [...]]]></description>
			<content:encoded><![CDATA[<p>  中文版第4版终于到手了。<br />
  这是一本迟来的经典书，本书的英文版早在2005年2月就已经出版了，隔了两年多了，中文版才在国内上市。在2006年的时候，看英文版的时候，我就喜欢这本书了（尽管我是在字典的帮助下一点点看完的）。不过，毕竟有语言的隔膜，总期望有中文版，可以畅快淋漓地看。好事多磨吧，隔了一年多才实现这个愿望。对于一个程序员来说，英文的阅读能力是多么重要</span> <span style="font-family: Courier New">，国外最新的图书、资料的资讯都可以及时的获取，如果依赖中文版的话，就只能“落后</span><span style="font-family: Courier New">”不少，国内的出版业的步伐恐怕要加快了，当然这是题外话了。</span> <span style="font-family: Courier New"><br />
  一个小插曲，那天我在看书的时候，老婆看见说，你也看“菜鸟”的书呀，我一愣，我老婆可是一点也不懂程序哟，她居然知道这本书适合菜鸟，嘿嘿，原来老婆是看到书的封面印着一张“冠鹤”的图片，给我开了个玩笑，说这是只“菜鸟”，哈哈哈。也许是巧合(或许这正是O&#8217;reilly当初的暗喻吧)，本书确实非常适合c#初学者，甚至我觉得是所有入门的c#书中最好的，比《C#入门经典》、《C# Primer》（个人觉得《C# Primer》算Stanley Lippman比较失败的作品，远不及《C++ Primer》深度）等都要优秀。对于c#高手来说，此书也可以做到温故知新，查漏补缺。 <br />
    这是一本对“新手”“高手”皆宜的书，有什么特点呢，下面是我看后的心得：<br />
 </span><span style="font-family: Courier New">1、书的结构和章节安排的合理，完全从初学者角度来安排，循序渐进。在简单介绍C#与.NET框架后（这部分对于初学者没必要深入），开始逐步展开，c#的基础知识（什么变量、循环、语句、操作符）、类和对象、结构体等等，涉及c#所有的知识点，非常全面。<br />
2、第四章、第五章可以算本书的比较精华的章节了，对c#这种面向对象的语言，面向对象是不容错过之处，作者在论述的时候浓墨重彩，从基础开始充分讲述了如何通过c#来实现OOP。<br />
3、简洁、细致、易懂、严谨，是Jesse Liberty 写书风格，让人感觉很舒服，对基础细节的关注非常多，甚至到了不厌其烦的程度，告诉你是什么，为什么是这样，“警告”提示你不能怎样，如果看了这样的书，你还不能在c#门语言上有所得，恐怕就没什么书可以帮你了。难怪有人说这本书是面试“必读”。Jesse Liberty写的一系列的书包括经典的《Programming ASP.NET》都是这种风格：清楚的讲述来龙去脉，并告诉你思考和解决方法。同时，提供的代码案例也是非常有针对性，思路明晰，论述和验证相得益彰。<br />
4、非常适合从c/c++、java转向c#的程序员，经过非常舒服而平滑的转换过程，对于有c/c++或java经验的程序员在很短的时间就可以掌握c#的基础要点所在，同时告诉你c#和c/c++/java 的不同点。对于已经掌握c#基础的高手来说，在使用c#的过程中，回头来查查这本书，你会发现也许你曾经的一些概念是错误的，或者是不全面的。<br />
5、翻译的质量中等。刚拿到书时候，看见译者有3个人，不免有些担心，一般来说对于一本书如果译者超过2人的，在风格和内容的把握上就比较难统一了。不过，在看完全书，中文版本基本保持的原书的风貌，虽然在个别词语的翻译上还需要商榷，在翻译上做到了忠实原文，至少我没发现重大的错误。特别的是，中文版的译注，起到了不错的补充作用，翻译  </p>
<p>作品，应该是作者和译者的公共创造，译者不是翻译机，除了做到“信”（真实体现原文），还要能在原著的基础上有一些自己的独立思考，中文版的译注就很好的体现这一点，没有一定的技术和实践功底的译者恐怕做不到这一点。</p>
<p>  c#语言本身也在不断发展，已经发展到3.0版本了。书的出版总是赶不上语言本身的变化，但无论c#如何变化发展，总是在继承前面版本，根本的基础是稳定的，所以本书原版虽然是2005年初的作品，但仍然是学习c#不可多得的一本好书。<br />
在网上看，Jesse Liberty着手写《Programming C#》 第五版了，那么<a href="http://www.dearbook.com.cn/book/110279" target="_blank"></a><a href="http://www.dearbook.com.cn/book/110279" target="_blank">《Programming C# 》</a>中文版第4版算不算迟来的经典呢？:-)</p>
<p> </p>
<p><span style="color: blue;">更新：2009-03-31<br />
该书的第5版已经出版，书名为《Programming C# 3.0》.从目录来看只是把在第四版的基础上增加有关c#3.0的内容。</span></p>
<p><span style="color: blue;"> </span></p>
<p><span style="color: blue;">下载：<a href="http://watch-life.googlecode.com/files/Programming-C-sharp-3.rar" target="_blank">《Programming C# 》第5版（英文）</a></span><a href="http://watch-life.googlecode.com/files/Programming-C-sharp-3.rar" target="_blank"></a></p>
<p>更新：2008-11-18<br />
下面给出这本书的电子版的下载地址，如果你觉得不错请支持正版</p>
<p><strong>英文原版</strong>：<a href="http://watch-life.googlecode.com/files/ProgrammingCsharp-4th.rar" target="_blank">http://watch-life.googlecode.com/files/ProgrammingCsharp-4th.rar</a></p>
<p><strong>中文版</strong>：<a href="http://download.csdn.net/user/laodan" target="_blank">http://download.csdn.net/user/laodan</a></p>
<p class="akst_link">
</p>
	<h4>你可能也会喜欢以下文章：</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.watch-life.net/visual-studio/maintain-scrollposition-after-post-back.html" title="web developer tips (75):PostBack后保持滚动条的位置 (2010-03-17)">web developer tips (75):PostBack后保持滚动条的位置</a> (1)</li>
	<li><a href="http://www.watch-life.net/aspnet/refresh-no-resubmit.html" title="防止刷新重复提交数据解决方法的分析 (2008-07-12)">防止刷新重复提交数据解决方法的分析</a> (4)</li>
	<li><a href="http://www.watch-life.net/aspnet/webresponse-cross-site-visit.html" title="WebResponse 跨域访问 (2008-07-07)">WebResponse 跨域访问</a> (1)</li>
	<li><a href="http://www.watch-life.net/programming-notes/2-domainname-realization.html" title="关于二级域名(泛二级域名)的实现 (2007-06-28)">关于二级域名(泛二级域名)的实现</a> (0)</li>
	<li><a href="http://www.watch-life.net/csharp/csharp-detail-property-attribute.html" title="c#细节&#8211;Property和Attribute迷局 (2008-07-17)">c#细节&#8211;Property和Attribute迷局</a> (1)</li>
	<li><a href="http://www.watch-life.net/visual-studio/have-c-and-vb-net-files-inside-your-app-code-directory.html" title="web developer tips (26):在 App_Code目录下同时放c#和VB.NET文件 (2009-07-19)">web developer tips (26):在 App_Code目录下同时放c#和VB.NET文件</a> (0)</li>
	<li><a href="http://www.watch-life.net/visual-studio/get-the-browser-agent-using-asp-net-ajax.html" title="web developer tips (13):用ASP.NET Ajax获取浏览器的agent (2009-06-28)">web developer tips (13):用ASP.NET Ajax获取浏览器的agent</a> (0)</li>
	<li><a href="http://www.watch-life.net/visual-studio/register-your-asp-net-web-user-controls-in-web-config.html" title="web developer tips (9):在Web.config文件中注册web用户控件 (2009-06-18)">web developer tips (9):在Web.config文件中注册web用户控件</a> (1)</li>
</ul>

转载请注明作者，出处，以及原始超链接。<br />评论数：1 | <b><a href='http://www.watch-life.net/technology-book-review/programming-csharp-bookreview.html#comment'>评论这篇文章</a></b>|关注作者最近动态,欢迎 follow me <a href='https://twitter.com/xjb' target='_blank'>xjb@twitter.com</a>|联络作者：iamxjb@gmail.com<br/>© 2010 守望轩 <a href='http://www.watch-life.net/technology-book-review/programming-csharp-bookreview.html'>www.watch-life.net</a>]]></content:encoded>
			<wfw:commentRss>http://www.watch-life.net/technology-book-review/programming-csharp-bookreview.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
