------------------------
构造函数
------------------------
构造函数是在创建给定类型的对象时执行的类方法。构造函数具有与类相同的名称,它通常初始化新对象的数据成员。
★使用构造函数
在下面的示例中,定义了一个具有一个简单的构造函数,名为 Taxi 的类。然后使用 new 运算符来实例化该类。在为新对象分配内存之后,new 运算符立即调用 Taxi 构造函数。
示例
public class Taxi
{
public bool isInitialized;
public Taxi()
{
isInitialized = true;
}
}
class TestTaxi
{
static void Main()
{
Taxi t = new Taxi();
System.Console.WriteLine(t.isInitialized);
}
}
不带参数的构造函数称为“默认构造函数”。无论何时,只要使用 new 运算符实例化对象,并且不为 new 提供任何参数,就会调用默认构造函数。除非类是 static 的,否则 C# 编译器将为无构造函数的类提供一个公共的默认构造函数,以便该类可以实例化。
★私有构造函数
私有构造函数是一种特殊的实例构造函数。它通常用在只包含静态成员的类中。如果类具有一个或多个私有构造函数而没有公共构造函数,则不允许其他类(除了嵌套类)创建该类的实例。
示例
public class Counter
{
private Counter() { }
public static int VCount;
public static int MCount()
{
return ++VCount;
}
}
class TestCounter
{
static void Main()
{
// Counter aCounter = new Counter();// Error
Counter.VCount = 100;
Counter.MCount();
System.Console.WriteLine("{0}", Counter.VCount);
//int s=Counter.MCount();
//System.Console.WriteLine("{0}", s);
}
}
声明空构造函数可阻止自动生成默认构造函数。注意,如果您不对构造函数使用访问修饰符,则在默认情况下它仍为私有构造函数。但是,通常显式地使用 private 修饰符来清楚地表明该类不能被实例化。
★静态构造函数
静态构造函数用于初始化任何静态数据,或用于执行仅需执行一次的特定操作。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数。静态构造函数具有以下特点:
○静态构造函数既没有访问修饰符,也没有参数。
○在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。
○无法直接调用静态构造函数。
○在程序中,用户无法控制何时执行静态构造函数。
示例
在此示例中,类 Bus 有一个静态构造函数和一个静态成员 Drive()。当调用 Drive() 时,将调用静态构造函数来初始化类。
public class Bus
{
static Bus()
{
System.Console.WriteLine("The static constructor invoked.");
}
public static void Drive()
{
System.Console.WriteLine("The Drive method invoked.");
}
}
class TestBus
{
static void Main()
{
Bus.Drive();
}
}
★复制构造函数
与有些语言不同,C# 不提供复制构造函数。如果您创建了新的对象并希望从现有对象复制值,您必须自行编写适当的方法。
示例
在本示例中,Person类包含一个构造函数,该构造函数接受另一个 Person 类型的对象作为参数。然后此对象的字段中的内容将分配给新对象中的字段。
class Person
{
private string name;
private int age;
public Person(Person previousPerson)
{
name = previousPerson.name;
age = previousPerson.age;
}
public Person(string name, int age)
{
//如果去掉this则参数名就不能和字段名相同
this.name = name;
this.age = age;
}
public string Details
{
get
{
return name + " is " + age.ToString();
}
}
}
class TestPerson
{
static void Main()
{
Person person1 = new Person("George", 40);
Person person2 = new Person(person1);
System.Console.WriteLine(person2.Details);
}
}
------------------------
析构函数
------------------------
析构函数用于析构类的实例。不能在结构中定义析构函数。只能对类使用析构函数。析构函数有如下特点:
○ 一个类只能有一个析构函数。
○ 无法继承或重载析构函数。
○ 无法调用析构函数。它们是被自动调用的。
○ 析构函数既没有修饰符,也没有参数。
○ 声明析构函数时前面加一个“~”
示例:
下面的示例创建三个类,这三个类构成了一个继承链。类 First 是基类,Second 是从 First 派生的,而 Third 是从 Second 派生的。这三个类都有析构函数。在 Main() 中,创建了派生程度最大的类的实例。注意:程序运行时,这三个类的析构函数将自动被调用,并且是按照从派生程度最大的到派生程度最小的次序调用。
class First
{
~First()
{
System.Console.WriteLine("First析构函数");
}
}
class Second: First
{
~Second()
{
System.Console.WriteLine("Second析构函数");
}
}
class Third: Second
{
~Third()
{
System.Console.WriteLine("Third析构函数");
}
}
class TestDestructors
{
static void Main()
{
Third t = new Third();
}
}