C#中Class的实例化过程详解
作者:鲤籽鲲
文章详细阐述了C#中类的成员,包括静态字段、静态构造函数、实例字段等的初始化顺序,在无继承情况下,实例化分为声明时初始化和构造函数中初始化两种,分别有明确的执行顺序,需要的朋友可以参考下
前言
在平常开发的过程中,经常需要new 一个class,但是呢,由于忽略一些基础语法知识,不了解各成员的实例化顺序,导致代码中一些不必要的错误,所以在此做个总结!
一、class的成员
class 中的成员有:字段、常量、属性、方法、构造函数、事件、终结器、索引器、运算符、嵌套类型
关于成员详情可查:成员(C# 编程指南)
另外本文实例化过程会着重说明:静态字段,静态构造函数,实例字段,属性,构造函数 等几个常用成员的初始化过程。
二、实例化顺序(无继承情况)
在当前实例化的过程中也会分两种情况,
- 一种就是直接在声明变量的时候就初始化,如
private object obj = new object();
- 另一种就是申明的时候只管声明,初始化的工作均在构造函数中完成,如
private object obj ;
1.声明时进行初始化
代码如下(示例):
//该类仅用于打印实例化时候的信息,用于标记过程 public class Msg { public Msg(string info) { Console.WriteLine(info); } }
public class User { public static Msg StaticField = new Msg("静态字段初始化"); private Msg privateField = new Msg("私有字段初始化"); private Msg _info; public Msg Info { get { Console.WriteLine("进入get设置器"); return _info; } set { Console.WriteLine("进入set设置器"); _info = value; } } static User() { Console.WriteLine("静态构造函数正在执行"); } public User() { Console.WriteLine("构造函数正在执行"); } }
通过实例化User类,观察实例化过程:
static void Main(string[] args) { User user = new User(); Console.WriteLine("获取属性"+user.Info); user.Info = new Msg("使用属性"); Console.ReadLine(); }
通过以上案例可知实例化过程为:
- 静态字段
- 静态构造函数
- 实例字段
- 构造函数
- 属性则是在使用时会被初始化
2.在构造函数中初始化
在声明时不再初始化,统一在构造函数中初始化
public class User { public static Msg StaticField ; private Msg privateField; private Msg _info; public Msg Info { get { Console.WriteLine("进入get设置器"); return _info; } set { Console.WriteLine("进入set设置器"); _info = value; } } static User() { Console.WriteLine("静态构造函数正在执行"); } public User() { Console.WriteLine("构造函数正在执行"); StaticField = new Msg("静态字段初始化"); privateField = new Msg("实例字段初始化"); } }
通过以上案例可知实例化过程为:
- 在构造函数外初始化的顺序,仍旧是 静态字段=》静态构造函数=》实例字段=》构造函数
- 在构造函数之内的初始化顺序,就是按照代码的编写顺序执行。
- 属性则是在使用时会被初始化
三、实例化顺序(有继承情况)
public class User { public static Msg StaticField = new Msg("父类 静态字段初始化"); private Msg privateField = new Msg("父类 实例字段初始化"); private Msg _info; public Msg Info { get { Console.WriteLine("进入get设置器"); return _info; } set { Console.WriteLine("进入set设置器"); _info = value; } } static User() { Console.WriteLine("父类 静态构造函数正在执行"); } public User() { Console.WriteLine("父类 构造函数正在执行"); } } public class VipUser : User { public static Msg StaticVipField = new Msg("子类 静态字段初始化"); private Msg privateVipField = new Msg("子类 实例字段初始化"); private Msg _vipInfo; public Msg VipInfo { get { Console.WriteLine("进入get设置器"); return _vipInfo; } set { Console.WriteLine("进入set设置器"); _vipInfo = value; } } public VipUser() { Console.WriteLine("子类 构造函数初始化完成"); } }
static void Main(string[] args) { VipUser user = new VipUser(); Console.ReadLine(); }
通过以上案例可知实例化过程为:
- 先初始化子类的静态成员:静态字段=》静态构造函数
- 再实例化子类的实例成员:实例字段
- 再初始化父类的静态成员:静态字段=》静态构造函数
- 再实例化父类的实例成员:实例字段
- 再实例化父类的构造函数
- 最后实例化子类的构造函数
结语
到此这篇关于C#中Class的实例化过程详解的文章就介绍到这了,更多相关C# Class实例化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!