80.C#中new一个引用对象做了什么

  1. 80.CSharp中new一个引用对象做了什么
    1. 80.1 题目
    2. 80.2 深入解析
      1. 示例代码
    3. 80.3 答题示例
    4. 80.4 关键词联想

80.CSharp中new一个引用对象做了什么


80.1 题目

C#中new一个引用对象做了什么?


80.2 深入解析

当在C#中使用 new 关键字创建一个引用对象时,系统会执行以下步骤:

  1. 分配内存

    • 系统计算类及其所有父类的实例字段所需的字节数。
    • 根据计算结果,在托管堆上分配足够的内存。
  2. 初始化字段

    • 分配的内存区域会被初始化。
    • 引用类型字段会被设置为null
    • 值类型字段会被设置为它们的默认值。
  3. 调用构造函数

    • 首先调用父类的构造函数,然后依次调用派生类的构造函数,直到最后一个构造函数完成。
  4. 返回引用

    • 返回新创建对象的引用,这个引用通常被赋值给一个变量。

示例代码

以下是一个使用 new 关键字创建对象的示例代码:

using System;

class Program
{
    static void Main()
    {
        // 创建一个Person对象
        Person person = new Person("John", 30);

        // 输出Person对象的属性
        Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
    }
}

class Person
{
    // 字段
    public string Name { get; private set; }
    public int Age { get; private set; }

    // 构造函数
    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }
}

在这个示例中:

  1. 使用 new 关键字创建了一个 Person 对象,并分配了相应的内存。
  2. 内存初始化,Name 字段被设置为 nullAge 字段被设置为默认值0。
  3. 调用 Person 类的构造函数,初始化 NameAge 字段。
  4. 最终返回新创建的 Person 对象的引用并赋值给变量 person

80.3 答题示例

“在C#中,使用new创建引用对象时会执行以下核心步骤:

  1. 内存分配:在托管堆上为对象及其所有基类的实例字段分配连续内存空间,包括类型对象指针和同步块索引。
  2. 默认初始化:所有字段被自动初始化为默认值(引用类型为null,值类型为零值)。
  3. 构造链调用:从最顶层基类(object)开始,依次执行每个类的实例构造函数,完成字段的显式初始化。
  4. 返回引用:将对象在堆上的内存地址赋值给变量,通过该引用访问对象成员。

例如var person = new Person("Alice", 25)会:

  • 分配存储Name(string)、Age(int)及基类字段所需的内存;
  • 先将Name置为nullAge置为0;
  • 调用objectPerson的构造函数链,设置NameAge的实际值;
  • 最终person变量持有对象的内存引用。”

80.4 关键词联想

  • 托管堆(Managed Heap)
  • 类型对象指针(Type Object Pointer)
  • 同步块索引(Sync Block Index)
  • 构造函数链(Constructor Chaining)
  • 默认初始化 vs 显式初始化
  • 对象头(Object Header)
  • GC 根(GC Root)
  • 值类型 vs 引用类型分配差异


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