图片 5

值类型和引用类型在内存上的存储区域

Posted by

程序员开发经常涉及到的内存区域:堆、栈、静态存储区域。

1.字段、属性、方法、构造函数
字段:存储数据
属性:保护字段,对字段的取值和设值进行限定
方法:描述对象的行为
构造函数:初始化对象(给对象的每个属性依次的赋值)
类中成员,如果不加访问修饰符,默认都是private
给每一个私有的字段都配备一个公有的属性
属性的本质就是两个方法

值类型和引用类型的区别:

当我们创建好对象后
给这个对象的属性赋值用set
打印这个属性的值的时候执行get

  1. 值类型和引用类型在内存上存储的地方不一样。值类型的值是存储在内存的栈当中。引用类型的值是存储在内存的堆中。
  2. 在传递值类型和传递引用类型的时候,传递方式不一样。值类型我们称之为值传递,引用类型我们称之为引用传递。

this:当前类的对象
this:调用当前类
this是把属性和局部变量区分开来的。
构造函数:1、没有返回值 连void也没有
2、构造函数的名称跟类名一样

本章节,暂时只介绍第1个区别:值类型和引用类型在内存上的存储区域。

构造函数可以重载
:this(name,0,0,gender)

 

new:1、在内存中开辟一块空间
2、在开辟的空间创建对象
3、调用对象的构造函数

常用值类型:int、double、bool、char、decimal、struct、enum

限定:set get 构造函数

常用引用类型:string、自定义类、数组

静态方法 类名.方法名
实例方法 对象名.方法名


静态方法只能访问到静态成员
静态类不能创建对象

 

2、命名空间
命名空间可以看做是类的文件夹
可以认为类是属于命名空间的。
如果在当前项目中没有这个类的命名空间,需要我们手动的导入这个类所在的
命名空间。
1)、用鼠标去点
2)、alt+shift+F10
3)、记住命名空间,手动的去引用

 1.值类型存储图解:

3、在一个项目中引用另一个项目的类
1)、在解决方案资源管理器的引用右键添加引用
2)、引用命名空间

图片 1

3、值类型和引用类型
区别:
1、值类型和引用类型在内存上存储的地方不一样。
2、在传递值类型和传递引用类型的时候,传递的方式不一样。
值类型我们称之为值传递,引用类型我们称之为引用传递。
我们学的值类型和引用类型:
值类型:int、double、bool、char、decimal、struct、enum
引用类型:string、自定义类、数组
存储:
值类型的值是存储在内存的栈当中。
引用类型的值是存储在内存的堆中。

 

堆、栈、静态存储区域


int number=10;
在栈中开辟一个空间,在这个空间存储10,给这个空间起名叫number
string s=”123″;
在堆中开辟一个空间,在这个空间存储”123″,有一个地址(引用) 0x001001,
在栈中开辟一个空间,存堆中的地址0x001001,起名叫s。现在s是指向堆中的内存的

 

Person zsPerson=new Person();
zsPerson.Name=”张三”;

 2.引用类型-字符串存储图解:

在堆中开辟空间,在这个空间存储 new Person();
“张三”,有一个地址(引用)
在栈中开辟一个空间,存堆中的地址,起名叫zsPerson

图片 2

4、字符串
1)、字符串的不可变性
当你给一个字符串重新赋值之后,老值并没有销毁,而是重新开辟一块空间存储新值。
当程序结束后,GC扫描整个内存,如果发现有的空间没有被指向,则立即把它销毁。

 

int 重新赋值 会在原来的栈空间覆盖原值
string
重新赋值,会在原来的堆空间重新开辟一个空间存新值。栈中存地址的空间不变

 

创建 string s1=”张三”
        string s2=”张三”
只在堆中开辟一块空间 存储”张三”
在栈中开辟两块空间命名为s1和s2指向堆中的空间(存储堆中的地址)


图片 3

 

个人解释:

3.引用类型-自定义类存储图解:

①当你创建了S1和S2后,就会在栈中开辟两个空间

图片 4

   一个叫S1,内存地址是1000XX


   一个叫S2,内存地址是2000XX

 

②你给S1,S2赋值的string 类型 “张三”

 引用类型存储总结:

   是存在堆中开辟的空间内

引用类型的对象存储在堆中,并且会分配一个内存地址。该内存地址会存储到栈空间,栈空间名为变量名。

   它也有个内存地址是XX0001

即读取引用类型对象的顺序:变量—>内存地址—>实例对象。

③你栈中的S1,S2空间存的是堆中  的内存地址XX0001,他们是同一个东西

④如果你再  S1=”李四”

                    S2=“李四”

 
 它们也只是把S1,S2里面的内存地址指向堆中开辟的一个叫”李四”的空间的内存地址。

   原来堆中存的”张三”不会有任何改变。

⑤当你清理内存的时候,那个”张三”因为内存地址没有被引用过,就会被清理掉(垃圾回收)

窗口-即时-及时窗口-&s1 &s2 可以看s1和s2的内存地址
上面是栈中的地址,下面是堆中的地址

图片 5

2)、我们可以把字符串看做是char类型的一个只读数组。
ToCharArray();将字符串转换为char数组
new string(char[] chs):能够将char数组转换为字符串

1 string s = "abcdefg";
2 char[] chs = s.ToCharArray();
3 chs[0] = 'b';
4 s= new string(chs);
5 Console.WriteLine(s);
6 Console.ReadKey();

Stopwatch 计时器
Stopwatch sw=new Stopwatch();
sw.Start();开始计时
sw.Stop();停止计时
sw.elapsed 当前实例测量得出的总运行时间

StringBuilder sb=new StringBuilder();

相关文章

Leave a Reply

电子邮件地址不会被公开。 必填项已用*标注