(Method overloading)允许在同一个类中采用同一个名称声明多个方法,条件是它们的签名是惟一的。当编译一个重载方法的调用时,编译器采用重载决策(overload resolution)确定应调用的方法。重载决策找到最佳匹配自变量的方法,或者在没有找到最佳匹配的方法时报告错误信息。下面的示例展示了重载决策工作机制。
5.变量(C#中类的变量称为字段。类的public变量称为类的公共字段)
C#要求局部变量在其值被获得之前明确赋值(definitely)。
例如,假设前面的变量i的声明没有包含初始值,那么,在接下来对i的使用将导致编译器报告错误,原因就是i在程序中没有明确赋值。
6.事件
事件是使对象或类能够提供通知的成员。事件的声明与字段的类似,不同之处在于事件声明包含一个event关键字,并且事件声明的类型必须是委托类型。
在包含事件声明的类中,事件可以像委托类型的字段一样使用(这样的事件不能是 abstract,而且不能声明访问器)。该字段保存了一个委托的引用,表示事件处理程序已经被添加到事件上。如果尚未添加任何事件处理程序,则该字段为null。
List类声明了名为Changed的单个事件成员,Changed事件表明有一个新项添加到事件处理程序列表,它由OnChanged虚拟方法引发,它首先检查事件是否为null(意思是没有事件处理程序)。引发事件的通知正好等价于调用事件所表示的委托——因此,不需要特殊的语言构件引发事件。
客户通过事件处理程序(event handler)响应事件。使用“+=”运算符添加或者使用“-=”移除事件处理程序。下面的示例添加一个事件处理程序到List类的Changed事件:
using System;
class Test
{
static int changeCount;
static void ListChanged(object sender, EventArgs e) {
changCount++;
}
static void Main() {
List names = new List();
names.Changed += new EventHandler(ListChanged);
names.Add("Liz");
names.Add("Martha");
names.Add("Beth");
Console.WriteLine(changeCount); //输出 "3"
}
}
7. 析构函数
析构函数(destructor)是用于实现析构类实例所需操作的成员。析构函数不能带参数,不能具有可访问性修饰符,也不能被显式地调用。垃圾回收期间会自动调用所涉及实例的析构函数。 在类的继承中,类的析构函数是不会被继承的。
垃圾回收器在决定何时回收对象和运行析构函数方面采取宽松的策略。特别指出,析构函数的调用时机是不确定的,并且析构函数可能运行在任何线程上。由于这些或者其他原因,只有没有其他可行的解决方案,类才实现析构函数。
8.构造方法(constructor)
构造函数分为实例构造函数,静态构造函数。
(1)实例构造函数:用于实例成员的初始化,可以访问静态成员和实例成员。
如:
public Class1
{
......
}
(2)静态构造函数:用于静态成员的初始化,只可以访问静态成员。类的静态成员属于类所有,不必生成实例就可以访问。它是在载入包含类的应用程序时创建的,通常,静态变量是在定义时就赋初始值的。
如:
public static Class1()
{
......
}
9.常量:其值是在编译时设定的,必须是数值文字。默认状态下常量是静态的(关健字:const)。
如:
public class Class1
{
public const double pi = 3.1415;
}
10.属性
类的属性由一个protected(也可以是private)字段和get和set方法构成:
public class Class1
{
private string ip;//字段
{
get
{
return ip;
}
set
{
ip=value;
}
};
}
只读属性是指省略set方法的属性,只读属性只能读取,不能设置。
属性也可以用限定符virtual,override和abstract修饰,功能同其他类的方法。
属性有一个用处称为懒惰的初始化(lazy initialization)。即在需要类成员时才对它们进行
初始化。如果类中包含了很少被引用的成员,而这些成员的初始化又会花费大量的时候和系统
资源的话,懒惰的初始化就很有用了。