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运行结果如下 :