C#中的构造函数

原文地址:http://www.dingos.cn/index.php?topic=1070.0


【构造函数】
每个类都具有一个构造函数:一个与类共享相同名称的方法。根据类定义创建对象时会调用构造函数。构造函数通常设置在类中定义的变量的初始值。如果初始值为数值数据类型值 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();
      }
}

【使用构造函数注意事项】
  • 一个类的构造函数名与类名同名。
  • 构造函数没有返回值(不能有返回值,也不能是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;
      }
}

可以用默认或特定的初始值创建类的对象
CoOrds p1 = new CoOrds();
CoOrds p2 = new CoOrds(5, 3);

如果类没有默认构造函数,将自动生成一个构造函数,并且将用默认值来初始化对象字段。

也可以用实例构造函数来调用基类的实例构造函数。类构造函数可通过初始值设定项来调用基类的构造函数。
class Circle : Shape{
      public Circle(double radius) : base(radius, 0) { }
}

【私有构造函数】
私有构造函数是一种特殊的实例构造函数。它通常用在只包含静态成员的类中。如果类具有一个或多个私有构造函数而没有公共构造函数,则其他类(除嵌套类外)无法创建该类的实例。
class NLog{
      // Private Constructor:
      private NLog() { }

      public static double e = System.Math.E;   //2.71828...
}

声明空构造函数可阻止自动生成默认构造函数。注意,如果不对构造函数使用访问修饰符,则在默认情况下它仍为私有构造函数。但是,通常显式地使用 private 修饰符来清楚地表明该类不能被实例化。

当没有实例字段或实例方法(如 Math 类)时或者当调用方法以获得类的实例时,私有构造函数可用于阻止创建类的实例。如果类中的所有方法都是静态的,可考虑使整个类成为静态的。

【静态构造函数】
静态构造函数用于初始化任何静态数据,或用于执行仅需执行一次的特定操作。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数。
class SimpleClass{
            // Static constructor
            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();
      }
}

【重载构造函数】
★ 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. 限定被相似的名称隐藏的成员
public Employee(string name, string alias) {
      this.name = name;
      this.alias = alias;
}

2. 将对象作为参数传递到其他方法
CalcTax(this);

3. 声明索引器
public int this [int param]{
      get { return array[param];   }
      set { array[param] = value; }
}

注意:由于静态成员函数存在于类一级,并且不是对象的一部分,因此没有 this 指针。在静态方法中引用 this 是错误的。

【创建对象】
当创建一个类时,只是创建了一种新的数据类型。对象是类的一个实例。

使用下列语法可创建对象:
new   构造函数

关键字 new 通常称为创建运算符,用于分配对象内存,并将该内存初始化为缺省值。

一旦 new 完成分配和初始化内存,它就将调用构造函数来执行对象初始化

【使用构造函数】
构造函数是在创建给定类型的对象时执行的类方法。构造函数具有与类相同的名称,它通常初始化新对象的数据成员。

定义一个类。然后使用 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);
      }
}

不带参数的构造函数称为“默认构造函数”。 无论何时,只要使用 new 运算符实例化对象,并且不为 new 提供任何参数,就会调用默认构造函数。

除非类是 static 的,否则 C# 编译器将为无构造函数的类提供一个公共的默认构造函数,以便该类可以实例化。

结构类型的构造函数与类的构造函数类似,但是 structs 不能包含显式默认构造函数,因为编译器将自动提供一个构造函数。此构造函数会将 struct 中的每个字段初始化为默认值。然而,只有当 struct 用 new 实例化时,才会调用此默认构造函数。

构造函数可以使用 base 关键字来调用基类的构造函数。
public class Manager : Employee{
      public Manager(int annualSalary) : base(annualSalary){
            //Add further instructions here.
      }
}

基类的构造函数在执行构造函数块之前被调用。base 关键字可带参数使用,也可不带参数使用。构造函数的任何参数都可用作 base 的参数,或用作表达式的一部分。

在派生类中,如果不使用 base 关键字来显式调用基类构造函数,则将隐式调用默认构造函数(如果有的话)。

如果基类没有提供默认构造函数,派生类必须使用 base 显式调用基构造函数。

构造函数可以使用 this 关键字调用同一对象中的另一构造函数。和 base 一样,this 可带参数使用也可不带参数使用,构造函数中的任何参数都可用作 this 的参数,或者用作表达式的一部分。

构造函数可以标记为 public、private、protected、internal 或 protected internal。这些访问修饰符定义类的用户构造该类的方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜晚回家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值