欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

.Net边学边讲(二)

程序员文章站 2022-07-02 15:45:50
我们继续来谈一谈类 与其他面向对象的语言不同,.net中类有四个基本成员,data members(fields), function members(methods), properties, e...
我们继续来谈一谈类
与其他面向对象的语言不同,.net中类有四个基本成员,data members(fields), function members(methods), properties, events。其他编程语言只有前两项。这里需注意,data members(fields)永远不要声明成public,因为这样会使使用者无需知道你的类就可以改变你的数据。
public class test{
private int i;
}
这里i 就是一个data members(fields),需要提及一点,properties提供了方便、安全的数据访问封装。下面来谈谈function members(methods),他有两种存在方式,instance和static。instance隐含的接受了指向他所在的对象的指针,在c#中你可以用对象名或this得到。如:someobject.method(), 或this.method()。静态的(static)method不能接收到this指针。因此他们不能直接访问类里的任何实例化数据。他的调用方式是someclassname.staticmethod()。他无需例示。function members(methods)默认是private的,即只能在声明他们的类中访问,我们需要声明他们为public以便可以在任何类中访问。function members(methods)可以被重载,也就是说你可以创建多个就有相同名字的方法,比如说test(int i), test(double i), test(), test(string i, bool b).....。.net编译器会依据你传递的参数决定你在调用哪个方法。当然还有一些其它的修饰符如extern,他的用途是如果你想在.net framework中声明你的方法而在.net framework之外实现你的方法,比如说在c# 中声明你的方法而在windows本地dll中实现你的方法,你就要在c#中这样声明,public extern yourmethod(){}
接下来我们要谈谈constructors和finalize,每个类都至少有一个constructor的方法,如果你没有提供,c#将自动为你生成一个没有任何参数的constructor。constructor是一个与你的类的名字相同且没有任何返回值的的方法。每个constructor都会调用一个你基类的constructor(如果没有显性的基类,就调用对象的),这个调用会在你的constructor主体执行之前调用,这样,你就知道你的基类有没有正确的初始化了。constructor只在每个对象被创建时调用一次,它的作用是初始化对象的实例,以便于调用。destructors已不再需要,因为c#会自动提供一个清理对象的方法(叫finalize)。垃圾自动清理,这也是c#的区别于其他编程语言的特性之一。接下来,我们该谈谈属性了。首先为什么要用属性?来看一个例子,如果你有一个类person,有一个data members(fields)叫age 是int32型的被声明成public,(前面我们讲过不能声明成public,这里就是举例说明为什么不能):
person jim = new person(); // create object; pointed to by jim
jim.age = 23;
int32 jimsage = jim.age;
jim.age = -5; // invalid, but unchecked if you use a field
这段代码会造成两个问题
1.你的用户知道了内部数据的细节,他们可能会做一些你不希望发生的操作
2.你的用户可能会更改数据为一个不合法的值,如将age设为零或负数
现在大家可以知道属性的优势了,相对应予上面提的
1.用户不会知道你的内部数据结构
2.属性方法会保护数据
下面的例程显示了属性的优越。
public class person
{
int32 age; // 注意默认是private
public person(int32 age) { // constructor
this.age = age; // this消除歧义!
}
public int32 age { // property
get {
return age;
}
set { // validating value
if (value > 0 && value < 150) {
age = value;
}
else { // throw exception if invalid value
throw new argumentexception("age must be between 1
and 150");
}
}
}
}
这段程序有几个值的关注的地方
1.在constructor中,我们定义了一个参数也叫age,这会与private age产生歧义。我们用this来消除歧义。
2.get方法用于读取属性set方法用于存取属性 。关键字value代表属性被设置的值
3.在set方法中我们检查了value的值,并在数据不合法时抛出了异常
有点打累了。。。:)
下次我们谈谈event