MST
星途 面试题库

面试题:C#中类与对象实例化的注意事项

在C#中,定义一个包含私有字段、公有属性以及构造函数的类,并实例化该类的对象。请说明在这个过程中,对于类的字段初始化、构造函数执行顺序以及对象实例化时内存分配有哪些需要注意的地方。
20.8万 热度难度
编程语言C#

知识考点

AI 面试

面试题答案

一键面试

定义类并实例化对象示例代码

public class MyClass
{
    // 私有字段
    private int privateField;

    // 公有属性
    public int PublicProperty { get; set; }

    // 构造函数
    public MyClass(int initialValue)
    {
        privateField = initialValue;
        PublicProperty = initialValue;
    }
}

Main方法中实例化对象:

class Program
{
    static void Main()
    {
        MyClass myObject = new MyClass(10);
    }
}

字段初始化

  1. 默认初始化:在类的实例化过程中,字段首先会被赋予其默认值。例如,数值类型(如int)默认初始化为0,引用类型默认初始化为null。对于上述代码中的privateField,在构造函数执行前,它会被默认初始化为0。
  2. 显式初始化:可以在声明字段时进行显式初始化。例如private int privateField = 5;,这种初始化会在默认初始化之后,构造函数执行之前发生。

构造函数执行顺序

  1. 基类构造函数:如果当前类继承自其他类(在C#中所有类都直接或间接继承自System.Object),首先会调用基类的构造函数。若基类有多个构造函数,会根据调用的具体构造函数进行执行。
  2. 字段初始化:在调用基类构造函数之后,类的字段会按照声明顺序进行初始化(包括显式初始化)。
  3. 当前类构造函数:最后执行当前类的构造函数代码。例如上述代码中,privateFieldPublicProperty会在构造函数代码执行前先完成默认初始化和可能存在的显式初始化,然后执行构造函数中的赋值操作。

对象实例化时内存分配

  1. 栈上分配:当使用new关键字创建对象时,首先在栈上为对象的引用分配内存空间。例如MyClass myObject = new MyClass(10);这里的myObject引用在栈上分配空间。
  2. 堆上分配:然后在堆上为对象实例分配内存空间,这块内存空间用于存储对象的所有字段(包括从基类继承的字段)。堆上分配的内存大小取决于对象的字段类型和数量。例如上述MyClass对象,会在堆上分配足够存储privateFieldPublicProperty的空间。
  3. 内存初始化:堆上分配的内存会被清零,这就完成了字段的默认初始化。然后按照上述字段初始化和构造函数执行顺序,逐步完成对象的初始化。