C#之Class的实例化过程

news2024/9/24 7:21:27

总目录


文章目录

  • 总目录
  • 前言
  • 一、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();
        }

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

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

结语

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/464515.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

平安银行广州分行:以金融赋能慈善 释放更大社会效能

4月8日,平安银行广州分行“为爱徒步 欢乐‘益’起行”活动在广州市白云区钟落潭镇云溪湾新乡村示范带圆满举行。本次活动由平安银行广州分行主办,通过白云区供销合作联社组织,在助农过程中,同时公益捐步,助力建设云溪湾…

gitlab部署及整合Jenkins持续构建(三)sonarqube9.9安装和使用(一步一坑)

文章目录 postgresql13.0安装1、配置postgresql数据库2、进入postgresql创建数据库 代码质量管理平台--sonarqube安装1、前置依赖下载2、安装unzip并解压sonarqube并移动到/usr/local:3、修改sonarqube相应的配置4、新增用户,并将目录所属权赋予该用户&a…

资料链接 网络/系统/华为

网络: 缺省路由 https://www.cnblogs.com/ricksteves/p/9702546.html AC热备 快搜预览中心https://search.ruijie.com.cn:8447/rqs/preview.html?wdeHAiOjE1NDU4NzUxNDcsIm5iZiI6MTU0NTYxNTk0N302018092015272000303LqqZuvMhE7V7Ygl6r5RWsTHbWazT BGP https:…

nextjs 错误日志收集

最近用nextjs开发一款房产渠道管理的系统,从开始的项目管理,到价格单管理、订单管理、团队管理、中介管理、个人信息管理...等等功能越来越多的时候,前端偶现的问题不容易发现,造成了不必要的麻烦,就想搞个错误日志收集…

地理信息系统有哪些SCI期刊推荐? - 易智编译EaseEditing

以下是几本地理信息系统领域的SCI期刊推荐: International Journal of Geographical Information Science: 这是一个国际性的期刊,它涵盖了地理信息科学的所有领域,包括地图学、遥感、空间分析、地理信息系统、地理信息技术、地球信息学等等…

被chatGPT割了一块钱韭菜

大家好,才是真的好。 chatGPT热度一直上升,让我萌生了一个胆大而创新的想法, 把chatGPT嵌入到Notes客户机中来玩。 考虑到我已经下载了一个chatGPT的Notes应用(请见《ChatGPT APIs for HCL DOMINO》),想着…

Shell编程之条件语句

目录 一、条件测试 1)test命令 ​编辑 2)文件测试 常用的测试操作符 ​编辑 4)整数值比较 常用的测试操作符 6)逻辑测试 常用的测试操作符 7)三元运算符 二、if语句 1)单分支结构 2&#xff09…

时序预测 | MATLAB实现WOA-GRU鲸鱼算法优化门控循环单元时间序列预测

时序预测 | MATLAB实现WOA-GRU鲸鱼算法优化门控循环单元时间序列预测 目录 时序预测 | MATLAB实现WOA-GRU鲸鱼算法优化门控循环单元时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现WOA-GRU鲸鱼算法优化门控循环单元时间序列预测 基于鲸鱼算法优化门…

必须要知道的hive调优知识(下)

Hive如果不用参数调优,在map和reduce端应该做什么 1、map阶段优化 Map阶段的优化,主要是确定合适的map数。那么首先要了解map数的计算公式 num_reduce_tasks min[${hive.exec.reducers.max}, (${input.size}/${hive.exec.reducers.bytes.per.reducer…

软件测试:测试一个网站

一、软件测试的原则 1、软件测试应尽早执行,并贯穿于整个软件生命周期 2、软件测试应追溯需求 3、测试应由第三方来构造 4、穷举测试是不可能的,要遵循 Good-enough 原则 5、必须确定预期输出(或结果) 6、必须彻底检查每个测试结果 7、…

常见电路20问,看看你能回答多少

1、什么是电路? 电路是由电子元件、导线和其他元件组成的路径,可以控制电子流的流动。电路可以用于将电能转化为其他形式的能量,例如光能、声能、机械能等等。电路还可以用于控制电子设备的操作,例如计算机、通信设备、车辆控制等…

来字节跳动实习,有机会发Nature子刊

来字节跳动实习,还能有机会发 Nature 子刊? 没错,ByteDance Research 与北京大学物理学院陈基课题组合作的一项研究近期登上了国际顶级刊物 Nature Communications。作者之中,共同一作伟中就是字节跳动的实习生同学,来…

python数据分析:人口普查可视化,看看哪个地区人口最多

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 今天案例难度指数: ☆☆☆ 准备 环境使用: 在开始写我们的代码之前,我们要准备好运行代码的程序 Anaconda (python3.9) –> 识别我们写的代码 开发工具: jupyter notebook –> 代…

ChatGPT在智能客服产品落地探讨

AI语言模型中的ChatGPT近期在互联网平台上引起了广泛的讨论。那么,如果想将这个大型语言模型应用在智能客服产品中,或者将其在ToB SaaS应用软件领域落地,应该采用哪种构建策略? 现在ChatGPT这个大型语言模型已经在各种平台获得了广…

初学Python来用它制作一个简单的界面

前言 很多刚开始学习python的宝子,就想着自己开始琢磨一些界面,但是吧很多都是有点难度的,自己又琢磨不透,只能把代码复制粘贴运行 现在就带你们来了解一个制作简单界面的代码 ttkbootstrap 是一个基于 tkinter 的界面美化库&am…

CMake自动按目录结构编译Protobuf代码

在使用CMake构建C项目时,如果有使用Protobuf,CMake提供了一个FindProtobuf.cmake模块来处理PB,其使用方法如下: find_package(Protobuf REQUIRED) protobuf_generate_cpp(GENERATED_SRC GENERATED_HEADER "pb/t.proto"…

rancher Prometheus添加exporter监控

mysql 用docker启动exporter docker run -d \-p 9104:9104 \--network my-mysql-network \-e DATA_SOURCE_NAME"mysqlexporter:mysqlexporter(192.168.147.46:3306)/" \prom/mysqld-exporter给集群中的prometheus添加该exporter的数据 First, you will need to c…

力劲塑机:用CRM“塑造”数字化能力

你知道吗?从手机到电脑,从暖气到扶梯,从家用电器到汽车、摩托车,从眼镜、手表到拉链、纽扣,这些物品的生产过程都离不开压铸和注塑工艺。如果说压铸和注塑这个几百亿的产业带动了几万亿的市场,一点也不夸张…

Vue3+axios+Mock.js实现登录功能

文章目录 前言一、Vue3 Element Plus Mock.js axios实现登录功能1.登录页面配置路由、编写表单内容2.编写表单校验规则3.登录触发表单预验证4.Mock.js模拟登录请求 二、面试题1.前端登录流程2.token是什么? 前言 最近学习了Vue3,这篇文章主要分享一下…