C#中Class的实例化过程详解

 更新时间:2024年09月29日 09:08:56   作者:鲤籽鲲  
文章详细阐述了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实例化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#设计模式之工厂模式

    C#设计模式之工厂模式

    本文详细讲解了C#设计模式之工厂模式,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • C#多线程之任务的用法详解

    C#多线程之任务的用法详解

    本文详细讲解了C#多线程之任务的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • C# 各种导出的方法总结

    C# 各种导出的方法总结

    本篇文章主要介绍了C# 各种导出方法的相关知识,具有很好的参考价值。下面跟着小编一起来看下吧
    2017-05-05
  • C#学习基础概念二十五问

    C#学习基础概念二十五问

    C#学习基础概念二十五问...
    2007-04-04
  • C#实现飞行棋游戏

    C#实现飞行棋游戏

    这篇文章主要为大家详细介绍了C#实现飞行棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • C# FTP操作类分享

    C# FTP操作类分享

    这篇文章主要为大家分享了C# FTP操作类的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • C#中String和StringBuilder的简介与区别

    C#中String和StringBuilder的简介与区别

    今天小编就为大家分享一篇关于C#中String和StringBuilder的简介与区别,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • C#程序打成 一键安装包-InstallShield教程

    C#程序打成 一键安装包-InstallShield教程

    最近找到个打包工具,挺不错的。下面简单的介绍下使用方法
    2012-01-01
  • 利用C#编写一个Windows服务程序的方法详解

    利用C#编写一个Windows服务程序的方法详解

    这篇文章主要为大家详细介绍了如何利用C#编写一个Windows服务程序,文中的实现方法讲解详细,具有一定的参考价值,感兴趣的可以了解一下
    2023-03-03
  • 利用C#实现合并Word文档功能

    利用C#实现合并Word文档功能

    合并Word文档可以快速地将多份编辑好的文档合在一起,避免复制粘贴时遗漏内容,以及耗费不必要的时间。本文将分为以下两部分介绍如何通过C#合并Word文档,并附上VB.NET代码供大家参考,希望对大家有所帮助
    2022-12-12

最新评论