C#之Class的实例化过程

总目录



前言

在平常开发的过程中,经常需要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();
        }

在这里插入图片描述
通过以上案例可知实例化过程为:

  • 先初始化子类的静态成员:静态字段=》静态构造函数
  • 再实例化子类的实例成员:实例字段
  • 再初始化父类的静态成员:静态字段=》静态构造函数
  • 再实例化父类的实例成员:实例字段
  • 再实例化父类的构造函数
  • 最后实例化子类的构造函数

结语

以上就是本文的内容,希望以上内容可以帮助到您,如文中有不对之处,还请批评指正。

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#实例化多级JSON对象可以使用不同的方法。 一种方法是使用DataContractJsonSerializer类来将JSON数据转换为实体类。可以创建一个泛型方法,接受JSON字符串参数并返回带有指定类型的实体类列表。首先,实例化DataContractJsonSerializer对象,并将待序列化的对象类型传入构造函数。然后,将JSON字符串包装在一个内存流中,并使用ReadObject方法将其反序列化为对象。最后,将反序列化后的对象转换为指定类型的实体类列表,并返回。 另一种方法是使用JsonConvert类的DeserializeObject方法来将JSON字符串转换为指定类型的实体类。可以使用File.ReadAllText方法从文件中读取JSON字符串,并将其作为参数传递给DeserializeObject方法。最后,将返回的对象转换为指定类型的根对象。 此外,还可以使用DataContractJsonSerializer类的WriteObject方法将实体类转换为JSON字符串。首先,实例化DataContractJsonSerializer对象,并将待序列化的对象类型传入构造函数。然后,创建一个内存流,并使用WriteObject方法将实体类写入内存流中。最后,从内存流中读取JSON字符串,并返回。 综上所述,以上是实例化多级JSON对象的几种常见方法。具体使用哪种方法取决于您的需求和偏好。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [C# json和实体类相互转化](https://blog.csdn.net/qq_41009232/article/details/124297804)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [多级嵌套json反序列化为实体对象 c#](https://blog.csdn.net/qq_33782655/article/details/114664389)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值