原文地址:http://www.dingos.cn/index.php?topic=1070.0
【构造函数】
每个类都具有一个构造函数:一个与类共享相同名称的方法。根据类定义创建对象时会调用构造函数。构造函数通常设置在类中定义的变量的初始值。如果初始值为数值数据类型值 0、布尔型数据类型值 false 或引用类型值 null,则不需要调用构造函数设置初始值,因为这些数据类型会自动初始化。
可以使用任意数量的参数来定义构造函数。没有参数的构造函数称为“默认构造函数”。
每个类都具有一个构造函数:一个与类共享相同名称的方法。根据类定义创建对象时会调用构造函数。构造函数通常设置在类中定义的变量的初始值。如果初始值为数值数据类型值 0、布尔型数据类型值 false 或引用类型值 null,则不需要调用构造函数设置初始值,因为这些数据类型会自动初始化。
可以使用任意数量的参数来定义构造函数。没有参数的构造函数称为“默认构造函数”。
class SampleClass{
string greeting;
public SampleClass(){
greeting = "Hello, World";
}
public SampleClass(string message){
greeting = message;
}
public void SayHello(){
System.Console.WriteLine(greeting);
}
}
class Program{
static void Main(string[] args){
// Use default constructor.
SampleClass sampleClass1 = new SampleClass();
sampleClass1.SayHello();
// Use constructor that takes a string parameter.
SampleClass sampleClass2 = new SampleClass("Hello, Mars");
sampleClass2.SayHello();
}
}
public SampleClass(){
greeting = "Hello, World";
}
public SampleClass(string message){
greeting = message;
}
public void SayHello(){
System.Console.WriteLine(greeting);
}
}
class Program{
static void Main(string[] args){
// Use default constructor.
SampleClass sampleClass1 = new SampleClass();
sampleClass1.SayHello();
// Use constructor that takes a string parameter.
SampleClass sampleClass2 = new SampleClass("Hello, Mars");
sampleClass2.SayHello();
}
}
【使用构造函数注意事项】
- 一个类的构造函数名与类名同名。
- 构造函数没有返回值(不能有返回值,也不能是void)
- 一般情况下,构造函数总是public类型的。
- 在构造函数中不要对类的实例做初始化以外的事情。
- 构造函数不能直接被调用,是在创建类的实例时通过new关键字来调用。
【实例构造函数】
实例构造函数用于创建和初始化实例。创建新对象时将调用类构造函数。
可以用默认或特定的初始值创建类的对象
如果类没有默认构造函数,将自动生成一个构造函数,并且将用默认值来初始化对象字段。
也可以用实例构造函数来调用基类的实例构造函数。类构造函数可通过初始值设定项来调用基类的构造函数。
实例构造函数用于创建和初始化实例。创建新对象时将调用类构造函数。
class CoOrds{
public int x, y;
// constructor
public CoOrds(){
x = 0;
y = 0;
}
public CoOrds(int x, int y){
this.x = x;
this.y = y;
}
}
// constructor
public CoOrds(){
x = 0;
y = 0;
}
public CoOrds(int x, int y){
this.x = x;
this.y = y;
}
}
可以用默认或特定的初始值创建类的对象
CoOrds p1 = new CoOrds();
CoOrds p2 = new CoOrds(5, 3);
如果类没有默认构造函数,将自动生成一个构造函数,并且将用默认值来初始化对象字段。
也可以用实例构造函数来调用基类的实例构造函数。类构造函数可通过初始值设定项来调用基类的构造函数。
class Circle : Shape{
public Circle(double radius) : base(radius, 0) { }
}
}
【私有构造函数】
私有构造函数是一种特殊的实例构造函数。它通常用在只包含静态成员的类中。如果类具有一个或多个私有构造函数而没有公共构造函数,则其他类(除嵌套类外)无法创建该类的实例。
声明空构造函数可阻止自动生成默认构造函数。注意,如果不对构造函数使用访问修饰符,则在默认情况下它仍为私有构造函数。但是,通常显式地使用 private 修饰符来清楚地表明该类不能被实例化。
当没有实例字段或实例方法(如 Math 类)时或者当调用方法以获得类的实例时,私有构造函数可用于阻止创建类的实例。如果类中的所有方法都是静态的,可考虑使整个类成为静态的。
私有构造函数是一种特殊的实例构造函数。它通常用在只包含静态成员的类中。如果类具有一个或多个私有构造函数而没有公共构造函数,则其他类(除嵌套类外)无法创建该类的实例。
class NLog{
// Private Constructor:
private NLog() { }
public static double e = System.Math.E; //2.71828...
}
private NLog() { }
public static double e = System.Math.E; //2.71828...
}
声明空构造函数可阻止自动生成默认构造函数。注意,如果不对构造函数使用访问修饰符,则在默认情况下它仍为私有构造函数。但是,通常显式地使用 private 修饰符来清楚地表明该类不能被实例化。
当没有实例字段或实例方法(如 Math 类)时或者当调用方法以获得类的实例时,私有构造函数可用于阻止创建类的实例。如果类中的所有方法都是静态的,可考虑使整个类成为静态的。
【静态构造函数】
静态构造函数用于初始化任何静态数据,或用于执行仅需执行一次的特定操作。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数。
静态构造函数用于初始化任何静态数据,或用于执行仅需执行一次的特定操作。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数。
class SimpleClass{
// Static constructor
static SimpleClass() {
//...
}
}
static SimpleClass() {
//...
}
}
【静态构造函数具有以下特点】
- 静态构造函数既没有访问修饰符,也没有参数。
- 在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类
- 无法直接调用静态构造函数。
- 在程序中,用户无法控制何时执行静态构造函数。
- 静态构造函数的典型用途是:当类使用日志文件时,将使用这种构造函数向日志文件中写入项。
- 静态构造函数在为非托管代码创建包装类时也很有用,此时该构造函数可以调用 LoadLibrary 方法。
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();
}
}
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();
}
}
【重载构造函数】
★ Csharp 为每一个类自动提供缺省构造函数,缺省构造函数将成员变量的值初始化为缺省值
★ 一旦创建了自己的构造函数,缺省的构造函数将不复存在。
★ 重载构造函数提供了一组创建对象的方式,可以根据需要决定是否带初始参数。
public class ConstructOverload {
int x;
ConstructOverload() {
x=0;
Console.WriteLine("不带参数的构造函数");
}
ConstructOverload(int x){
this.x=x;
Console.WriteLine("带一个参数的构造函数");
}
}
使用下列语法可创建对象:
关键字 new 通常称为创建运算符,用于分配对象内存,并将该内存初始化为缺省值。
一旦 new 完成分配和初始化内存,它就将调用构造函数来执行对象初始化
★ Csharp 为每一个类自动提供缺省构造函数,缺省构造函数将成员变量的值初始化为缺省值
★ 一旦创建了自己的构造函数,缺省的构造函数将不复存在。
★ 重载构造函数提供了一组创建对象的方式,可以根据需要决定是否带初始参数。
using System;
public class ConstructOverload {
int x;
ConstructOverload() {
x=0;
Console.WriteLine("不带参数的构造函数");
}
ConstructOverload(int x){
this.x=x;
Console.WriteLine("带一个参数的构造函数");
}
}
【this关键字】
this 关键字引用类的当前实例,还可用作扩展方法的第一个参数的修饰符。
this 的常用用途:
1. 限定被相似的名称隐藏的成员
2. 将对象作为参数传递到其他方法
3. 声明索引器
注意:由于静态成员函数存在于类一级,并且不是对象的一部分,因此没有 this 指针。在静态方法中引用 this 是错误的。
this 关键字引用类的当前实例,还可用作扩展方法的第一个参数的修饰符。
this 的常用用途:
1. 限定被相似的名称隐藏的成员
public Employee(string name, string alias) {
this.name = name;
this.alias = alias;
}
this.alias = alias;
}
2. 将对象作为参数传递到其他方法
CalcTax(this);
3. 声明索引器
public int this [int param]{
get { return array[param];
}
set { array[param] = value; }
}
set { array[param] = value; }
}
注意:由于静态成员函数存在于类一级,并且不是对象的一部分,因此没有 this 指针。在静态方法中引用 this 是错误的。
【创建对象】
当创建一个类时,只是创建了一种新的数据类型。对象是类的一个实例。
当创建一个类时,只是创建了一种新的数据类型。对象是类的一个实例。
使用下列语法可创建对象:
new
构造函数
关键字 new 通常称为创建运算符,用于分配对象内存,并将该内存初始化为缺省值。
一旦 new 完成分配和初始化内存,它就将调用构造函数来执行对象初始化
【使用构造函数】
构造函数是在创建给定类型的对象时执行的类方法。构造函数具有与类相同的名称,它通常初始化新对象的数据成员。
定义一个类。然后使用 new 运算符来实例化该类。在为新对象分配内存之后,new 运算符立即调用类的构造函数。
不带参数的构造函数称为“默认构造函数”。 无论何时,只要使用 new 运算符实例化对象,并且不为 new 提供任何参数,就会调用默认构造函数。
除非类是 static 的,否则 C# 编译器将为无构造函数的类提供一个公共的默认构造函数,以便该类可以实例化。
结构类型的构造函数与类的构造函数类似,但是 structs 不能包含显式默认构造函数,因为编译器将自动提供一个构造函数。此构造函数会将 struct 中的每个字段初始化为默认值。然而,只有当 struct 用 new 实例化时,才会调用此默认构造函数。
构造函数可以使用 base 关键字来调用基类的构造函数。
基类的构造函数在执行构造函数块之前被调用。base 关键字可带参数使用,也可不带参数使用。构造函数的任何参数都可用作 base 的参数,或用作表达式的一部分。
在派生类中,如果不使用 base 关键字来显式调用基类构造函数,则将隐式调用默认构造函数(如果有的话)。
如果基类没有提供默认构造函数,派生类必须使用 base 显式调用基构造函数。
构造函数可以使用 this 关键字调用同一对象中的另一构造函数。和 base 一样,this 可带参数使用也可不带参数使用,构造函数中的任何参数都可用作 this 的参数,或者用作表达式的一部分。
构造函数可以标记为 public、private、protected、internal 或 protected internal。这些访问修饰符定义类的用户构造该类的方式。
构造函数是在创建给定类型的对象时执行的类方法。构造函数具有与类相同的名称,它通常初始化新对象的数据成员。
定义一个类。然后使用 new 运算符来实例化该类。在为新对象分配内存之后,new 运算符立即调用类的构造函数。
public class Taxi{
public bool isInitialized;
public Taxi(){
isInitialized = true;
}
}
class TestTaxi{
static void Main(){
Taxi t = new Taxi();
System.Console.WriteLine(t.isInitialized);
}
}
public Taxi(){
isInitialized = true;
}
}
class TestTaxi{
static void Main(){
Taxi t = new Taxi();
System.Console.WriteLine(t.isInitialized);
}
}
不带参数的构造函数称为“默认构造函数”。 无论何时,只要使用 new 运算符实例化对象,并且不为 new 提供任何参数,就会调用默认构造函数。
除非类是 static 的,否则 C# 编译器将为无构造函数的类提供一个公共的默认构造函数,以便该类可以实例化。
结构类型的构造函数与类的构造函数类似,但是 structs 不能包含显式默认构造函数,因为编译器将自动提供一个构造函数。此构造函数会将 struct 中的每个字段初始化为默认值。然而,只有当 struct 用 new 实例化时,才会调用此默认构造函数。
构造函数可以使用 base 关键字来调用基类的构造函数。
public class Manager : Employee{
public Manager(int annualSalary) : base(annualSalary){
//Add further instructions here.
}
}
//Add further instructions here.
}
}
基类的构造函数在执行构造函数块之前被调用。base 关键字可带参数使用,也可不带参数使用。构造函数的任何参数都可用作 base 的参数,或用作表达式的一部分。
在派生类中,如果不使用 base 关键字来显式调用基类构造函数,则将隐式调用默认构造函数(如果有的话)。
如果基类没有提供默认构造函数,派生类必须使用 base 显式调用基构造函数。
构造函数可以使用 this 关键字调用同一对象中的另一构造函数。和 base 一样,this 可带参数使用也可不带参数使用,构造函数中的任何参数都可用作 this 的参数,或者用作表达式的一部分。
构造函数可以标记为 public、private、protected、internal 或 protected internal。这些访问修饰符定义类的用户构造该类的方式。