c#数据类型的值传递和引用传递--基础拾遗
2015-11-25 13:58
281 查看
竟然一不小心犯了低级错误,数据类型的值类型和引用类型弄混了。
想用list记录下所有的二维数组值,结果发现list里所有的值都是一样的。
值类型数据主要有:结构体struct,枚举体enum,布尔型bool,浮点型,整型。
引用类型数据主要有:数组,字符串,接口,委托,类。
值类型和引用类型的区别:
引用类型继承自System.Object,值类型继承自System.ValueType。
引用类型保存到内存的堆heap中,值类型保存在内存的堆栈stack中。在.net中,栈的内存是自动释放的,而堆会有垃圾回收器GC来释放。
引用类型可以派生出新的类型,而值类型不可以。引用类型可以包含null值,而值类型不可以。
引用类型变量赋值只复制对象的引用,不复制对象本身。而将一个值类型变量赋给另一个值类型变量时,将复制包含的值。
1.错误的使用。只new一次,所有的变量valueLst1 实际上是一个值,同一个地址。
valueLst1里所有值都是[9,10]。
2正确。每次重新new
valueLst1的值分别是[0,0],[1,2].......
可参考资料:
C# 值类型和引用类型及参数传递C#基础原理拾遗——引用类型的值传递和引用传递C# 参数传递 引用类型与值类型的值传递和引用传递C#中值传递和引用传递
想用list记录下所有的二维数组值,结果发现list里所有的值都是一样的。
值类型和引用类型:
C#数据类型分为两大类:值类型和引用类型。值类型数据主要有:结构体struct,枚举体enum,布尔型bool,浮点型,整型。
引用类型数据主要有:数组,字符串,接口,委托,类。
值类型和引用类型的区别:
引用类型继承自System.Object,值类型继承自System.ValueType。
引用类型保存到内存的堆heap中,值类型保存在内存的堆栈stack中。在.net中,栈的内存是自动释放的,而堆会有垃圾回收器GC来释放。
引用类型可以派生出新的类型,而值类型不可以。引用类型可以包含null值,而值类型不可以。
引用类型变量赋值只复制对象的引用,不复制对象本身。而将一个值类型变量赋给另一个值类型变量时,将复制包含的值。
辨别过程
想用list记录下所有的二维数组值,结果发现list里所有的值都是一样的。1.错误的使用。只new一次,所有的变量valueLst1 实际上是一个值,同一个地址。
private void test() { List<int[]> valueLst1 = new List<int[]>(); int[] indexAndvalue1 = new int[2]; for (int i = 0; i < 10; i++) { indexAndvalue1[0] = i; indexAndvalue1[1] = i * 2; valueLst1.Add(indexAndvalue1); } }
valueLst1里所有值都是[9,10]。
2正确。每次重新new
private void test2() { List<int[]> valueLst2 = new List<int[]>(); int[] indexAndvalue2; for (int i = 0; i < 10; i++) { indexAndvalue2 = new int[2]; indexAndvalue2[0] = i; indexAndvalue2[1] = i * 2; valueLst2.Add(indexAndvalue2); } }
valueLst1的值分别是[0,0],[1,2].......
可参考资料:
C# 值类型和引用类型及参数传递C#基础原理拾遗——引用类型的值传递和引用传递C# 参数传递 引用类型与值类型的值传递和引用传递C#中值传递和引用传递
相关文章推荐
- C# 如何判断字符串中是否包含另一个字符串?
- C# 添加,修改,删除Xml节点
- c# 获取显卡信息
- c#获取磁盘信息
- c# 获取内存信息
- c# 获取主板信息
- 如何使用免费控件将word表格中的数据导入到excel中
- c#StreamWriter,StreamReader类(主要用于文本文件访问)
- C#实现简单过滤非法字符实例
- C# WinForm程序退出的方法
- C#中 += (s, e) => 这些字符什么意思
- 【NCRE项目】C#实现TabControl切换打开不同文件夹
- c# 子线程锁中调用主线程死锁
- C#获取局域网ip
- C# #if DEBUG
- 轻松学习C#的属性
- 轻松学习C#的哈希表
- C# 文本与byte互转
- C# 将文件转化成byte[]数组
- C#实现流程图设计器