前面讲到如何构造bbs对象,有朋友要求我简单介绍一下c#里如何构造对象,下面我就简单说一下,算是补上这一课吧。
c#里的类(class),也可以叫做对象(object),它由以下几部分组成:成员变量,属性和方法,其中必不可少的是这个类不带任何参数的构造函数,它不指定返回类型,作用是初始化类的成员变量、分配内存等。和c++不同,c#类只有构造函数,不需要析购函数,也就是说你只需要为成员变量分配内存,而不必要显式的释放内存,这是因为c#和java一样都是通过垃圾收集器来释放内存。明白这些,我们就可以构造一个最简单的类,一个什么也不做的类:
public class myclass
{
public myclass(){} ;
}
要使用时只需要简单的new一个出来就行了,象这样:myclass myclass1 = new myclass() ;不要怀疑,你的确已经创建了一个对象,尽管它什么也不做:)。下面我们给它加一个私有字符型成员变量m_strtitle,并且在构造函数里初始化这个成员变量,整个类的定义就变成这样:
public class myclass
{
//私有成员变量
private string m_strtitle ;
//构造函数
public myclass()
{
m_strtitle = "我已经被赋初值了" ;
}
}
注意定义成员变量的这行代码:private string m_strtitle ; 其中string好理解,说明m_strtitle是string类型的,那么最前面的private是什么作用呢?这个private(私有)说明这个成员变量是私有的,只有这个类内部的函数可以使用,而其他任何地方包括子类的函数都不能使用它,除了private,你还可以定义成public(公共)和protected(保护),public表明这个成员变量在任何地方都可以使用,而protected表明这个变量只能在本类或子类中使用。所以,如果我们想要使用这个成员变量,可以把它定义成public,但对于面向对象编程来说这不是个好的编程习惯,因为它破坏了类的封装性,在c++里好的方法是再定义公共函数来存取这个私有变量,而c#里提供了一个更加方便的方法,那就是属性(property),现在我们把这个属性title加上:
public class myclass
{
//私有成员变量
private string m_strtitle ;
//属性
public string title
{
get
{
return this.m_strtitle ;
}
set
{
this.m_strtitle = value ;
}
}
//构造函数
public myclass()
{
m_strtitle = "我已经被赋初值了" ;
}
}
让我们来看看如何定义属性,首先同样需要作用域限定符,通常我们使用public,表明任何地方都可以使用该属性,其次有两个关键字需要注意:this和value , this代表类本身,所以this.m_strtitle就是代表本类的成员变量m_strtitle , value代表当这个属性作为左值时等号右边的值,象这样:myclass.title = "hello" , 那么value的值就是"hello" , 好了,这个类已经可以使用了,象下面:
public static void main(string[] args)
{
myclass myclass = new myclass() ; //构造myclass类的一个实例
console.writeline(myclass.title) ; //结果是:我已经被赋初值了
myclass.title = "我的值改变了" ; //改变title属性的值
console.writeline(myclass.title) ; //这时结果变成:我的值改变了
}
好了,现在让我们给这个类加上一个mymethod方法,这个方法没有返回值,带一个字符型参数。
public class myclass
{
//私有成员变量
private string m_strtitle ;
//属性
public string title
{
get
{
return this.m_strtitle ;
}
set
{
this.m_strtitle = value ;
}
}
//构造函数
public myclass()
{
m_strtitle = "我已经被赋初值了" ;
}
//方法
public void mymethod(string a_str)
{
this.m_strtitle = a_str ;
}
}
这是我们可以改写一下刚才那个程序,运行结果同刚才一样:
public static void main(string[] args)
{
myclass myclass = new myclass() ; //构造myclass类的一个实例
console.writeline(myclass.title) ; //结果是:我已经被赋初值了
myclass.mymethod( "我的值改变了" ); //改变title属性的值
console.writeline(myclass.title) ; //这时结果变成:我的值改变了
}
以上简单讲了一下如何定义类,看完这些内容,可能你就可以理解上一节我们构造的那个bbs对象,让我们再看一下它的定义:
namespace myownclass
{
using system;
using system.data.sql ;
using system.data ;
////////////////////////////////////////////////////////////////////
//
// class name : bbs
//
// description: 论坛类,构造一个论坛对象
//
// date: 2000/02/03
//
/// ////////////////////////////////////////////////////////////////
public class bbs
{
//私有变量
private string m_strtitle ; //bbs名称
private int m_intforumcount ; //版面数
private int m_inttopiccount ; //贴子数
private int m_intusercount ; //注册用户数
//属性
public string title
{
get
{
return m_strtitle ;
}
}
public int forumcount
{
get
{
return m_intforumcount ;
}
}
public int topiccount
{
get
{
return m_inttopiccount ;
}
}
public int usercount
{
get
{
return m_intusercount ;
}
}
//构造函数
public bbs(string a_strtitle)
{
//
// todo: add constructor logic here
//
m_strtitle = a_strtitle ;
//读取数据库
myconnection myconn = new myconnection() ;
sqlcommand mycommand = new sqlcommand() ;
mycommand.activeconnection = myconn ;
mycommand.commandtext = "up_getbbsinfo" ; //调用存储过程
mycommand.commandtype = commandtype.storedprocedure ;
try
{
myconn.open() ;
sqldatareader myreader ;
mycommand.execute(out myreader) ;
if (myreader.read())
{
m_intforumcount = (int)myreader["forumcount"] ;
m_inttopiccount = (int)myreader["topiccount"] ;
m_intusercount = (int)myreader["usercount"] ;
}
else
{
throw(new exception("表或存储过程不存在")) ;
}
//清场
myreader.close();
myconn.close() ;
}
catch(sqlexception e)
{
throw(new exception("数据库出错:" + e.message)) ;
}
}
}
}
和刚才我们讲的稍有不同,首先看第一行namespace myownclass , 声明目前这个类的名字空间是myownclass,名字空间就像一个包,其中可以包含很多类。再看这行: using system; 这个告诉编译器,我要引用system名字空间里的对象。然后其他的就好理解了吧?
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器