C#中的堆栈
堆:是程序运行期间动态分配的内存空间,你可以根据程度的运行情况确定要分配的堆内存大小
栈:是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;局部值类型变量、值类型参数等都在栈内存中。
值类型\ 应用类型比较:
- 将一个值类型变量赋给另一个值类型变量时,将复制包含的值。引用类型变量的赋值只复制对对象的引用,而不复制对象本身。
- 值类型不可能派生出新的类型:所有的值类型均隐式派生自System.ValueYype。但与引用类型相同的是:结构也可以实现接口。
- 值类型不可能包含null值
- 每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。
- 值类型在栈上存的是值;应用类型在栈上存的是地址,堆上存值。
值和应用类型举例:
class Program
{
static void Main(string[] args)
{
person p1 = new person();
p1.Age = 20;
p1.Gender = '男';
person p2 = new person();
p2 = p1;
p2.Age = 100;
p2.Gender = '女';
Console.WriteLine(p1.Age);
Console.WriteLine(p1.Gender);
Console.WriteLine("=====================");
Console.WriteLine(p2.Age);
Console.WriteLine(p2.Gender);
Console.ReadKey();
// 类中默认的有一个无参的构造函数,当类中写一个有参数的构造函数,默认五参数构造函数被干掉了。
//类中写构造函数参数列表中参数个数可以不确定。
//结构
//在结构中默认的也有一个无参数的构造函数
//当在结构中写一个有参数的构造函数,默认无参数的构造函数还有,没被干掉。
//在结构中写构造函数,要把所有字段都要完全赋值。
// 类是引用类型,结构是值类型。
}
}
//下面的定义
public struct person //如果是struct(结构)显示男的20,女100;如果是class(类)则都显示100
{
private string _name;
public string name
{
get { return _name; }
set { _name = value; }
}
private int _age;
public int Age
{
get { return _age; }
set { _age = value; }
}
private char _gender;
public char Gender
{
get { return _gender; }
set { _gender =value ; }
}
public void show()
{
Console.WriteLine("{0}岁的{1}在大米时代是最厉害的{2}学生",_age,_name,_gender );
}
}