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

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基类的类型构造器baseClass 3基类的构造器 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值