说到参数传递,必须得弄清值类型和引用类型:
(为了容易表达,我暂且命名存放在堆中的内容为堆中对象,存放在栈上的内容为栈中对象。)
值类型存放在栈中,直接访问。如果有:int a=0;int b=a;就产生了两个栈中对象。
引用类型需要在堆中显式分配,且不能直接访问,需要在栈中分配一个栈中对象(C++叫指针,C#叫引用)指向其堆中对象。
如果:
StringBuilder strb = new StringBuilder();
StringBuilder strb2 = strb;
则在堆中只有一个堆中对象,只是栈中有两个栈中对象指向堆中对象。
可以看出:每个变量都是一个栈中对象。不管是值类型还是引用类型,只是值类型的栈中对象就是其内容,而引用类型的栈中对象只是一个指向堆中对象的地址。

判断是值类型还是引用类型:

int a1 = 10;
StringBuilder strb1 = new StringBuilder("ABC");

int a2 = a1;
StringBuilder strb2 = strb1;

bool bl1 = object.ReferenceEquals(a1,a2);   //false为值类型(因为值类型要装箱)
bool bl2 = object.ReferenceEquals(strb1,strb2);   //true为引用类型

参数传递分值传递和引用传递两种。
通常,在没有显式指出ref和out时都是值传递。

值传递:传的是对象的值拷贝。(即函数内参数对象是调用时传递的对象的栈中对象的拷贝。)
引用传递:传的是栈中对象的地址。(即函数内参数对象与调用时传递的对象完全是同一栈中对象。)
现在用例子来说明传值跟传地址的不同:

private void button2_Click(object sender, System.EventArgs e)
...{
  StringBuilder strb1 = new StringBuilder();
  StringBuilder strb2 = new StringBuilder();
  Test1(strb1);
  Test2(ref strb2);
  string str1 = strb1.ToString(); //str1值:"A"
  string str2 = strb2.ToString(); //str2值:"BC"
}

void Test1(StringBuilder strb)
...{
  //strb和strb1是两个栈中对象,但指向相同的地址,这个操作是改变堆中对象
  strb.Append("A");

  //这里将strb指向一个新的堆中对象,所以后面的操作与strb1指向的栈中对象无关
  strb = new StringBuilder("B");
  strb.Append("C");
}

void Test2(ref StringBuilder strb)
...{
  //这里的strb和strb2是同一个栈中对象,所以改变strb的值使其指向另一个对象也等于改变strb2
  strb = new StringBuilder("B");
  strb.Append("C");
}

转载于:https://www.cnblogs.com/wayne-ivan/archive/2006/10/16/530246.html

关于C#值类型,引用类型,值传递,引用传递相关推荐

  1. iOS开发-Swift进阶之值类型 引用类型!

    本文主要介绍为什么结构体是值类型,类是引用类型 值类型 图片看不了请前往简书 前提:需要了解内存五大区,,如下所示 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XFI ...

  2. 变量/值类型/引用类型/常量/枚举

    变量 声明语法 datatype identifier; 如:int i; //声明一个int类型的变量,但是在没有初始化之前编译器不允许使用该变量 同时声明多个 int a,b;//同时声明两个in ...

  3. javascript基本数据类型与值类型引用类型说明

    DEMO: http://sources.ikeepstudying.com/jsdata/ 摘要:本文主要讲了javascript中的基本数据类型,以及值类型和引用类型的区别与使用 一.基本数据类型 ...

  4. C#值类型-引用类型

    转换-值类型-引用类型-预定义分类表 转换 C#里,兼容的实例间可以进行相互转换 转换总是从一个值转换成一个新的值 隐式转换:隐式转换是自动发生的 显式转换:显式转换是手动操作的 长整型转换成整型的时 ...

  5. java中是值传递引用传递_Java是按值传递而不是按引用传递

    java中是值传递引用传递 One of the biggest confusion in Java programming language is whether java is Pass by V ...

  6. C#基础_值类型引用类型(十一)

    值类型和引用类型: 值类型包括:byte,short,int,long,char,float,double,bool,struct结构 引用类型包括:类类型,接口类型和数组 等. 值类型和引用类型特点 ...

  7. Python:值传递,引用传递?不存在的,是赋值传递

    Python的变量及其赋值 c/c++/c#/java 里面都有值传递,引用传递的概念,在Python中是如何的? 例 a = 1 b = a print(id(a),id(b)) #14072334 ...

  8. 6个重要的.NET概念:栈,堆,值类型,引用类型,装箱,拆箱

    引言 本篇文章主要介绍.NET中6个重要的概念:栈,堆,值类型,引用类型,装箱,拆箱.文章开始介绍当你声明一个变量时,编译器内部发生了什么,然后介绍两个重要的概念:栈和堆:最后介绍值类型和引用类型,并 ...

  9. Python进阶:值传递,引用传递?不存在的,是赋值传递

    Python的变量及其赋值 c/c++/c#/java 里面都有值传递,引用传递的概念,在Python中是如何的? 例 a = 1 b = a print(id(a),id(b)) #14072334 ...

最新文章

  1. 软件开发环境-工具集
  2. Vmware安装提示在关闭以下进程 之前,无法进行安装的解决办法
  3. 服务器和云服务器的安全性哪个更好?—Vecloud
  4. RUN++ | 对比学习加持,多轮对话改写新SOTA!
  5. 三款运用二维码分享与预览的原型设计工具
  6. 关于两个jar包中存在包名和类名都完全相同的jar包冲突问题
  7. SpringBoot自动化配置的注解开关原理
  8. 计算机视觉哪个方向最火?来看这篇综述《中国图像工程:2020》
  9. 从复杂指令系统到精简指令系统
  10. php 判断是否在线,关于判断用户是否在线的问题!!!
  11. Java数据结构与算法——图
  12. PHP在线教育直播平台源码 网课小程序源码 在线学习系统源码(PC+小程序+H5 )
  13. [Ubuntu]安装微信/QQ/TIM的简便方法
  14. mysql监控工具-PMM,让你更上一层楼(下)
  15. 基于韦东山视频 regulator 学习笔记
  16. selenium +geogle chomer批量爬取(百度知道、爱问、360、悟空问答、搜狗)的第一条结果
  17. java入门123 pdf下载_Java入门123:一个老鸟的Java学习心得 pdf_IT教程网
  18. DBeaver连接mysql数据库执行.sql脚本,Windows
  19. CS5265参数说明|CS5265设计资料|CS5265设计电流|type-CtoHDMI2.0拓展坞资料
  20. 化工单元操作复习题(含答案)

热门文章

  1. CCS5.2 Graph的使用方法及步骤 FFT
  2. CMB/宇宙学中相关仪器设备和术语
  3. numpy 100题
  4. sum 函数'int' object is not callable
  5. 通过特征类型超参数控制权重类型
  6. 上帝给你关闭一道门,就会为你打开一扇窗,反推。
  7. 根据excel中的容填写信息
  8. requests+正则爬取猫眼电影前100
  9. WCF 4.0 进阶系列 – 第十二章 实现单向操作和异步操作(下)
  10. 我理解的 iOS 与 Android 的区别