C#如何创建类的实例?

时间:2010-07-30 16:06:59

标签: c# .net

public class MyClass
{
    int i = 0;
    string str = "here";
    MyStruct mystruct;
    B b;
    ArrayList myList = new ArrayList(10);

    public MyClass()
    {
    }
    ....
}

public struct MyStruct
{
    public int i;
    public float f;
}

public class B
{
    ...
}

想要了解如何在后台创建类的实例。当这句话

 MyClass myClass = new MyClass();
评估

。背景会发生什么?我的以下陈述是否正确(对于32位OS机器)?

  1. 将创建一个内存空间并将其引用为myClass;
  2. 在上面的内存空间中,4个字节用于int i;
  3. 的值
  4. 在上面的内存空间中,4个字节用于string str的引用; str的实际值存储在其他位置(其中?)
  5. 在上面的内存空间中,8个字节用于MyStruct mystruct的值(因为MyStruct是8个字节);
  6. 在上面的内存空间中,4个字节用于B b对象的引用; b对象的内存将在实例化时在其他地方分配;
  7. 在上面的内存空间中,4个字节用于ArrayList myList的引用; ArrayList myList的实际内存空间在其他位置分配,并在此处引用为myList;
  8. 来自上面的内存空间的另外4或8个字节用于对象元数据;
  9. ...

3 个答案:

答案 0 :(得分:2)

你有基本的想法。除了您所包含的内容之外,其实际细节是特定于实现的。但是,有几个要点:

3)实际字符串通常存储在自己的内存空间中,就像任何其他类一样。但是,由于在这种情况下你使用的是字符串文字,它很可能是在字符串实习池中,我相信它存储在大对象堆中。有关字符串实习的详细信息,请参阅String.Intern。 (如果您动态分配了字符串,而不是使用文字,则字符串将存储在应用程序的普通托管堆中。)

答案 1 :(得分:1)

就是这样。

字符串存储在字符串表中,而不是存储在堆中的自由浮动对象中。重要的是要注意,实例化该字符串的只有一个实例,而不管实例化MyClass的实例数。

答案 2 :(得分:1)

  

7.来自上面的内存空间的另外4或8个字节用于对象   元数据

这将是8个字节。 4表示同步块,4表示类型信息。

您可以在此question中找到有关该主题的更多信息。