总目录
文章目录
- 总目录
- 前言
- 一、class的成员
- 二、实例化顺序(无继承情况)
- 1.声明时进行初始化
- 2.在构造函数中初始化
- 三、实例化顺序(有继承情况)
- 结语
前言
在平常开发的过程中,经常需要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();
}
通过以上案例可知实例化过程为:
- 先初始化子类的静态成员:静态字段=》静态构造函数
- 再实例化子类的实例成员:实例字段
- 再初始化父类的静态成员:静态字段=》静态构造函数
- 再实例化父类的实例成员:实例字段
- 再实例化父类的构造函数
- 最后实例化子类的构造函数
结语
以上就是本文的内容,希望以上内容可以帮助到您,如文中有不对之处,还请批评指正。