c#对象初始化顺序实例分析

作者:McJeremy&Fan 时间:2023-04-08 20:47:09 

本文实例分析了c#对象初始化顺序。分享给大家供大家参考。具体如下:


using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1 {
 class Program {
   static void Main(string[] args) {
     A a = new B();
     Console.ReadLine();
   }
 }
 class A {
   //调用到这个构造函数时:x=1,y=0
   public A() {
     //该函数在B类中被重载,因此输出 x=1,y=0
     Console.WriteLine("在A类的构造函数中");
     PrintFields();
   }
   public virtual void PrintFields() { }
 }
 class B : A {
   //派生类变量/静态成员的执行顺序优于基类
   //先变量,因此,x=1,y=0
   int x = 1;
   int y;
   //后构造函数,此时,先调用基类构造函数
   public B() {
     //运行到这里时,A类构造函数已经执行完毕
     y = -1;
     Console.WriteLine("在B类的构造函数中");
     //此时 x=1,y=-1
     PrintFields();
   }
   public override void PrintFields() {
     Console.WriteLine("x={0},y={1}", x, y);
   }
 }
}

这里备忘一下c#对象初始化顺序及C++对象初始化顺序:

C#对象初始化

1. 先变量后构造函数。变量先被初始化,然后构造函数被执行

2. 先静态化后实例化。当一个类被访问时,静态变量和构造函数最先被初始化.接着是对象的实例化变量和构造函数被初始化

3. 先派生类后基类。对于变量和静态构造函数,派生对象在基对象之前被初始化.比如C类派生自B类,B类派生自A类,那么变量和静态构造函数被初始化次序是C-B-A.

4. 除了实例构造函数。对于实例构造函数,基类构造函数在派生类构造函数之前执行,实例构造函数被执行次序是A-B-C.

5. 不要假定变量的次序。Fields依据它们在源文件中的声明的顺序依次初始化.然而,自从程序员和工具可以随意安排变量的声明后,你不应该在依靠变量任何特别的次序初始化

6. 对虚方法用两个阶段的构建。避免从一个构造器调用虚方法. 如果在初始化一个对象时需要调用一些虚方法,应在完整构造该对象的地方使用两阶段的构建,并随后调用已构造对象的初始化方法。

C++构造函数调用顺序

1. 如果类里面有成员类,成员类的构造函数优先被调用;

2. 创建派生类的对象,基类的构造函数优先被调用(也优先于派生类里的成员类);

3. 基类构造函数如果有多个基类,则构造函数的调用顺序是某类在类派生表中出现的顺序而不是它们在成员初始化表中的顺序;

4. 成员类对象构造函数如果有多个成员类对象,则构造函数的调用顺序是对象在类中被声明的顺序而不是它们出现在成员初始化表中的顺序;

5. 派生类构造函数,作为一般规则派生类构造函数应该不能直接向一个基类数据成员赋值而是把值传递给适当的基类构造函数,否则两个类的实现变成紧耦合的(tightly coupled)将更加难于正确地修改或扩展基类的实现。(基类设计者的责任是提供一组适当的基类构造函数)

希望本文所述对大家的C#程序设计有所帮助。

标签:c#,对象,初始化
0
投稿

猜你喜欢

  • springboot集成RestTemplate及常见的用法说明

    2023-02-17 20:02:27
  • Java中接口和抽象类的区别详解

    2022-09-28 15:21:19
  • Android仿微信发送语音消息的功能及示例代码

    2021-07-06 19:31:39
  • Android录音时获取分贝值的方法代码实例

    2022-03-03 04:15:12
  • java循环练习的简单代码实例

    2023-11-23 21:20:28
  • 深入理解Android热修复技术原理之so库热修复技术

    2023-11-19 15:02:10
  • PowerManagerService之唤醒锁的使用获取创建示例解析

    2021-09-29 06:42:22
  • Java中文件操作功能小结

    2023-06-20 03:32:28
  • Springboot+SpringSecurity+JWT实现用户登录和权限认证示例

    2021-11-14 11:06:11
  • Android引导页面的简单实现

    2023-08-06 04:24:32
  • C#通过属性名称获取(读取)属性值的方法

    2023-10-10 11:49:06
  • Spring Boot @Conditional注解用法示例介绍

    2023-04-18 22:51:51
  • Java通过索引值实现约瑟夫环算法

    2021-09-28 22:33:48
  • Android 使用FragmentTabHost实现底部菜单功能

    2021-06-11 12:31:52
  • c# 值类型实例构造器

    2023-12-23 16:10:10
  • 如何处理maven仓库中后缀LastUpdated文件

    2022-01-21 22:15:44
  • SpringBoot 3.0 新特性内置声明式HTTP客户端实例详解

    2022-11-25 13:47:20
  • 以Spring Boot的方式显示图片或下载文件到浏览器的示例代码

    2021-08-16 18:44:37
  • Java多线程实现Runnable方式

    2022-06-29 17:09:46
  • SpringBoot实现Excel文件批量上传导入数据库

    2023-11-29 11:13:44
  • asp之家 软件编程 m.aspxhome.com