c#构造器的一点理解(一)

来源:互联网 发布:2333什么意思网络用语 编辑:程序博客网 时间:2024/06/05 18:03

c#的构造器分为三种

类型构造器

实例构造器 (引用类型,和值类型分别进行讲述)


引用类型的实例构造器 :

在创建类的实例的时候有下边三个步骤要做  1  分配数据字段的的内存 2 分配实例的系统开销内存(实例的指针,以及同步块索引) 2  调用构造器初始化实例的状态。

1 构造器不能被继承

2 如果没有显示声明类的构造器,那么clr自动构建一个无参的构造器。

3 构造器的可访问性为public。

4 一个类可以有多个实例构造器。 可以有不同的访问级别。

5 类的构造器在访问从基类继承过来的字段之前,必须调用基类的构造器。

6c#编译器提供了一种便利的语法: 为字段类型初始话 。 

例如 : string str = “fuck” ;//碰到这种情况,要和构造函数联系起来考虑, 没有多大的实际意义,但是对你理解clr有好处

相当于string str ; 然后在构造函数里面   给字段赋值 str = “fuck” ;

       

这样那,你如果定义了多个构造器,那么在每个构造器里面都有 str = “fuck” ;这句话,会造成程序集变大,为了避免这种情况,我们在写程序的时候可以定义一个基准的构造函数,在这个构造函数里面对每个构造函数都要操作的字段进行赋值 ,然后在其他的构造函数里面调用这个基准的构造函数。具体的情况请参考下列的代码?

//学习this来调用构造函数sealed class secsonClass:baseClass{private string age ; //年纪private string height; //体重private string name  ;public secsonClass() {age = "10" ;height = "100" ;name ="cicnor";}public secsonClass(string name):this()   // 把这个函数看明白了,我上边说的那个情况你就明白了。{name ="cicn";}}
引用类型的构造器函数我学习的过程的代码如下,请大家参考
using System;using System.Data;using System.Text;namespace  myStu{/*   c#中实例构造器的学习作用 : 初始化类的实例 ,使类的实例处于一个可以使用的状态。调用 : 当类进行实例化的时候调用构造器,具体点说就是使用new的时候。构造器被克隆的时候是不调用构造器的注意的几点  1  构造函数不能被继承。2  继承类的构造函数可以指定父类的构造函数3  如果继承类的构造函数没有指定父类的构造函数,那么就调用父类的无参构造函数。*/    /*    当实例化继承类的实例时候 ,1 首先是调用的基类的类型构造函数,            2 然后调用实例构造器,            3 最后调用子类的实例构造函数。如果继承类也有类型构造器,那么首先是调用继承类的类型构造器 顺序如下1继承类的类型构造器  (为什么首先调用继承类的类型构造器??? 有时间解决一下这个问题)2基类的类型构造器baseClass3基类的构造器3继承类的构造器*/class programe{   static void Main(string[] arg){try{  sonClass obj = new sonClass("") ;  }catch (Exception err){Console.WriteLine(err.Message);}}}    internal class baseClass    {static string className;string instanceName;//基类的默认构造器public baseClass(){instanceName = "" ;Console.WriteLine("基类的构造器") ;}//基类的带参构造器public baseClass(string name){instanceName = name ;Console.WriteLine("基类的带参构造器") ;}//类型构造器static baseClass(){className = "baseClass" ;Console.WriteLine("基类的类型构造器" + className) ;//instanceName = "" ;}    }//internal class sonClass :baseClass{//构造器不能被继承 必须指定子类的构造器调用父类的那个构造器,可以隐士调用,也可以显示调用父类的构造器。//注意 : 这样不是说明构造器可以被继承,而是说显示调用了父类的那个构造器。 public sonClass(string name ){Console.WriteLine("继承类的构造器") ;}static  sonClass(){Console.WriteLine("继承类的类型构造器") ;}}//学习this来调用构造函数sealed class secsonClass:baseClass{private string age ; //年纪private string height; //体重private string name  ;        //如果父类有多个构造函数,那么这里是调用的那个基类的构造函数那?//经过试验证明  这里隐式调用的是父类的无参构造函数。//总结一句话 : 构造函数都会隐式调用父类的无参构造器。除非显示指定父类的构造器。public secsonClass( ) {age = "10" ;height = "100" ;name ="cicnor";}//这里有一个疑问 , 显示调用了,secsonClass 这个函数,我还可以显示调用基类的构造函数吗?public secsonClass(string name):this()  {name ="cicn";}}}

运行结果如下 :

---------- run ----------=============== 运行C#程序 Write By  森晋科技===============继承类的类型构造器基类的类型构造器baseClass基类的构造器继承类的构造器=============== 程序结束 Copy cicnor 2001===============Output completed (0 sec consumed) - Normal Termination


原创粉丝点击