C#构造函数是一个特殊的类方法。在很多方面,包括访问修饰符、重载以及参数列表的语法等方面,构造函数与普通的方法是类似的。然而,在使用方面以及行为方面,构造函数也具有许多特殊的语法和语义规则。
下面列出C#构造函数在使用方面及行为方面的一些特殊规则:
1、如果开发人员没有为一个类提供构造函数,那么,C#将提供一个默认的构造函数。
2、必须使用操作符 new 来调用一个构造函数。
3、构造函数的名称必须与类的名称相同。
4、一个构造函数的返回类型是这个类的一个实例,而一个普通方法的返回类型可以是任何类型。
5、构造函数不能覆盖一个超类的构造函数,因此,new、virtual、override、abstact以及sealed关键字不能在构造函数声明语句中使用。
6、利用 :this() 和 :base(),构造函数可以调用其他构造函数。
在声明一个构造函数的时候,如果没有使用 :this() 或 :base()来显式地调用其他构造函数,那么C#就插入一个无参数的 :base()。这可能产生令人惊奇的结果,看一下代码:
- using System;
- public class Father
- {
- //private string name;
- //public Father(string name)
- //{
- //this.name = name;
- //}
- }
- public class Child :Father
- {
- }
这段代码是可以编译的,但是,如果把注释标记“//”去除,那么这段代码就无法通过编译。原因就在于,在子类 Child 中的默认构造函数是不带参数的,另外,在默认情况下,一个类的构造函数可以调用其超类中不带参数的构造函数。然而,这个 Father 类的构造函数需要接收一个 String 类型的参数,这意味着编译器无法提供一个默认的构造函数。在没有提供参数的情况下,Child 类的默认构造函数就无调用超类的构造函数。解决办法参照规则 6 即可解决,修改 Child 类:
- public class Child :Father
- {
- public Child(string name) : base(name) { }
- }
本文参照了 Steven John Metsker 编著的《C# 设计模式》中《构造型模式介绍》一文。
C#构造函数的使用方法就介绍到这里。
【编辑推荐】