C# 构造函数

我们知道构造函数分为 不带参构造函数和带参构造函数,不带参构造函数是默认的构造函数,他们在使用过程中有什么样的区别?各自有什么样的作用?
 
 
 
概要回答:
 
 
共同点:都是实例化对象,初始化数据的
构造函数与类同名。
除了名字外,构造函数的另一个特别之处是没有返回值类型,这与返回值类型为void的函数不同。
 
实例说明:
有一个类Monitor它有属性
String height;
String width; public Monitor(){} public Monitor(String height,String width){} 有一个空参的和一个有参的构造的方法 在main方法里我做初始化动作 Monitor monitor=new Monitor();//C#中,类的实例化就是创建对象的过程,使用关键字new来创建。 这个构造只是把显示器这个对象创造出来了,它的属性就没有值,也可以再手动给它赋上值 如:monitor.height=100; monitor.width=200; 用有参的就不一样了,少很多事 Monitor monitor2=new Monitor("100","200"); 在这里我只要把想放进去的参数直接放进去就能给我的属性赋上值,是不是省了很多事? 这就是它的优势!

静态构造函数

  1. 静态构造函数没有修饰符修饰(public,private)。
  2. 静态构造函数没有参数。
  3. 静态构造函数前面必须是static 关键字。
  4. 静态构造函数中不能实例化实例变量。
  5. 静态函数的调用时机,是在类被实例化或者静态成员被调用的时候进行调用,并且是由.net框架来调用静态构造函数来初始化静态成员变量。
  6. 一个类中只能有一个静态构造函数。
  7. 无参数的静态构造函数和无参数的构造函数是可以并存的。因为他们一个属于类级别,一个属于实例级别,并不冲突。
  8. 静态构造函数只会被执行一次。并且是在特点5中的调用时机中进行调用。
  9. 就像如果没有在类中写构造函数,那么框架会为我们生成一个构造函数,那么如果我们在类中定义了静态变量,但是又没有定义静态构造函数,那么框架也会帮助我们来生成一个静态构造函数来让框架自身来调用。
如:

 



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

 

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

例如,下面的情况: 

 

  1. class Car {  
  2. private string description;   
  3. private uint nWheels;  
  4.  public Car(string description, 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#有一个特殊的语法,称为构造函数初始化器,可以实现此目的:

 

  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个参数的构造函数(但在本例中,因为带一个参数的构造函数没有代码,所以没有区别)。

 

 

 

构造函数是指在创建类的对象时必须执行的一系列操作,他也可以被重载,在创建类时可以根据实际参数情况合理调用一个构造函数。这里就有一个问题了:如果每一个构造函数都要执行一些特定的操作,那我们不得不在每一个构造函数里面粘贴执行这些特定操作的代码,这就造成了代码的重复。

 

 

 

解决办法是仅在缺省实例构造函数中放入这一段代码,让每个重载实例构造函数通过构造函数初始化器来调用它。

 

 

 

: this ([<形参列表>])

 

 

 

用法示例:

 

class Account
{
 private decimal balance;
 private decimal interestRate;
 private string holderName;

 

 public Account(decimal initialBalance, decimal initialInterestRate, string initialHolderName)
 {
 balance = initialBalance;
 interestRate = initialBalance;
 holderName = initialHolderName;
 }

 

 public Account(string initialHolderName)
 : this(0, 0, initialHolderName)
 {
 Console.WriteLine("Only initial holder name supplied.");
 }

 

 public Account()
 : this(0, 0, "Not assigned yet.")
 {
 Console.WriteLine("Note: no initial information supplied.");
 }
}

 

 

 

上例中,Account类的构造函数被重载,无论调用哪一个重载实例构造函数,下面这一段代码总被执行:

 

public Account(decimal initialBalance, decimal initialInterestRate, string initialHolderName)
 {
 balance = initialBalance;
 interestRate = initialBalance;
 holderName = initialHolderName;
 }

 

使用构造函数初始化器,其参数表达式有几点要注意:

 

构造函数初始化器必须位于它的实例构造函数形式参数作用域之内,如;

 

 public Account(string initialHolderName)
 : this(0, 0, initialHolderName)

 

是可行的,而下面

 

 public Account(string initialHolderName)
 : this(0, this.interestRate, initialHolderName)

 

无效,this引用了一个实例变量,但在这里,任何对实例变量的引用是无效的,而且在这里不能使用this关键字。

 

最后一点是,构造函数初始化器的参数列表不能与他所应用的实例构造函数的形式参数列表匹配,如下面的代码错误:

 

class test

 

{

 

 ...

 

 public test(int initialValue) : this (10) //无效,initialValue与10匹配

 

 {...}

 

 ...

 

}

 

错误的根本原因在于形成了一个无限自身调用链。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值