c# - 每个对象的实例方法是否在内存中重复?

标签 c# class oop

为了更清楚地说明我的问题,如果您创建一个特定类的数组:例如,

ExampleClass[] test = new ExampleClass[5]; 

我知道五个 ExampleClass 实例会为每个类创建每个变量的副本,但是方法/函数在内存中重复了 5 次,还是每个测试都指向同一个单类代码库?如果它为每个类(class)重复,那只会浪费内存。

最佳答案

加载到 AppDomain 中的每个类型都将有一个方法表结构,该结构包含该类型定义的每个方法,以及从父类(通常是Object)派生的虚方法和由任何已实现的接口(interface)定义的方法。

该方法表由该对象的每个实例指向。所以每个实例不会复制该类型定义的所有方法,而是通过引用指向这个方法表结构

例如:

 public class MyClass : IDisposable
 {
        private static void MyStaticMethod()
        {
            // ....
        }
        public void MyInstanceMethod()
        {
            // ....
        }
        public void Dispose()
        {
            throw new NotImplementedException();
        }
 }

这个 MyClass 将有一个方法表,包括:

  • 我的静态方法
  • 我的实例方法
  • 处置
  • 以及其他派生自System.Object的虚方法

看看方法表的漂亮图:

Method Table Diagram

您可以查看有关方法表的整篇文章here

关于c# - 每个对象的实例方法是否在内存中重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27751624/

相关文章:

可用作 IEnumerable 和 Single 对象的 C# 对象

c# - 在 asp.net 中读取自定义配置文件

c++ - 在没有动态转换或静态向下转换的情况下比较 C++ 中的派生类

oop - 单元测试不同的类层次结构

Python - 如何让多重继承发挥作用?

entity-framework - 使用 ado Entity Framework 时在 DDD 中组织我的域对象

c# - Roslyn 找不到 IDictionary.Add 接口(interface)实现成员

c# - 如何使用 WinAPI 快速逐像素处理图像?

c# - 是否有任何工具可以用随机数据填充类属性?

java - Java 中的私有(private)变量和 C++ 结构中的私有(private)变量有什么区别?