Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.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#班级规模计算_C#_.net_Architecture - Fatal编程技术网

C#班级规模计算

C#班级规模计算,c#,.net,architecture,C#,.net,Architecture,在C#(.NET)中,方法(虚拟的、静态的、非虚拟的)对类大小有何影响 每个方法都需要内存来保存其字节码。代码对于每个方法都存在一次,而不是每个实例都存在一次 添加和删除实例方法(虚拟或非虚拟)不会更改分配对象的大小。这不像C++,在这里添加虚拟方法有时会增加分配对象的大小。和C++一样,静态方法也不会改变分配对象的大小。 对于泛型方法,它实例化的每一组类型都有一个副本 编辑:作为对评论的回应,我将更详细地介绍 @理查德:这可能是真的,也可能不是真的(可能会有所不同)。只需要一个IL字节码副本。

在C#(.NET)中,方法(虚拟的、静态的、非虚拟的)对类大小有何影响

每个方法都需要内存来保存其字节码。代码对于每个方法都存在一次,而不是每个实例都存在一次

添加和删除实例方法(虚拟或非虚拟)不会更改分配对象的大小。这不像C++,在这里添加虚拟方法有时会增加分配对象的大小。和C++一样,静态方法也不会改变分配对象的大小。 对于泛型方法,它实例化的每一组类型都有一个副本

编辑:作为对评论的回应,我将更详细地介绍


@理查德:这可能是真的,也可能不是真的(可能会有所不同)。只需要一个IL字节码副本。开放构造方法和封闭构造方法需要一个方法描述符块,以及仍然包含泛型类型参数(泛型类型定义的泛型参数化基类型中具有泛型参数的方法)的构造实例的描述符。通常情况下,每个闭合构造的实例(值类型)都会保留一个本机代码副本,零个或多个引用类型会保留一个副本,但可能会有零个(不是JIT的/只是解释的)或两个或多个(基线和优化编译器,其中自使用优化JIT重新编译方法以来,一个或多个调用堆栈没有离开基线版本).再次编辑:您的回答是正确的,泛型参数约束只允许其实例化的所有引用类型的本机代码的一个副本。

每个实例的大小取决于类的字段,而不是方法。根据实现细节,实现接口可能会占用实例(每个接口可能有一个指针大小的插槽),但不能保证这样做


不过,您很难找到实现定义行为的“官方参考”,因为它将来可能会发生变化。

您是指程序集中已编译的类、包含该类的源代码文件还是内存中该类实例的大小?我是指实例的大小。sizeof()变量不能用于计算大小(编译器错误):“MyClass”没有预定义的大小,因此sizeof只能在不安全的上下文中使用(请考虑使用System.Runtime.InteropServices.Marshal.sizeof)Marshal.sizeof()给出相同的错误,但在运行时。如果将StructLayoutAttribute应用于类声明,则sizeof()返回1。谢谢,这就是我要找的。您能提供任何正式引用吗?对于具有单个类型参数的泛型方法,每个值类型都有一个副本,泛型类型会一次又一次地为所有引用类型实例化(如果没有对任何引用类型实例化,则为零).为多个类型参数的每个组合展开。。。