(11)C#值类型和引用类型,堆和栈,ref和out,装箱和拆箱
一、值类型和引用类型定义
以内存中的存在方式可以把变量分成两大类型,值类型和引用类型。
值类型:系统只占用一块内存,数据直接存储在内存里。
引用类型:系统占用两块内存,一块存放地址,另一块存放实际数据,并且前一块这个地址就是后一块在内存中所在的位置。
对引用类型举个例子:把两块白纸(白纸1、白纸2)比喻成两块个内存。白纸2上画了一个仓库,仓库里有电视、冰箱、花瓶等各式各样的东西,而白纸1上写的只有一行字上面记录了这个仓库的位置(天津市河区西红孩儿路123号)
二、变量的划分
值类型:
内置值类型:说的应该是所有的基本数据类型吧。
用户定义的值类型:结构类型
引用类型:字符串、数组、对象等。 上面的图还不太懂等学完以后再回来补充
三、为什么要分成值类型和引用类型?
原因1. 值类型直接存储其值,变量本身就包含了其实例数据,而引用类型保存的只是实例数据的内存引用。 因此,一个值类型变量就永远不会影响到其他的值类型变量,而两个引用类型变量则很有可能指向同一地址,从而发生相互影响。
int a = ;
int b;
b = a;
Console.WriteLine(a);//a=5
Console.WriteLine(b);//b=6
a++;
Console.WriteLine(a);//a=6
Console.WriteLine(b);//b=5
值类型a的变化并没有影响b的变量
int[] a = {};//数组中只有一个元素
int[] b = a;
Console.WriteLine(a[]);//结果是5
Console.WriteLine(b[]);//结果是5
a[] = ;
Console.WriteLine(a[]);//结果是6
Console.WriteLine(b[]);//结果是6
引用类型a的值变了,b也跟着发生了改变
有个特殊的变量 string类型
我们用和上面同样的方法做实验
String a = "me";
String b = a;
Console.WriteLine(a);//me
Console.WriteLine(b);//me
a = "meeeee";//重新a赋值
Console.WriteLine(a);//meeeee
Console.WriteLine(b);//me
结果得到的a和b的值不一样,按刚才的道理来讲字符串时引用类型所以b的值应该和a的值相等,但是string类型有些特殊。
string一个特点就是它具有恒定不变性,我们将不能以任何方式对这个string进行修改使之变长、变短、改变格式。之所以在给字符串变量重新赋值时发生了改变(a = "meeeee";)详见(8)C#字符串、异常
原因2. 从内存分配上来看,值类型通常分配栈上,作用域结束时,所占空间自行释放,效率高, 无需进行地址转换,而引用类型通常分配在堆上,由垃圾回收器来控制其回收,需要进行地址转换,效率降低,这也正是c#需要定义两种数据类型的原因之一。
四、堆和栈
参考http://www.jb51.net/article/55306.htm
五、ref和out参数
形参与实参
在方法的()里的参数一般叫做形参,而传给这个形参的实际值就叫做实参。形参和实参一般是在方法中才有的。
static void method (int a)
{
a++;
}
static void Main()
{
int b=;
method(b);
Console.WriteLine(b);//b的值没有改变,仍然是3.
}
通常情况下在方法的()里定义的参数a修改后不会影响b的值。
但是有一种方法就是在参数前加ref这个关键字
static void method (ref int a)//ref
{
a++;
}
static void Main()
{
int b=;
method( ref b);//ref
Console.WriteLine(b);//b的值是4
}
out和ref的功能一样,只有在一点上有区别,
ref定义的参数和普通参数一样,传到参数的变量必须是一个已经初始化了的变量.
out不同,使用它的目的是,传来的是没有被初始化的变量,初始化要在方法体里进行时。(方法体力必须初始化变量,不然会报错)
static void method (out int a)//
{
a=;
a++;
}
static void Main()
{
int b;
method( out b);//
Console.WriteLine(b);//b的值是7
}
六、装箱和拆箱
参考http://www.cnblogs.com/huashanlin/archive/2007/05/16/749359.html
装箱:值类型转换成引用类型
具有子父类关系才能够装箱。
拆箱:把引用类型转换成值类型
装箱和拆箱必须是相同类型
如何判断是否装箱?
为什么使用装箱拆箱?
效率问题
using System.Collections;
using System.Diagnostics;
ArrayList arr = new ArrayList();
Stopwatch watch = new Stopwatch();
watch.Start();
for (int i = ; i < ; i++)
{
arr.Add(i);
}
watch.Stop();
Console.WriteLine(watch.ElapsedMilliseconds);//统计毫秒
Console.ReadLine();
List<int> list = new List<int>();
Stopwatch watch = new Stopwatch();
watch.Start();
for (int i = ; i < ; i++)
{
list.Add(i);
}
watch.Stop();
Console.WriteLine(watch.ElapsedMilliseconds);//统计毫秒
Console.ReadLine();
(11)C#值类型和引用类型,堆和栈,ref和out,装箱和拆箱的更多相关文章
- 20151024_001_C#基础知识(静态与非静态的区别,值类型和引用类型,堆和栈的区别,字符串的不可变性,命名空间)
1:我们把这些具有相同属性和相同方法的对象进行进一步的封装,抽象出来类这个概念. 类就是个模子,确定了对象应该具有的属性和方法. 对象是根据类创建出来的. 2:类:语法 [public] class ...
- [No0000B5]C# 类型基础 值类型和引用类型 及其 对象判等 深入研究1
引言 本文之初的目的是讲述设计模式中的 Prototype(原型)模式,但是如果想较清楚地弄明白这个模式,需要了解对象克隆(Object Clone),Clone其实也就是对象复制.复制又分为了浅度复 ...
- C# 堆VS栈 值类型VS引用类型
最近博客园上连续出现了几篇关于堆VS栈 值类型VS引用类型的文章. 一个是关于C# 堆VS栈的,深入浅出,动图清晰明了,链接如下 C#堆栈对比(Part One) C#堆栈对比(Part Two) C ...
- .NET面试题解析(01)-值类型与引用类型
系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 常见面试题目: 1. 值类型和引用类型的区别? 2. 结构和类的区别? 3. delegate是引用类型还 ...
- .NET基础知识(01)-值类型与引用类型
常见面试题目: 1. 值类型和引用类型的区别? 2. 结构和类的区别? 3. delegate是引用类型还是值类型?enum.int[]和string呢? 4. 堆和栈的区别? 5. 什么情况下会在堆 ...
- C#中值类型和引用类型
本文将介绍C#类型系统中的值类型和引用类型,以及两者之间的一些区别.同时,还会介绍一下装箱和拆箱操作. 值类型和引用类型 首先,我们看看在C#中哪些类型是值类型,哪些类型是引用类型. 值类型: 基础数 ...
- 值类型,引用类型,栈,堆,ref,out
在网上收集... C#的值类型,引用类型,栈,堆,ref,out C# 的类型系统可分为两种类型,一是值类型,一是引用类型,这个每个C#程序员都了解.还有托管堆,栈,ref,out等等概念也是每个C# ...
- .NET六大剑客:栈、堆、值类型、引用类型、装箱和拆箱
.NET六大剑客:栈.堆.值类型.引用类型.装箱和拆箱 一.“堆”,“栈”专区 这两个字我相信大家太熟悉了,甚至于米饭是什么?不知道...“堆”,“栈”是什么?哦,这个知道... 之前我也写过一篇堆栈 ...
- 【译】.NET中六个重要的概念:栈、堆、值类型、引用类型、装箱和拆箱
为何要翻译 一来是为了感受国外优秀技术社区知名博主的高质量文章,二来是为了复习对.NET技术的基础拾遗达到温故知新的效果,最后也是为了锻炼一下自己的英文读写能力.因为是首次翻译英文文章(哎,原谅我这个 ...
随机推荐
- 《Cracking the Coding Interview》——第8章:面向对象设计——题目1
2014-04-23 17:32 题目:请设计一个数据结构来模拟一副牌,你要如何用这副牌玩21点呢? 解法:说实话,扑克牌的花样在于各种花色.顺子.连对.三带一.炸弹等等,如果能设计一个数据结构,让判 ...
- 孤荷凌寒自学python第三十六天文件内容的迭代操作
孤荷凌寒自学python第三十六天python的文件操作对文件内容的迭代操作 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.os模块的其它文件操作方法补充 1 os.remove(文件 ...
- 孤荷凌寒自学python第十七天初识Python的函数
孤荷凌寒自学python第十七天初识Python的函数 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 函数是能够完成指定运算并返回运算结果的代码块.是结构化编程重要的结构. 我首先发现pyt ...
- [译]在Linux中清空或删除大文件内容的5种方法
原文来源: https://www.tecmint.com/empty-delete-file-content-linux/ 有时,在处理Linux终端中的文件时,您可能希望清除文件的内容,而无需使用 ...
- P2857 [USACO06FEB]稳定奶牛分配Steady Cow Assignment
题目描述 Farmer John's N (1 <= N <= 1000) cows each reside in one of B (1 <= B <= 20) barns ...
- 洛谷 P2597 [ZJOI2012]灾难 解题报告
P2597 [ZJOI2012]灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发 ...
- 虚拟机——mnt_hgfs下无目录情况解决
/mnt/hgfs下无目录情况解决: VMware8虚拟机安装Ubuntu 11.10使用share folders共享目录将虚拟机掉电关闭(不能暂停),设置share folders目录,重启虚拟机 ...
- AngularJS中获取ng-repeat动态生成的ng-model值
需求:通过ng-repeat动态生成的CheckBox,实现勾选控制对应的批次号.如图: html: <div class="clearfix"> <div cl ...
- 【GDI+】MFC画图- 消除锯齿(转)
原文转自 https://wenku.baidu.com/view/b5460979700abb68a982fbcf.html 在常规条件下,MFC画出来的图形.文字都是有锯齿的.如下图所示: 怎样才 ...
- Python开发【项目】:FTP程序
作业:开发一个支持多用户在线的FTP程序 要求: 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ,且只能访问自己的家目录 对用户进行磁盘配额,每个用户的可用空间不同 允许用户在ftp se ...