gpt4 book ai didi

C# - CLR 在继承过程中如何组织内存/引用?

转载 作者:行者123 更新时间:2023-11-30 13:16:16 25 4
gpt4 key购买 nike

假设我有如下代码片段:(澄清目的/格式不正确)

class Employee
{
#region fields

protected string _empID;

protected string _empName;

protected readonly string _ssn;

#endregion

public Employee(){}

public Employee(string _empID,string _empName,string _ssn)
{
this._empID =_empID;
this._empName=_empName;
this._ssn = _ssn;
}
}


class Manager : Employee
{
private string _branchID;

public Manager(int _branchID):base(string _empID,string _empName,string _ssn)
{
this._branchID=_branchID;
}
}

static void Main()
{
Manager mgr = new Manager("1","sam","xxx","Branch1");
}

使用 base 关键字我正在调用父类构造函数

在这种情况下,继承是如何组织的?我有一些错误的假设如下:

As Manager is derived from Employee, Manager class is filled with (empID,empName,ssn)

-----------------
Manager
-----------------
empID
empName
ssn
branchID

第 1 步:构造函数调用 :base( "1","sam","xxx")

第二步:基类(Employee)构造函数填充派生类字段(empID,empName,ssn)

第三步:branchID由派生类构造函数赋值

.......

我的问题是

  • 如果一个类是从基类派生的,那么派生类也有基类的隐藏字段?
  • 派生类共享基类字段?我的意思是为基类和派生类分配了单独的内存块?
  • 最佳答案

    一个对象以一个 header 开始,其中包含一个指向其实际类型信息的指针。该类型信息包括 vtable 以计算出哪种方法实际意味着什么。 CLR 在执行时使用该 vtable 来调用重写的方法。

    在对象头之后是所有与对象关联的实例数据——包括基类字段和派生类字段。这一切都在一个地方——它不像派生类的实例也有对基类的“隐藏”实例的引用。我强烈怀疑基类字段是第一位的,因为基类中的方法仍然可以通过对象“顶部”的偏移量(在程序集中)引用相同的字段......但是我面前没有任何东西可以证实这一点。

    IIRC,Jeff Richter 的 "CLR via C#"在某种程度上深入讨论了所有这些 - 它是这类事情的重要信息来源。

    关于C# - CLR 在继承过程中如何组织内存/引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1385990/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com