在博客园潜水一年多,半年前开了博,但一直闲置着,前阵子看了老赵的博客二三事后,终于下了决定要认真写几篇。正巧最近园子在讨论“值类型和引用类型”相关的话题,我就谈谈个人见解。

直接从实际代码出发,先看第一段代码。

1 class Program
2 {
3 static void Main(string[] args)
4 {
5 int x = 1;
6 int y = x;
7 y = 2;
8
9 TestClass classX = new TestClass();
10 classX.Number = 1;
11
12 TestClass classY = classX;
13 classY.Number = 2;
14
15 Console.WriteLine("x:" + x);
16 Console.WriteLine("y:" + y);
17
18 Console.WriteLine("classX.Number:" + classX.Number);
19 Console.WriteLine("classY.Number:" + classY.Number);
20
21 }
22
23 public class TestClass
24 {
25 public int Number { get; set; }
26 }
27 }

其中int为值类型,class为引用类型。运行代码得到的结果为:

x:1

y:2

classX.Number:2

classY.Number:2

可以看到,值类型x赋值给y,修改y的值,x不变。引用类型classX赋值给classY,修改classY的属性值,classX的属性值也跟着改变。

再看一段代码:

1 class Program
2 {
3 static void Main(string[] args)
4 {
5 TestStruct structX = new TestStruct();
6 structX.Number = 1;
7
8 AddStruct(structX);
9
10 Console.WriteLine("structX.Number:" + structX.Number);
11
12 TestClass classX = new TestClass();
13 classX.Number = 1;
14 AddClass(classX);
15
16 Console.WriteLine("classX.Number:" + classX.Number);
17
18 }
19
20 public class TestClass
21 {
22 public int Number { get; set; }
23 }
24
25 public struct TestStruct
26 {
27 public int Number { get; set; }
28 }
29
30 public static void AddClass(TestClass testClass)
31 {
32 testClass.Number += 1;
33 }
34
35 public static void AddStruct(TestStruct testStruct)
36 {
37 testStruct.Number += 1;
38 }
39 }

分别将值类型structX和引用类型classX当做参数传入到对应的方法,在方法中将Number属性值加1。运行代码得到的结果为:

structX.Number:1

classX.Number:2

结果表明,经过方法执行后,值类型structX的属性值没变,而引用类型的属性值变了。

对照实验结果,我们看一下两种类型在内存中的定义:

值类型实例通常分配在线程的堆栈(stack)上,并且不包含任何指向实例数据的指针,变量本身就包含了其实例数据。

引用类型实例分配在托管堆(managed heep)上,变量保存了实例数据的内存引用。

在我看来引用类型就像是c++中的指针,当引用类型赋值给一个变量实际上赋值的是指向数据的内存引用地址。

回头来分析第一段代码,classX赋值给classY,相当于把内存引用赋值给classY,两个变量指向同一个地址,所以当classY的Number值修改时,classX的值也跟着改变。

同理分析第二段代码,当把引用类型作为参数传递给方法时,传递的是实际数据的内存引用。当方法内部修改了内存引用指向的实际数据时,classX的值也会发生变化。

知道了值类型和引用类型上的区别以后,来了解一下哪些是值类型,哪些是引用类型。

.NET中的值类型有:byte,short,int,long,float,double,decimal,char,枚举enum,结构struct等。

引用类型有:object,string,class,interface,数组int[],委托delegate等。

其中最特殊的是引用类型string,在上面第一段代码中,将class改为string类型,结果和值类型int相同。为了方便理解,暂且把string看做是可以为null的值类型吧。

至于string为何特殊,特殊在何处,园子早期有很多优秀的文章,都可以翻来看,这里不做深入探讨,我推荐王涛的书《你必须知道的。NET》,这本书已经停印,不过淘宝可以买到复印版的,价格便宜一半(不鼓励买盗版,但这是买不到正版的无奈选择^_^)。也可以直接去看他博客里的系列文章。

接下来会尝试着写一些值类型和引用类型在实际项目中的应用和技巧,例如值类型加问号变成引用类型如int?,ref 和 out 关键字的使用等。希望能在"值类型和引用类型"这个已经写烂的话题里挖出一些自己的东西。

转载于:https://www.cnblogs.com/hkncd/archive/2010/12/13/1905120.html

