C#关于构造函数初始化器的使用

有时,在一个类中有几个构造函数,以容纳某些可选参数,这些构造函数都包含一些共同的代码。

例如,下面的情况: 

[csharp]  view plain copy
  1. class Car {  
  2. private string description;   
  3. private uint nWheels;  
  4.  public Car(string model, uint nWheels)   
  5. {   
  6.   
  7.     this.description = description;   
  8.   
  9.     this.nWheels = nWheels;   
  10.   
  11. }   
  12. public Car(string description)   
  13. {   
  14.   
  15.     this.description = description;   
  16.   
  17.     this.nWheels = 4;   
  18.   
  19. // etc.   
  20. }  

这两个构造函数初始化了相同的字段,显然,最好把所有的代码放在一个地方。C#有一个特殊的语法,称为构造函数初始化器,可以实现此目的:

[csharp]  view plain copy
  1. class Car {  
  2.   
  3. private string description;  
  4.   
  5. private uint nWheels;  
  6.   
  7. public Car(string description, uint nWheels)  
  8.   
  9. {  
  10.   
  11.     this.description = description;  
  12.   
  13.     this.nWheels = nWheels;  
  14.   
  15.     }  
  16.   
  17.     public Car(string description) : this(description, 4)  
  18.   
  19.     { }  
  20.   
  21.     // etc  
  22.   
  23. }  


这里,this关键字仅调用参数最匹配的那个构造函数。注意,构造函数初始化器在构造函数之前执行。现在假定运行下面的代码: Car myCar = new Car("Proton Persona"); 在本例中,在带一个参数的构造函数执行之前,先执行带2个参数的构造函数(但在本例中,因为带一个参数的构造函数没有代码,所以没有区别)。

C#构造函数初始化符可以包含对同一个类的另一个构造函数的调用(使用前面介绍的语法),也可以包含对直接基类的构造函数的调用(使用相同的语法,但应使用base关键字代替this)。初始化符中不能有多个调用。 在C#中,构造函数初始化符的语法类似于C++中的构造函数初始化列表,但C++开发人员要注意,除了语法类似之外,C#初始化符所包含的代码遵循完全不同的规则。可以使用C++初始化列表指定成员变量的初始值,或调用基类构造函数,而C#初始化符中的代码只能调用另一个构造函数。这就要求C#类在构造时遵循严格的顺序,但C++就没有这个要求。这个问题详见第4章,那时就会看到,C#强制遵循的顺序只不过是良好的编程习惯而已。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值