本书的大部分内容从未讨论过如何执行程序以及如何在堆栈和堆上为它们分配内存。当数据存储在堆栈上和堆上时。
假设我有一个常规课程,如
public class MyClass
{
int Age=0;
string strName="None"
Double Salary=0;
public void Data1()
{
Age=30;
strName="Robin";
Salary=3500;
}
}
1)所以对于上面的类,将如何分配内存。当程序运行时,将分配内存或当我们创建实例时,将分配内存。当我们通过实例调用Data1()
时,会发生什么以及如何分配内存。内存将被分配用于函数调用或数据成员初始化?告诉我将为age
,name
和salary
分配多少内存。内存将在堆栈或堆上分配。
public class MyClass
{
static int y=0;
static string strComp="None"
int Age=0;
string strName="None"
Double Salary=0;
public void Data1()
{
Age=30;
strName="Robin";
Salary=3500;
}
public static void Data3()
{
y=50;
strComp="Hello";
}
}
2)如何以及何时为静态数据成员和函数分配内存。我们打电话的时候
MyClass.Data3()
然后将分配内存或当我们运行应用程序时。内存是在堆还是堆栈上分配的?
3)如何为静态类分配memroy。存储在堆或堆栈上的静态类...如果堆栈那么为什么?
在这里我问了几个问题请详细解释。感谢。
答案 0 :(得分:7)
1。)创建类的实例时将分配内存。当您调用Data1()
时,不需要额外的内存,因为您只引用类实例的字段(而没有其他本地变量)。由于MyClass
是引用类型,因此将在托管堆上分配内存。
2.)静态方法不消耗任何内存。在访问任何静态字段之前初始化静态字段,或者创建它们包含的任何类型的实例(在这种情况下为MyClass
)
3.)您无法创建静态类的实例,因此只有在创建类型本身时才动态分配内存。保证加载静态类并初始化它们的字段,并在程序中第一次引用类之前调用它们的静态构造函数。创建后,静态类将保留在内存中,直到您的应用程序域关闭为止。
答案 1 :(得分:2)
首先,只有在使用new()指令实际创建类实例时,才会创建类实例。
MyClass a = new MyClass();
只有在创建新实例时才会分配内存,包括所有对象的字段。
静态成员不属于该类的对象实例
你可以这样想:类本身有一个表示实际类类型的对象,所有静态成员和方法都属于该对象。 (实际上并不是这样,但通过这种方式更容易理解静态概念)
静态类成员在程序开始时(或首次加载dll时)创建。
使用new()创建新对象时,它会在堆中创建(及其所有成员)。
在堆栈中创建的变量属于运行时环境中的方法,并且只有在您访问声明它们的块之后才会生成。