跟风写博---也谈值类型和引用类型相关推荐

  1. 浅谈C#值类型和引用类型

    首先,什么是值类型,什么是引用类型? 在C#中值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储在数据堆中. 值类型(value type):byte,short,int,long ...

  2. 转:图解C#的值类型,引用类型,栈,堆,ref,out

    C# 的类型系统可分为两种类型,一是值类型,一是引用类型,这个每个C#程序员都了解.还有托管堆,栈,ref,out等等概念也是每个C#程序员都会接触到的概念,也是C#程序员面试经常考到的知识,随便搜搜 ...

  3. C#基础知识1-深入理解值类型和引用类型

    C#值类型和引用类型这个概念在刚学习的时候应该就知道了.但是我们并没有深入的去理解它.越是基础知识其实才是最有用的.对代码的优化,代码质量的提升都有帮助.通过整理本文章,对很多知识也起到了巩固的作用吧 ...

  4. 理解C#值类型与引用类型

    这篇文章是我几个月前写的,今天进行了比较大的修订,重新发了出来,希望和大家共同探讨,并在此感谢Anytao 的讨论和帮助. 从概念上看,值类型直接存储其值,而引用类型存储对其值的引用.这两种类型存储在 ...

  5. 述说C#中的值类型和引用类型的千丝万缕

    关于值类型和引用类型方面的博客和文章可以说是汗牛充栋了,今天无意中又复读了一下这方面的知识,感觉还是有许多新感悟的,就此时间分享一下: CLR支持两种类型:值类型和引用类型,看起来FCL的大多数类型是 ...

  6. C#之值类型和引用类型

    本文意在巩固基础知识,并不是对其进行深入剖析,还望理解. 本文是对此项知识的整理文,有些内容来源于网络,其他为博主原创,所以难免会有一些小得瑕疵,敬请谅解. 所有示例均是博主测试过的,如有转载请标明出 ...

  7. 第八回:品味类型---值类型与引用类型(上)-内存有理

    第八回:品味类型---值类型与引用类型(上)-内存有理 http://www.cnblogs.com/anytao/archive/2007/05/23/must_net_08.html 发布日期:2 ...

  8. 三、值类型与引用类型

    说点别的 这是<关于 JavaScript 你必须要知道的 33 个概念 >系列的第三篇文章,今天稍微给大家介绍下这个系列. 如今前端的发展日新月异,很多人(包括我)都是追逐着一些流行的框 ...

  9. .NET六大剑客:栈、堆、值类型、引用类型、装箱和拆箱

    .NET六大剑客:栈.堆.值类型.引用类型.装箱和拆箱 一."堆","栈"专区 这两个字我相信大家太熟悉了,甚至于米饭是什么?不知道..."堆&quo ...

最新文章

  1. Hibernate 具体用法(自整理)
  2. 代码注释规范-google版本
  3. 家庭财务管理系统_我31岁,30天整理出这些财务笔记干货,从宝妈成功逆袭成为会计...
  4. windows cmd 如果失败了则暂停
  5. android 插入耳机 使用自身mic录音_这样选用麦克风,耳机降噪效果会更好
  6. iOS内存泄漏的常见情况
  7. 风控算法知识——浅谈信息熵与IV值应用介绍
  8. android菜单详解四:子菜单
  9. oracle的 客户端工具,Oracle SQL Handler下载-Oracle数据库客户端工具5.2 官方版-东坡下载...
  10. memcached php封装类,PHP Memcached + APC + 文件缓存封装_PHP - key
  11. html如何使文本自动换行,html 文本自动换行
  12. 计算机基础 华师在线,华师在线计算机基础试题答案.doc
  13. Verilog消除毛刺
  14. 程序员的app软件开发经验
  15. Photoshop PS图层混合模式详解
  16. 网易云歌单重合率2.0
  17. 基于AForge.Net框架的扑克牌识别
  18. 项目打包打的是什么包_“微端打包+游戏平台”,H5游戏也可一键下载!
  19. IOS截屏的几种方法
  20. gcc怎么设置默认的include,lib路径

热门文章

  1. 【Azure Services Platform Step by Step-第5篇】.NET Services 概述
  2. python随机产生10个数然后前5个升序后5个降序_编写程序,生成包含 20 个随机数的列表,然后将前 10 个元素升序排列,后 10 个元素降序排列,并输出结果。_学小易找答案...
  3. java pc 蓝牙_Nokia PC 套件与蓝牙适配器连接教程(转)--个人推荐
  4. (34)System Verilog类的多对象详解
  5. python loop until_python3-asyncio 学习笔记 3 -- run_until_complete
  6. 04.通过qss文件设置setStyleSheet
  7. 互联网医生-ICMP协议
  8. redis和mysql双写一致_缓存与库双写一致,这种“老大难”怎么给它制服?
  9. linux创建虚拟账号,linux vsftpd 创建虚拟用户 过程记录
  10. 电脑cpu风扇转一下就停无法开机_电脑无法正常开机风扇转一下就停的原因及解决方法...