前言app
本节主要来学习下实例构造函数、私有构造函数和静态构造函数。dom
构造函数的做用:ide
一、当一个类在new实例化对象时,可调用构造函数进行初始化对象。函数
二、不带参数的构造函数称为“默认构造函数”。 不管什么时候,只要使用 new 运算符实例化对象,而且不为 new 提供任何参数,就会调用默认构造函数。除非类是static的,不然 C# 编译 器将为无构造函数的类提供一个公共的默认构造函数,以便该类能够实例化。学习
三、经过将构造函数设置为私有构造函数能够阻止类被实例化。ui
四、结构类型的构造函数与类的构造函数相似,可是 structs 不能包含显式默认构造函数,由于编译器将自动提供一个构造函数。此构造函数会将struct中的每一个字段初始化为默认值。 只有当 struct 用 new 实例化时,才会调用此默认构造函数。this
实例构造函数spa
使用 new 表达式建立某个类的对象时,会使用实例构造函数建立和初始化全部实例成员变量。 要初始化静态类或非静态类中的静态变量,必须定义静态构造函数。3d
class CoOrds { public int x, y; // constructor public CoOrds() { x = 0; y = 0; } }
只要建立基于 CoOrds 类的对象,就会调用此实例构造函数。 诸如此类不带参数的构造函数称为“默认构造函数”。 然而,提供其余构造函数一般十分有用。 例如,能够向 CoOrds 类添加构造函数,以即可觉得数据成员指定初始值:日志
public CoOrds(int x, int y) { this.x = x; this.y = y; }
这样即可以用默认或特定的初始值建立 CoOrd 对象,以下所示:
CoOrds p1 = new CoOrds(); CoOrds p2 = new CoOrds(5, 3);
若是某个类没有构造函数,则会自动生成一个默认构造函数,并使用默认值来初始化对象字段。
也能够用实例构造函数来调用基类的实例构造函数。 类构造函数可经过初始值设定项来调用基类的构造函数,以下所示:
abstract class Shape { public const double pi = Math.PI; protected double x, y; public Shape(double x, double y) { this.x = x; this.y = y; } public abstract double Area(); } class Circle : Shape { public Circle(double radius) : base(radius, 0) { } public override double Area() { return pi * x * x; } }
在此示例中,Circle 类将表示半径和高度的值传递给 Shape(Circle 从它派生而来)提供的构造函数。
私有构造函数
私有构造函数是一种特殊的实例构造函数。 它一般用在只包含静态成员的类中。 若是类具备一个或多个私有构造函数而没有公共构造函数,则其余类(除嵌套类外)没法建立该类的实例。 例如:
class NLog { // Private Constructor: private NLog() { } public static double e = Math.E; //2.71828... }
声明空构造函数可阻止自动生成默认构造函数。 注意,若是您不对构造函数使用访问修饰符,则在默认状况下它仍为私有构造函数。 可是,一般显式地使用 private 修饰符来清楚地代表该类不能被实例化。
当没有实例字段或实例方法(如 Math 类)时或者当调用方法以得到类的实例时,私有构造函数可用于阻止建立类的实例。 若是类中的全部方法都是静态的,可考虑使整个类成为静态的。
下面是使用私有构造函数的类的示例:
public class Counter { private Counter() { } public static int currentCount; public static int IncrementCount() { return ++currentCount; } } class TestCounter { static void Main() { // Counter aCounter = new Counter(); // Error Counter.currentCount = 100; Counter.IncrementCount(); Console.WriteLine("New count: {0}", Counter.currentCount); Console.WriteLine("Press any key to exit."); Console.ReadKey(); } }
注意,若是您取消注释该示例中的如下语句,它将生成一个错误,由于该构造函数受其保护级别的限制而不可访问:
// Counter aCounter = new Counter(); // Error
静态构造函数
静态构造函数用于初始化任何 静态 数据,或用于执行仅需执行一次的特定操做。 在建立第一个实例或引用任何静态成员以前,将自动调用静态构造函数。
class SimpleClass { static readonly long baseline; static SimpleClass() { baseline = DateTime.Now.Ticks; } }
静态构造函数具备如下特色:
静态构造函数既没有访问修饰符,也没有参数。
在建立第一个实例或引用任何静态成员以前,将自动调用静态构造函数来初始化类。
没法直接调用静态构造函数。
在程序中,用户没法控制什么时候执行静态构造函数。
静态构造函数的典型用途是:当类使用日志文件时,将使用这种构造函数向日志文件中写入项。
静态构造函数在为非托管代码建立包装类时也颇有用,此时该构造函数能够调用 LoadLibrary 方法。
若是静态构造函数引起异常,运行时将不会再次调用该构造函数,而且在程序运行所在的应用程序域的生存期内,类型将保持未初始化。