Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#.NET-继承-在内存中创建的对象数_C#_.net_Oop_Inheritance - Fatal编程技术网

C#.NET-继承-在内存中创建的对象数

C#.NET-继承-在内存中创建的对象数,c#,.net,oop,inheritance,C#,.net,Oop,Inheritance,这个问题的目的是要了解遗产是如何运作的;我知道它是什么以及何时使用它 下面是用例- class A {} class B : A {} class C { B b = new B(); } 现在,在内存中创建了多少个对象(不包括C类的对象,因为它将是入口点和任何默认的DotNet/CLR对象)?是两个(一个是A,另一个是B)?还是B只有一个包含A的成员?一些解释会有所帮助。如果忽略C(作为程序条目),将有一个B对象和两个System.RuntimeType对象来描述A和B类 如果忽略C(作

这个问题的目的是要了解遗产是如何运作的;我知道它是什么以及何时使用它

下面是用例-

class A {}

class B : A {}

class C
{
B b = new B();
}

现在,在内存中创建了多少个对象(不包括C类的对象,因为它将是入口点和任何默认的DotNet/CLR对象)?是两个(一个是A,另一个是B)?还是B只有一个包含A的成员?一些解释会有所帮助。

如果忽略
C
(作为程序条目),将有一个
B
对象和两个
System.RuntimeType
对象来描述
A
B


如果忽略
C
(作为程序条目),请通过第四版第100-110页的C#参阅CLR。将有一个
B
对象和两个
系统。RuntimeType
对象描述
A
B


通过C#参考CLR,第四版,第100-110页

以便于讨论,假设您创建了一个
C

var c = new C();
此时,您有两个对象实例,因为在构造过程中,
C
生成了
B
的实例

要回答您的问题,您有一个
C
实例和一个
B
实例。您没有
A
的实例,即使
B
是从
A
派生的。(更新:忽略
C
和any,您有一个
B
的对象实例)

您可以用一些代码来证明这一点:

class A { }

class B : A { }

class C
{
    public B B = new B();
}

class Program
{
    static void Main(string[] args)
    {
        var c = new C();

        var b = c.B;

        var BasA = (A)b;

        bool BisA = BasA.GetType() == typeof (A);

        Console.WriteLine($"Assert That B is not A: {!BisA}");
    }
}
此外,您还可以通过调试器查看所有内存:

还要注意术语<代码>A、
B
C
是类。对象是类的实例。在C语言中,描述类的信息可以封装在
系统.Type
类的实例中

所以让我们到兔子洞里去一点;在一个正在执行的程序集中,内存中有多少个对象

将我们的范围仅限于这些类,除了通过实例化
C
获得的两个对象之外,还将有三个
系统实例。RuntimeType
一个用于
A
B
C

  var assemblyTypes = Assembly.GetExecutingAssembly().GetTypes();

  foreach (var classType in assemblyTypes)
       Console.WriteLine("Type instance: " + classType);

同样,这显示了如何有三个
System.RuntimeType
实例,它们描述
A
B
C


作为学究,您还将获得
RuntimeAssembly
(对于您的可执行文件)和
RuntimeType
(对于您的控制台程序类)的实例,以及其他的为了便于论证,让我们假设您创建了
C

var c = new C();
此时,您有两个对象实例,因为在构造过程中,
C
生成了
B
的实例

要回答您的问题,您有一个
C
实例和一个
B
实例。您没有
A
的实例,即使
B
是从
A
派生的。(更新:忽略
C
和any,您有一个
B
的对象实例)

您可以用一些代码来证明这一点:

class A { }

class B : A { }

class C
{
    public B B = new B();
}

class Program
{
    static void Main(string[] args)
    {
        var c = new C();

        var b = c.B;

        var BasA = (A)b;

        bool BisA = BasA.GetType() == typeof (A);

        Console.WriteLine($"Assert That B is not A: {!BisA}");
    }
}
此外,您还可以通过调试器查看所有内存:

还要注意术语<代码>A、
B
C
是类。对象是类的实例。在C语言中,描述类的信息可以封装在
系统.Type
类的实例中

所以让我们到兔子洞里去一点;在一个正在执行的程序集中,内存中有多少个对象

将我们的范围仅限于这些类,除了通过实例化
C
获得的两个对象之外,还将有三个
系统实例。RuntimeType
一个用于
A
B
C

  var assemblyTypes = Assembly.GetExecutingAssembly().GetTypes();

  foreach (var classType in assemblyTypes)
       Console.WriteLine("Type instance: " + classType);

同样,这显示了如何有三个
System.RuntimeType
实例,它们描述
A
B
C


作为学究,您还将获得
RuntimeAssembly
(用于您的可执行文件)和
RuntimeType
(用于您的控制台程序类)的实例,以及使用关键字New时创建的其他对象

源代码更像是一个蓝图,为了简单起见,您指定一个对象扩展另一个对象的行为和成员(继承它)。描述类型本身需要此信息。通过使用new关键字,根据类型描述构造实际对象


在您的情况下,将只创建一个对象。

使用关键字新建时,将创建新对象

源代码更像是一个蓝图,为了简单起见,您指定一个对象扩展另一个对象的行为和成员(继承它)。描述类型本身需要此信息。通过使用new关键字,根据类型描述构造实际对象


在您的情况下,只会创建一个对象。

因为您的问题的目的似乎基本上是为了了解使用组合和继承之间的“物理”区别,所以我将重点介绍这一点

使用
new
时,将创建该类型的单个实例,并执行该类型的相应构造函数(及其所有“父级”)一次

在C#中,默认的继承方法(
B:A
kind)是子类化。在这种方法中,派生类基本上是其父类的副本,加上派生类的实例字段,再加上与任何新的虚拟方法相关联的元数据

这意味着在您的例子中,调用
new B()
只会创建一个对象实例,就是这样。
B
的实例本身包含fi