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


posted @ 2012-01-02 18:59  sdgxboy  阅读(389)  评论(0编辑  收藏  举报