c#构造初始化的顺序浅析

这个很基础的知识,但我至今才意识到它。想想也很失败。

直接上代码:很简单


代码如下:

public class Base
    {
        int i=0;

public Base()
        {
            System.Console.WriteLine("我是基类构造器");
        }

}

class Program
    {
        static void Main(string[] args)
        {
            Base d = new Base();
        }
    }

对于上面的代码。是先执行构造器,还是先初使化字段 i 变量呢?其实只要意识到这个问题,也就很容易试出来,它应当是先初使化字段 i 变量。

那么现在如果Base 派生出一个子类,那它的构造顺序又是怎么样的呢?


代码如下:

/// <summary>
    /// 基类
    /// </summary>
    public class Base
    {
       public int baseint = 100;
        public Base()
        {
            System.Console.WriteLine("构造器:我是基类构造器");

}

private class Inner
        {
            public Inner()
            {
                System.Console.WriteLine("字段:我是基类Inner");
            }
        }

/// <summary>
        /// 字段初使化
        /// </summary>
        private Inner inner = new Inner();
    }

/// <summary>
   /// 子类
   /// </summary>
    class Derived : Base
    {

public Derived()
        {
            System.Console.WriteLine("构造器:我是子类构造器");

}

private class Inner
        {
            public Inner()
            {
                System.Console.WriteLine("字段:我是子类Inner");
            }
        }

/// <summary>
        /// 字段初使化
        /// </summary>
        private Inner inner = new Inner();

}

所以说它的执行顺序为:子类字段-父类字段-父类构造器-子类构造器

(0)

