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#中的尾递归与Continuation详解

    C#中的尾递归与Continuation详解

    这篇文章主要介绍了C#中的尾递归与Continuation详解,本文讲解了递归与尾递归、尾递归与Continuation、Continuation的改进等内容,需要的朋友可以参考下
    2015-04-04
  • 详解C#面相对象编程中的继承特性

    详解C#面相对象编程中的继承特性

    这篇文章主要介绍了C#面相对象编程中的继承特性,是C#入门学习中的基础知识,需要的朋友可以参考下
    2016-01-01
  • C#代码实现解析WTGPS和BD数据

    C#代码实现解析WTGPS和BD数据

    在现代的导航与定位应用中,准确解析 GPS 和北斗(BD)等卫星定位数据至关重要,本文将使用C#语言实现解析WTGPS和BD数据,需要的可以了解下
    2025-06-06
  • 基于C#实现Modbus RTU通信

    基于C#实现Modbus RTU通信

    本文主要介绍了使用C#和Modbus RTU模式与下位机进行通信,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-03-03
  • C#中如何获取文件图标

    C#中如何获取文件图标

    这篇文章主要介绍了C#中如何获取文件图标的相关资料,需要的朋友可以参考下
    2016-03-03
  • C# WinForm程序设计简单计算器

    C# WinForm程序设计简单计算器

    这篇文章主要为大家详细介绍了C# WinForm程序设计简单计算器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • 浅谈C# 序列化与反序列化几种格式的转换

    浅谈C# 序列化与反序列化几种格式的转换

    下面小编就为大家带来一篇浅谈C# 序列化与反序列化几种格式的转换。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • 基于C#实现的轻量级多线程队列图文详解

    基于C#实现的轻量级多线程队列图文详解

    这篇文章主要给大家介绍了关于基于C#实现的轻量级多线程队列的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • c# WPF中如何自定义MarkupExtension

    c# WPF中如何自定义MarkupExtension

    这篇文章主要介绍了c# WPF中如何自定义MarkupExtension,帮助大家更好的理解和学习使用c# wpf,感兴趣的朋友可以了解下
    2021-03-03
  • C# IP地址与整数之间转换的具体方法

    C# IP地址与整数之间转换的具体方法

    这篇文章介绍了C# IP地址与整数之间转换的具体方法,有需要的朋友可以参考一下
    2013-10-10

最新评论