7.23 C#学习笔记(值类型与引用类型的储存方式---堆&栈)

值类型

值类型的储存只需要一段储存,用来存放实际的数据,在栈中储存。

栈的特点:内存空间小,读取速度快。

 int a = 10;

7.23 C#学习笔记(值类型与引用类型的储存方式---堆&栈)_第1张图片

引用类型

对象(object)与对象之间互不影响   通过new出来的对象都会堆内存中开辟一块新空间。
引用类型需要两段内存,第一段储存实际数据,在堆中储存。
第二段是一个应用指针,指向数据在堆内存中储存数据的位置,地址储存在栈中。
通过栈中的地址快速找到堆中的数据。

定义一个student类进行实例化对象:

class student
{
    public int age;
    public string name;
    public student(int age, string name) 
    {
        this.age = age;
        this.name = name;
    }
}

在Main函数中实例化对象:

 student stu=new student(20,"小明");
 student stu1 = new student(30,"李四");

其在堆栈中的储存方式为:7.23 C#学习笔记(值类型与引用类型的储存方式---堆&栈)_第2张图片

静态资源区

静态资源区:对于字符串常量来说,实际上是储存在静态资源区的,即使在堆中用的字符串也是存放在静态资源区的。
因为如果用到重复的字符串时,他们存放的地址是一样的,会解决内存问题。
字符串在静态资源区中是不会被改变的,看到的修改其实只是改变了指向的位置,内容本身没有被改变。

const string name = "小明";
//修改stu3的值stu也被修改,为什么?
//因为将stu中储存的地址赋值给stu3,他们两个共用一个地址,指向同一个堆内存,所以一个修改另外一个也会被修改
student stu3 = stu;
stu3.age = 100;
Console.WriteLine(stu3.age);//100
Console.WriteLine(stu.age);//20

下面补充一点结构体的内容:

创建一个Dog结构体

struct Dog 
{
    public string name;
    public int age;
    public Dog(string name, int age)
    { 
        //结构体即使自己定义了有参的构造函数,默认的无参也会存在
        this.name=name;
        this.age = age;
    }
}
Dog d1 = new Dog("阿黄",2);
Dog d2 = new Dog("阿辉", 3);
//结构体与结构体之间互不影响
//d1.age = 100;
//Console.WriteLine(d1.age);//100
//Console.WriteLine(d2.age);//3
Dog d3 = d1;
d1.age = 1000;
Console.WriteLine(d1.age);//1000
Console.WriteLine(d3.age);//2


 

你可能感兴趣的:(c#,visual,studio)