.net中值类型、引用类型理解的c#代码示例
下面是以前在公司的时候给别人讲解值类型、引用类型时创建的c#代码示例,从实际使用时的角度出发,对于初学者还是很有帮助的。这里并没有深入讲解值类型包含引用类型成员时(如struct)在内存中的存放情况等等,出于简洁,并没有给出。这些内容很简单,如需了解,可以查阅其他资料。
所有需要讲解与注意的地方都以注释的方式放到的代码里面。
- namespace ValueAndReferenceTransfer
- {
- class Program
- {
- static void Main(string[] args)
- {
- int a = ;
- Modify(a);
- //传的是a的一个拷贝
- Console.WriteLine(a);//
- Modify(ref a);
- //传的是一个指向栈(stack)上存储a的内存块的指针
- Console.WriteLine(a);//
- Person person = new Person("Me");
- //person是一个存储在stack上的引用,这个引用指向堆(heap)中的一个内存块,这个内存块中是Person实例的内容
- Modify(person);
- //传的是person这个引用的一个拷贝,这两个指向heap中的同一块区域
- #region 这段的理解尤其重要
- Console.WriteLine(person.name);//A
- //因为其拷贝和它指向heap中的同一块内容,所以在被调函数中的对heap中内容的改动对这里的输出产生了影响,输出A而不是Me
- Modify1(person);//传的仍然是引用的一个拷贝
- Console.WriteLine(person.name);//A
- //因为改变的是拷贝引用本身,而不是其指向的堆中的内容,所以仍然输出A
- #endregion
- Modify(ref person);
- //传输的是指向栈上存储person引用的内存块的指针(可以理解为指针的指针了)
- Console.WriteLine(person.name);//C
- //因为person引用本身被改变,所以输出的应该是改变以后的内容
- }
- static void Modify(int i)
- {
- Console.WriteLine(++i);//2
- //改变的是a的拷贝
- }
- static void Modify(ref int i)
- {
- Console.WriteLine(i.GetType());
- Console.WriteLine(++i);//2
- //改变的是a本身
- }
- static void Modify(Person myPerson)
- {
- myPerson.name = "A";
- //改变的是这个拷贝引用指向的heap中的内存块的内容,其本身没有改变
- }
- static void Modify1(Person myPerson)
- {
- myPerson = new Person("B");
- //改变的是这个拷贝引用本身,被重定向了(不再指向原先的内存块了),对原来指向的堆中的内容没有影响
- Console.WriteLine(myPerson.name);//B
- }
- static void Modify(ref Person myPerson)
- {
- myPerson = new Person("C");
- //通过指向引用的指针,改变的是引用本身,这个引用被重定向了,并且指向的heap中新分配的Person实例的name是C
- //多考虑一点,堆中原来的那个内存块已经没有引用再指向它了,所以它现在变成了一块垃圾,会在下次垃圾回收时进行回收
- }
- }
- public class Person
- {
- public string name;
- public Person(string name)
- {
- this.name = name;
- }
- }
- }
.net中值类型、引用类型理解的c#代码示例的更多相关文章
- JAVA中值类型和引用类型的不同(面试常考)
转载:https://www.cnblogs.com/1ming/p/5227944.html 1. JAVA中值类型和引用类型的不同? [定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个 ...
- JavaScript中值类型和引用类型的区别
JavaScript的数据类型分为两类:原始类型和对象类型.其中,原始类型包括:数字.字符串和布尔值.此外,JavaScript中还有两个特殊的原始值:null和undefined,它们既不是数字也不 ...
- JavaScript中值类型与引用类型
JavaScript中的变量类型有哪些? 值类型:字符串(string).数值(number).布尔值(boolean).null.undefined 引用类型:对象(Object).数组(Array ...
- C#中值类型和引用类型的差别浅记
C#中值类型和引用类型的差别浅记 在C#中,变量的类型分为两种.各自是值类型和引用类型. 值类型的变量直接存储值,说得更详细一些,就是值类型变量在内存中直接存储它们自身 ...
- C#【堆与栈 值类型 引用类型】
先说C#中值类型和引用类型 概念: 1.值类型:数据存储在内存的堆栈中,从堆栈中可以快速地访问这些数据,因此,值类型表示实际的数据. 2.引用类型:表示指向存储在内存堆中的数据的指针或引用(包括类.接 ...
- 30天C#基础巩固-----值类型/引用类型,泛型,空合并操作符(??),匿名方法
一:值类型/引用类型的区别 值类型主要包括简单类型,枚举类型,和结构体类型等,值类型的实例通常被分配在线程堆栈上面变量保存的内容是实例数据本身.引用类型被分配在托管堆上,变量保存的是地址.引 ...
- 数往知来C#之接口 值类型与引用类型 静态非静态 异常处理 GC垃圾回收 值类型引用类型内存分配<四>
C# 基础接口篇 一.多态复习 使用个new来实现,使用virtual与override -->new隐藏父类方法 根据当前类型,电泳对应的方法(成员) -->override ...
- (值类型引用类型)和null的关系
1.null null表示变量没有指向任何对象. 2.值类型 包括 bool.结构体.枚举.int.double.float等等 .在.NET中值类型都继承自ValueType. 3. 引 ...
- PHP获取网站中各文章的第一张图片的代码示例
调取文章中的第一张图作为列表页缩略图是很流行的做法,WordPress中一般主题默认也是如此,那我们接下来就一起来看看PHP获取网站中各文章的第一张图片的代码示例 ? 1 2 3 4 5 6 7 8 ...
随机推荐
- NET持续集成与自动化部署
https://www.cnblogs.com/hunternet/p/9590287.html 相信每一位程序员都经历过深夜加班上线的痛苦!而作为一个加班上线如家常便饭的码农,更是深感其痛.由于我们 ...
- Cash Machine(多重背包二进制转换)
个人心得:多重背包,自己根据转换方程写总是TLE,后面去网上看了二进制转换,不太理解: 后面仔细想了下,用自己的思想理解下把,就是将对应number,cash总和用二进制拆分, 然后全部装入到一个数组 ...
- 巧用padding让图片宽高比固定并自适应布局
1.从上图知道原始图片大小是 800 * 250,即宽高比为 3.2: 2.html 及 css 代码如下, 可以知道就只是在一个div里面放了一张图片,那么如何让这张图片的宽高比固定呢,看了css之 ...
- 六、Jmeter后置处理器JSON Extractor
一.当接口返回是JSON格式的时候,就可以用JSON Extractor来抓取返回的值,用来关联或者断言. 1.首先,到V2EX中找一个接口,地址为:https://www.v2ex.com/p/7v ...
- Python 列表的切片和连接
一.定义一个list >>> a = [1, 3, 4, 5, 'a', 's'] >>> a [1, 3, 4, 5, 'a', 's'] 二.获取列表中前3个元 ...
- GWT实现平滑移动图片效果
在一些网站的首页上,顶部总会存在一些平滑移动的图片,一般用来投放广告或者业务介绍.多个图片只在一个区域展示,仅通过一些方法来不停的移动这个区域的图片来达到展示多个图片的目的.如果是普通的网页,使用Jq ...
- hihoCoder#1175拓扑排序应用
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho所在学校的校园网被黑客入侵并投放了病毒.这事在校内BBS上立刻引起了大家的讨论,当然小Hi和小Ho也参与到了 ...
- type命令
用途说明 type命令用来显示指定命令的类型.一个命令的类型可以是如下几种: alias 别名 keyword 关键字,Shell保留字 function 函数,Shell函数 builtin 内建命 ...
- PowerDesignerPDM中搜寻表名或字段名
Option Explicit ValidationMode = True InteractiveMode = im_Batch Dim mdl '当前model '获取当前活 ...
- 系统监控磁盘分区 homework
作业一: 1) 开启Linux系统前添加一块大小为15G的SCSI硬盘 2) 开启系统,右击桌面,打开终端 3) 为新加的硬盘分区,一个主分区大小为5G,剩余空间给扩展分区,在扩展分区上划分1个逻辑分 ...