C#构造函数总结
构造函数要点:
1:构造函数具有与类相同的名称;
2:任何时候,只要创建类或结构,就会调用它的构造函数。
3:构造函数最大作用:构造函数使得程序员可设置默认值、限制实例化(用private)以及编写灵活且便于阅读的代码。
4:如果没有为对象提供构造函数,则默认情况下 C# 将创建一个构造函数,而且变量都为默认值。
构造函数使用实例:
abstract class Shape
{
public const double pi = System.Math.PI;
protected double x, y; //protected修饰的变量可以在类或其派生类中使用
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) //可以用base关键字调用基类的构造函数
//this有相同用法,this关键字是调用同一对象的另一个构造函数,可以使用this重写该构造函数
{
}
public override double Area() //重写基类的抽象方法
return pi * x * x;
}
}
class Cylinder : Circle
{
public Cylinder(double radius, double height)
: base(radius)
{
y = height;
}
public override double Area() //重写基类的方法,看出抽象类和抽象方法的好处了吧,定义一个抽
//象方法而在派生类重写是有很大好处的
return (2 * base.Area()) + (2 * pi * x * y);
}
}
class TestShapes
{
static void Main()
{
double radius = 2.5;
double height = 3.0;
Circle ring = new Circle(radius); //调用派生类Circle的构造函数
Cylinder tube = new Cylinder(radius, height);//调查派生类Cylinder的构造函数
System.Console.WriteLine("Area of the circle = {0:F2}", ring.Area());
System.Console.WriteLine("Area of the cylinder = {0:F2}", tube.Area());
}
}
私有构造函数
定义:私有构造函数是一种特殊的实例构造函数。它通常用在只包含静态成员的类中。如果类具有一个或多个私有构造函数而没有公共构造函数,则不允许其他类(除了嵌套类)创建该类的实例
注意:声明空构造函数可阻止自动生成默认构造函数。注意,如果您不对构造函数使用访问修饰符,则在默认情况下它仍为私有构造函数。但是,通常显式地使用 private 修饰符来清楚地表明该类不能被实例化。
主要作用:表明该类不能被实例化,用于只包含的静态成员的类中,防止被实例化。
静态构造函数
定义:静态构造函数用于初始化任何静态数据,或用于执行仅需执行一次的特定操作。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数。
特点:
1: 态构造函数既没有访问修饰符,也没有参数。
2:在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。
3:无法直接调用静态构造函数。
4:在程序中,用户无法控制何时执行静态构造函数。
5:静态构造函数的典型用途是:当类使用日志文件时,将使用这种构造函数向日志文件中写入项。
6:静态构造函数在为非托管代码创建包装类时也很有用,此时该构造函数可以调用 LoadLibrary 方法。
1:构造函数具有与类相同的名称;
2:任何时候,只要创建类或结构,就会调用它的构造函数。
3:构造函数最大作用:构造函数使得程序员可设置默认值、限制实例化(用private)以及编写灵活且便于阅读的代码。
4:如果没有为对象提供构造函数,则默认情况下 C# 将创建一个构造函数,而且变量都为默认值。
构造函数使用实例:
abstract class Shape
{
public const double pi = System.Math.PI;
protected double x, y; //protected修饰的变量可以在类或其派生类中使用
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) //可以用base关键字调用基类的构造函数
//this有相同用法,this关键字是调用同一对象的另一个构造函数,可以使用this重写该构造函数
{
}
public override double Area() //重写基类的抽象方法
return pi * x * x;
}
}
class Cylinder : Circle
{
public Cylinder(double radius, double height)
: base(radius)
{
y = height;
}
public override double Area() //重写基类的方法,看出抽象类和抽象方法的好处了吧,定义一个抽
//象方法而在派生类重写是有很大好处的
return (2 * base.Area()) + (2 * pi * x * y);
}
}
class TestShapes
{
static void Main()
{
double radius = 2.5;
double height = 3.0;
Circle ring = new Circle(radius); //调用派生类Circle的构造函数
Cylinder tube = new Cylinder(radius, height);//调查派生类Cylinder的构造函数
System.Console.WriteLine("Area of the circle = {0:F2}", ring.Area());
System.Console.WriteLine("Area of the cylinder = {0:F2}", tube.Area());
}
}
私有构造函数
定义:私有构造函数是一种特殊的实例构造函数。它通常用在只包含静态成员的类中。如果类具有一个或多个私有构造函数而没有公共构造函数,则不允许其他类(除了嵌套类)创建该类的实例
注意:声明空构造函数可阻止自动生成默认构造函数。注意,如果您不对构造函数使用访问修饰符,则在默认情况下它仍为私有构造函数。但是,通常显式地使用 private 修饰符来清楚地表明该类不能被实例化。
主要作用:表明该类不能被实例化,用于只包含的静态成员的类中,防止被实例化。
静态构造函数
定义:静态构造函数用于初始化任何静态数据,或用于执行仅需执行一次的特定操作。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数。
特点:
1: 态构造函数既没有访问修饰符,也没有参数。
2:在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。
3:无法直接调用静态构造函数。
4:在程序中,用户无法控制何时执行静态构造函数。
5:静态构造函数的典型用途是:当类使用日志文件时,将使用这种构造函数向日志文件中写入项。
6:静态构造函数在为非托管代码创建包装类时也很有用,此时该构造函数可以调用 LoadLibrary 方法。
//在此示例中,类 Bus 有一个静态构造函数和一个静态成员 Drive()。当调用 Drive() 时,将调用静态构造函数来初始化类。
public class Bus
{
// Static constructor:
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();
}
}
输出
The static constructor invoked.
The Drive method invoked.
public class Bus
{
// Static constructor:
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();
}
}
输出
The static constructor invoked.
The Drive method invoked.