CLR Via C#中构造函数是可以将类型实例初始化为有效状态的特殊方法。构造函数在元数据中通常用.ctor来表示,通过IL代码可以看到。

本文带我们一起来学习CLR Via C#,首要叙述的是关于CLR Via C#的结构函数,期望我们看完此篇文章感觉到收成许多。

浅析CLR Via C#构造函数(CLR C#)  CLR C# 第1张

CLR Via C#中结构函数是能够将类型实例初始化为有用状况的特别办法。结构函数在元数据中一般用.ctor来表明,经过IL代码能够看到。在创立一个类型的实例时,一般分为三步:

1 为实例的数据字段分配内存。

2 创立目标指针和同步索引块。

3 调用类型的实例结构器来设置目标的初始状况。

CLR Via C#中引证类型的实例结构器

在创立一个引证类型的目标是,调用类型的实例结构函数之前,会将目标分配的内存做清零处理,就是说在结构函数中没有显现赋值的一切字段都将设置为0或null。

实例结构函数和一般办法不同,他永久都不能被承继,一切以下的关键字也不能用于实例结构函数(virtual new override sealed abstract)。

一个类中假如没有显现界说任何结构函数,C#编译器将界说一个默许的无参结构函数。

笼统(abstract)类的默许结构函数的拜访修饰符为protected。

结构函数能够初始化字段,不过在C#言语中供给了一种简略的办法,在界说字段的时分直接赋值以初始化。如下:

  1. publicclassUser2
  2. {
  3. privateint_age=25;
  4. privatestring_name="oec2003";
  5. }

像上面那样确实很便利,但假如有好几个现已初始化的实例字段和多个重载的结构函数一起存在的情况下,就应该将实例字段的初始化放到一个公共的结构函数中,其他的结构函数经过this来显现调用该结构函数,这样能够削减代码生成的巨细,看下面的比如。

  1. publicabstractclassUser
  2. {
  3. privateint_age=25;
  4. privatestring_name="oec2003";
  5. privatestring_email="oec2003@gmail.com";
  6. publicUser(Int32age)
  7. {
  8. this._age=age;
  9. }
  10. publicUser(stringname)
  11. {
  12. this._name=name;
  13. }
  14. publicUser(Int32age,Stringname,Stringemail)
  15. {
  16. this._age=age;
  17. this._name=name;
  18. this._email=email;
  19. }

正确的写法应该像下面这样

  1. publicabstractclassUser
  2. {
  3. privateint_age;
  4. privatestring_name;
  5. privatestring_email;
  6. publicUser()
  7. {
  8. _age=25;
  9. _name="oec2003";
  10. _email="oec2003@gmail.com";
  11. }
  12. publicUser(Int32age):this()
  13. {
  14. this._age=age;
  15. }
  16. publicUser(stringname):this()
  17. {
  18. this._name=name;
  19. }
  20. publicUser(Int32age,Stringname,Stringmail):this()
  21. {
  22. this._age=age;
  23. this._name=name;
  24. this._email=email;
  25. }
  26. }

CLR Via C#中值类型的实例结构函数

值类型的实例结构函数和引证类型的有很大不同,在值类型中不能含有无参的结构函数,假如显式指定无参的结构函数将会呈现编译过错。如下面代码会呈现编译过错:

  1. structUser
  2. {
  3. publicInt32_age;
  4. publicString_name;
  5. publicUser()
  6. {
  7. _age=25;
  8. _name="oec2003";
  9. }
  10. }

值类型不能包括无参的结构函数,也不能在值类型中给字段进行初始化,下面的代码也将不能经过编译。

  1. publicstructUser
  2. {
  3. publicInt32_age=25;
  4. publicString_name="oec2003";
  5. }

在值类型中也能够有结构函数,不过该结构函数有必要含有参数,而且要初始化一切的字段。含有参数但没有初始化一切字段的结构函数也不能经过编译。看下面代码:由此可见假如值类型中显现包括结构函数有必要要初始化一切的字段。

假如有多个结构函数,每个结构函数也有必要确保初始化一切的字段,不然不能经过编译。假如值类型中不包括结构函数,实例化时一切字段将设置为0或null。

  1. publicstructUser
  2. {
  3. publicInt32_age;
  4. publicString_name;
  5. //只初始化了_age
  6. publicUser(Int32age)
  7. {
  8. _age=age;
  9. }
  10. publicUser(Int32age,Stringname)
  11. {
  12. _age=age;
  13. _name=name;
  14. }
  15. }

CLR Via C#中类型结构函数

类型结构函数也被称为静态结构函数。静态结构函数能够用于引证类型和值类型。和实例结构函数不同的是静态结构函数在一个类型中永久只要一个,而且不能包括参数。静态结构函数中只能初始化静态字段。

下面代码别离展现在值类型(和实力结构函数不同,值类型中答应显现界说无参的静态结构函数)和引证类型中的静态结构函数。

  1. //值类型
  2. publicstructUser
  3. {
  4. publicstaticInt32_age;
  5. publicstaticString_name;
  6. staticUser()
  7. {
  8. _age=25;
  9. _name="oec2003";
  10. }
  11. }
  12. //引证类型
  13. publicclassUser
  14. {
  15. publicstaticInt32_age;
  16. publicstaticString_name;
  17. staticUser()
  18. {
  19. _age=25;
  20. _name="oec2003";
  21. }
  22. }

为了避免开发人员编写的代码调用静态结构函数,C#编译器会将静态结构函数界说为私有(private)的,而且不能显现地给静态结构函数增加拜访修饰符,假如这么做了会呈现编译过错。

上面讲到过在值类型中不能在界说是给实例字段赋值,不然会编译过错,但能够在界说时给静态字段赋值,看下面代码:

  1. publicstructUser
  2. {
  3. publicstaticInt32_age=25;//正确能够初始化静态字段
  4. publicString_name="oec2003";//过错不能初始实例字段
  5. }

CLR Via C#中静态结构函数不该该去调用基类的静态结构函数,由于静态字段是不会被承继到子类中,所以这样做没有意义。

【修改引荐】

  1. 浅析根据SQL2005的CLR存储进程
  2. 剖析与比照CLR Via C#静态结构函数的功能
  3. 为你解疑:CLR是什么?
  4. linq to sql多表查询浅析
  5. linq to sql多表根底描绘
转载请说明出处
知优网 » 浅析CLR Via C#构造函数(CLR Via C#)

发表评论

您需要后才能发表评论