下面是以前在公司的时候给别人讲解值类型、引用类型时创建的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#代码示例的更多相关文章

  1. JAVA中值类型和引用类型的不同(面试常考)

    转载:https://www.cnblogs.com/1ming/p/5227944.html 1. JAVA中值类型和引用类型的不同? [定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个 ...

  2. JavaScript中值类型和引用类型的区别

    JavaScript的数据类型分为两类:原始类型和对象类型.其中,原始类型包括:数字.字符串和布尔值.此外,JavaScript中还有两个特殊的原始值:null和undefined,它们既不是数字也不 ...

  3. JavaScript中值类型与引用类型

    JavaScript中的变量类型有哪些? 值类型:字符串(string).数值(number).布尔值(boolean).null.undefined 引用类型:对象(Object).数组(Array ...

  4. C#中值类型和引用类型的差别浅记

    C#中值类型和引用类型的差别浅记         在C#中,变量的类型分为两种.各自是值类型和引用类型.         值类型的变量直接存储值,说得更详细一些,就是值类型变量在内存中直接存储它们自身 ...

  5. C#【堆与栈 值类型 引用类型】

    先说C#中值类型和引用类型 概念: 1.值类型:数据存储在内存的堆栈中,从堆栈中可以快速地访问这些数据,因此,值类型表示实际的数据. 2.引用类型:表示指向存储在内存堆中的数据的指针或引用(包括类.接 ...

  6. 30天C#基础巩固-----值类型/引用类型,泛型,空合并操作符(??),匿名方法

    一:值类型/引用类型的区别      值类型主要包括简单类型,枚举类型,和结构体类型等,值类型的实例通常被分配在线程堆栈上面变量保存的内容是实例数据本身.引用类型被分配在托管堆上,变量保存的是地址.引 ...

  7. 数往知来C#之接口 值类型与引用类型 静态非静态 异常处理 GC垃圾回收 值类型引用类型内存分配<四>

    C# 基础接口篇 一.多态复习 使用个new来实现,使用virtual与override    -->new隐藏父类方法 根据当前类型,电泳对应的方法(成员)    -->override ...

  8. (值类型引用类型)和null的关系

    1.null    null表示变量没有指向任何对象. 2.值类型    包括 bool.结构体.枚举.int.double.float等等 .在.NET中值类型都继承自ValueType. 3. 引 ...

  9. PHP获取网站中各文章的第一张图片的代码示例

    调取文章中的第一张图作为列表页缩略图是很流行的做法,WordPress中一般主题默认也是如此,那我们接下来就一起来看看PHP获取网站中各文章的第一张图片的代码示例 ? 1 2 3 4 5 6 7 8 ...

随机推荐

  1. poj 2408 Anagram Groups

    Description World-renowned Prof. A. N. Agram's current research deals with large anagram groups. He ...

  2. 让人蛋疼的“Oracle.DataAccess.dll”

    项目介绍:为前台网站提供rest接口来操作erp相关数据 涉及db:oracle11 技术方案:因为erp是用remoting来调用,我想rest实现部分调用remoting来操作减少耦合,当然性能上 ...

  3. laravel count的使用

    rt 学习源头: https://blog.csdn.net/chajinglong/article/details/51954010 四.聚合 查询构建器还提供了各种聚合方法,如统计,马克斯,min ...

  4. GXT4.0 BorderLayoutContainer布局

    T字型布局. @Override public void onModuleLoad() { BorderLayoutContainer con = new BorderLayoutContainer( ...

  5. GWT中自定义你的"cell"

    GWT内部提供了CellTable组件,它允许自由增加column以及cell,在设定column之后就是在其中填充cell了.但GWT所提供的CellTable样式确实不敢恭维,为了解决这一问题,在 ...

  6. 基于opencv+ffmpeg的镜头分割

    镜头分割常常被用于视频智能剪辑.视频关键帧提取等场景. 本文给出一种解决镜头分割问题的思路,可分为两个步骤: 1.根据镜头分割算法对视频进行分割标记 核心在于镜头分割算法,这里简单描述一种算法思路:r ...

  7. 一张图看懂------left join;right join;inner join

  8. redis学习五 集群配置

    redis集群配置 0,整体概述      整体来说就是:      1,安装redis      2,配置多个redis实例      3,安装 ruby和rubygems      4,启动red ...

  9. Solaris10安装配置LDAP(iPlanet Directory Server )

    Solaris10安装光盘自带了iPlanet Directory Server安装包,系统管理员可以利用iPlanet Directory Server在Solaris系统创建一个LDAP Serv ...

  10. C#在线预览文档(word,excel,pdf,txt,png)

    C#在线预览文档(word,excel,pdf,txt,png) 1.预览方式:将word文件转换成html文件然后预览html文件2.预览word文件:需要引入Interop.Microsoft.O ...