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