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#程序设计有所帮助。


猜你喜欢
- 本文和大家一起写一个Android图片轮播控件,供大家参考,具体内容如下1. 轮播控件的组成部分 我们以
- 一般情况下是不可以用static修饰类的。如果一定要用static修饰类的话,通常static修饰的是匿名内部类。在一个类中创建另外一个类,
- 委托这个东西不是很好理解,可是工作中又经常用到,你随处可以看到它的身影,真让人有一种又爱又恨的感觉,我相信许多人被它所困扰过。一提到委托,如
- 这两天我写了一个测试c++异常处理机制的例子,感觉有很好的示范作用,在此贴出来,给c++异常处理的初学者入门。本文后附有c++异常的知识普及
- Android实现界面内嵌多种卡片视图,具体内容如下效果如图所示:1.选择某个界面时,对应的第几个小圆点亮:通过selector制造圆点和进
- 什么是Pub-Sub发布订阅是一种设计模式,它允许应用程序组件之间进行松散耦合。其实订阅发布设计中主要是发布者生成事件通道,用于在不了解任何
- 目录一 、EasyExcel简介二、常用注解三、依赖四、监听五、接口导入Excel六、接口 导出Excel (HttpServletResp
- 本文实例为大家分享了DatePicker日期滚动选择的使用,供大家参考,具体内容如下效果图为:1.dialog_date.xml:<?
- 一、了解面向对象1、概念基本理解:1)、一个个体可以看做是一个对象,例如:人这个个体;2)、有共同属性的一类作为一个个体,例如:学生、白领、
- Command 常用属性CommText 要下达至数据源的命令CommanTimeout 出错等待时间Command 三种方法Execute
- 我们知道,Spring可以通过包扫描将使用@Component注解定义的Bean定义到容器中。今天就来探究下他实现的原理。首先,找到@Com
- 本文实例讲述了java实现List中对象排序的方法。分享给大家供大家参考,具体如下:package com.test; import jav
- public static String getCharset(File file) { &n
- init和clinit区别①init和clinit方法执行时机不同init是对象构造器方法,也就是说在程序执行 new 一个对象调用该对象类
- 创建maven web项目有两种方式,一种是使用骨架方式,一种是不使用骨架的方式创建方式一、使用骨架的方式1.打开idea,按照步骤创建一个
- 通过zookeeper实现分布式锁1、创建zookeeper的client首先通过CuratorFrameworkFactory创建一个连接
- 一、导入依赖普通项目<dependency> <groupId>ch.qos.logbac
- 一、需求有时候应用需要在内部切换语言但又不影响系统的语言,比如是应用现在是中文的,系统语言也是中文的,我把应用的切换成英文显示后系统语言还是
- 需要修改Main方法第一行代码的路径为你的books.xml文件绝对路径或相对路径。代码演示了XPath各种语法的使用情况books.xml
- 有关临时对象的生命周期有三种情况:1)一般情况:临时性对象的被摧毁,应该是对完整表达式(full-expression)求值过程中的最后一个