相关推荐

  • C#类的创建与初始化实例解析

    本文以一个实例简单实现了类的创建与初始化,实现代码如下所示: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace C_program_test { class Person { public string Name; //因为Name没有赋值,而它是string类型的,所以它的默认值就是Null public int Age; //因为Age和Gender也

  • C#数组初始化简析

    题外话:学习.NET已经有一年了,从C#->ASP.NET->WPF.主要以看电子书为主,比较少写代码.现在回头学习以前接触过的,随着知识与经验的的积累. 总是有各种惊喜,震惊!C#数组就是其中之一,我把它作为自己博客园的处女作. C#数组与其它C系列语言有着很多的不同,以前接触的时候理解出现很大的偏差.尤其是对多维数组的认识.多维数组与C语言相比是一个新概念.而最开始的 时候我把它当成交错数组的特殊类型. 首先重二维数组与简单的交错数组的初始化与访问开始 复制代码 代码如下: int[,]

  • C#中数组初始化、反转和排序用法实例

    本文实例讲述了C#中数组初始化.反转和排序用法.分享给大家供大家参考.具体如下: 下面的代码演示了在C#中定义和初始化数组,然后对其进行赋值,排序和反转的操作方法: using System; public class ArraySample { public static void Main() { // Create and initialize a new array instance. Array strArr = Array.CreateInstance(typeof(string),

  • C#中数组初始化与数组元素复制的方法

    本文实例讲述了C#中数组初始化与数组元素复制的方法.分享给大家供大家参考.具体如下: 下面的代码演示如何创建和初始化数组,以及C#中如何将数组元素从一个复制到另外一个的方法. using System; public class ArraySample { public static void Main() { // 创建和初始化数组 int[] intArr = new int[5] {1,2,3,4,5}; Object[] objArr = new Object[5] {10,20,30,

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

    本文实例分析了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

  • C#特性-对象集合初始化器介绍

    C# 3.0为你提供了对象集合初始化器: /// <summary> /// 图书类 /// </summary> public class Book { /// <summary> /// 图书名称 /// </summary> public string Title { get; set; } /// <summary> /// 单价 /// </summary> public float Price { get; set; }

  • C#中结构(struct)的部分初始化和完全初始化实例分析

    本文实例分析了C#中结构(struct)的部分初始化和完全初始化,分享给大家供大家参考.具体分析如下: 假设有这样一个值类型struct,如下所示: public struct Size { public int Length; public int Width; public int Area() { return Length*Width; } } 一.客户端,给所有struct字段初始化后调用方法 class Program { static void Main(string[] args

  • 详解C#中使用对象或集合的初始值设定项初始化的操作

    使用对象初始值设定项初始化对象 可以使用对象初始值设定项以声明方式初始化类型对象,而无需显式调用类型的构造函数. 下面的示例演示如何将对象初始值设定项用于命名对象.编译器通过先访问默认实例构造函数然后处理成员初始化处理对象初始值设定项.因此,如果默认构造函数在类中声明为 private,那么需要公共访问权的对象初始值设定项将失败. 下面的示例演示如何使用对象初始值设定项初始化新的 StudentName 类型. public class Program { public static void

  • c#构造初始化的顺序浅析

    这个很基础的知识,但我至今才意识到它.想想也很失败. 直接上代码:很简单 复制代码 代码如下: public class Base    {        int i=0; public Base()        {            System.Console.WriteLine("我是基类构造器");        } } class Program    {        static void Main(string[] args)        {          

  • c++ 子类构造函数初始化及父类构造初始化的使用

    我们知道,构造方法是用来初始化类对象的.如果在类中没有显式地声明构造函数,那么编译器会自动创建一个默认的构造函数:并且这个默认的构造函数仅仅在没有显式地声明构造函数的情况下才会被创建创建. 构造函数与父类的其它成员(成员变量和成员方法)不同,它不能被子类继承.因此,在创建子类对象时,为了初始化从父类中继承来的成员变量,编译器需要调用其父类的构造函数.如果子类的构造函数没有显示地调用父类的构造函数,则默认调用父类的无参构造函数,至于什么事显式调用,在下面会详细说明!关于子类中构造函数的构造原则,总

  • java中的this引用及对象构造初始化

    目录 1. this 引用 1.1 为什么要有this引用 1.2 什么是this引用 1.3 this引用的特性 1.4 this引用练习题 2. 对象的构造及初始化 2.1 如何初始化对象 2.2 构造方法 2.2.1 概念 2.2.2 特性 2.3 默认初始化 2.4 就地初始化 1. this 引用 1.1 为什么要有this引用 先来写一个日期类的例子: public class classCode { public int year; public int month; public

  • 关于Java中try finally return语句的执行顺序浅析

    问题分析 finally语句块一定会执行吗? 可能很多人第一反应是肯定要执行的,但仔细一想,如果一定会执行的话 也就不会这么SB的问了. Demo1 public class Test { public static void main(String[] args) { System.out.println("return value of test(): " + test()); } public static int test() { int i = 1; // if (i ==

  • 成员初始化列表与构造函数体中的区别详细解析

    论坛中回答一个别人问题 C++ Primer中在讲构造函数初始化列表的时候有这么一段话:无论是在构造函数初始化列表中初始化成员,还是在构造函数体中对它们赋值,最终结果是相同的.不同之处在于,使用构造函数初始化列表的版本初始化数据成员,没有定义初始化列表的构造函数版本在构造函数体中对数据成员赋值. 请问这里的初始化数据成员与对数据成员赋值的含义是什么?有什么区别? 我知道在数据成员有默认构造函数时是有不同的,但对其他类型的成员呢?其他类型成员的初始化和赋值有区别吗?================

  • Java类的初始化顺序知识点总结

    对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序依次是(静态变量.静态初始化块)>(变量.初始化块)>构造器. 初始化顺序图示: 我们也可以通过下面的测试代码来验证这一点: package com.trs.oop; /** * 类的初始化顺序 * 静态变量->静态初始化块->变量->初始化块->构造器 * @author xiayunan * @date 2018年7月5日 * */ public class InitialOrderTest { /

  • Java对象初始化过程代码块和构造器的调用顺序

    目录 前言 代码加载的优先级顺序 构造方法的执行顺序 各种代码块的定义 静态代码块 有关静态代码块再详细介绍下 局部代码块 验证各代码块的执行顺序 验证存在继承关系中各代码块的执行顺序 通过字节码深究实例代码块优先于构造器原因 前言 对Java对象初始化过程 代码块与构造器调用顺序进行整理说明.先说结论具体论证在下文. 代码加载的优先级顺序 静态代码块.静态成员变量->非静态代码块.非静态成员变量->new其他对象调用对应对象构造方法(在本地对象的方法外包括构造方法)->new本地对象调

  • Java类继承关系中的初始化顺序实例详解

    本文实例讲述了Java类继承关系中的初始化顺序.分享给大家供大家参考,具体如下: Java类初始化的顺序经常让人犯迷糊,现在本文尝试着从JVM的角度,对Java非继承和继承关系中类的初始化顺序进行试验,尝试给出JVM角度的解释. 非继承关系中的初始化顺序 对于非继承关系,主类InitialOrderWithoutExtend中包含了静态成员变量(类变量)SampleClass 类的一个实例,普通成员变量SampleClass 类的2个实例(在程序中的顺序不一样)以及一个静态代码块,其中静态代码块

  • Android中多个ContentProvider的初始化顺序详解

    目录 缘起: 1. 利用 ContentProvider 初始化 Library: 2. 自定义 ContentProvider 初始化顺序: 总结 缘起: 利用 ContentProvider 来初始化你的 Library, 这个相信大家已经不太陌生了,下面简要说下. 1. 利用 ContentProvider 初始化 Library: 在日常开发过程中, 经常会遇到 Library 都需要传入 Context 参数以完成初始化,此时这个 Context 参数一般会从 Application

  • c++基础语法:构造函数初始化列表

    C++为类中提供类成员的初始化列表 类对象的构造 顺序是这样的:1.分配内存,调用构造函数 时,隐式/显示的初始化各数据 成员2.进入构造函数后在构造函数中执行一般计算 使用初始化列表有两个原因: 1.必须这样做:如果我们有一个类成员,它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数,而没有默认构造函数,这时要对这个类成员进行初始化,就必须调用这个类成员的带参数的构造函数,如果没有初始化列表,那么他将无法完成第一步,就会报错. 复制代码 代码如下: class  ABC  .

随机推荐