关于C#值类型,引用类型,值传递,引用传递
说到参数传递,必须得弄清值类型和引用类型:
(为了容易表达,我暂且命名存放在堆中的内容为堆中对象,存放在栈上的内容为栈中对象。)
值类型存放在栈中,直接访问。如果有:int a=0;int b=a;就产生了两个栈中对象。
引用类型需要在堆中显式分配,且不能直接访问,需要在栈中分配一个栈中对象(C++叫指针,C#叫引用)指向其堆中对象。
如果:
StringBuilder strb = new StringBuilder();
StringBuilder strb2 = strb;
则在堆中只有一个堆中对象,只是栈中有两个栈中对象指向堆中对象。
可以看出:每个变量都是一个栈中对象。不管是值类型还是引用类型,只是值类型的栈中对象就是其内容,而引用类型的栈中对象只是一个指向堆中对象的地址。
判断是值类型还是引用类型:
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时都是值传递。
值传递:传的是对象的值拷贝。(即函数内参数对象是调用时传递的对象的栈中对象的拷贝。)
引用传递:传的是栈中对象的地址。(即函数内参数对象与调用时传递的对象完全是同一栈中对象。)
现在用例子来说明传值跟传地址的不同:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
转载于:https://www.cnblogs.com/wayne-ivan/archive/2006/10/16/530246.html
关于C#值类型,引用类型,值传递,引用传递相关推荐
- iOS开发-Swift进阶之值类型 引用类型!
本文主要介绍为什么结构体是值类型,类是引用类型 值类型 图片看不了请前往简书 前提:需要了解内存五大区,,如下所示 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XFI ...
- 变量/值类型/引用类型/常量/枚举
变量 声明语法 datatype identifier; 如:int i; //声明一个int类型的变量,但是在没有初始化之前编译器不允许使用该变量 同时声明多个 int a,b;//同时声明两个in ...
- javascript基本数据类型与值类型引用类型说明
DEMO: http://sources.ikeepstudying.com/jsdata/ 摘要:本文主要讲了javascript中的基本数据类型,以及值类型和引用类型的区别与使用 一.基本数据类型 ...
- C#值类型-引用类型
转换-值类型-引用类型-预定义分类表 转换 C#里,兼容的实例间可以进行相互转换 转换总是从一个值转换成一个新的值 隐式转换:隐式转换是自动发生的 显式转换:显式转换是手动操作的 长整型转换成整型的时 ...
- java中是值传递引用传递_Java是按值传递而不是按引用传递
java中是值传递引用传递 One of the biggest confusion in Java programming language is whether java is Pass by V ...
- C#基础_值类型引用类型(十一)
值类型和引用类型: 值类型包括:byte,short,int,long,char,float,double,bool,struct结构 引用类型包括:类类型,接口类型和数组 等. 值类型和引用类型特点 ...
- Python:值传递,引用传递?不存在的,是赋值传递
Python的变量及其赋值 c/c++/c#/java 里面都有值传递,引用传递的概念,在Python中是如何的? 例 a = 1 b = a print(id(a),id(b)) #14072334 ...
- 6个重要的.NET概念:栈,堆,值类型,引用类型,装箱,拆箱
引言 本篇文章主要介绍.NET中6个重要的概念:栈,堆,值类型,引用类型,装箱,拆箱.文章开始介绍当你声明一个变量时,编译器内部发生了什么,然后介绍两个重要的概念:栈和堆:最后介绍值类型和引用类型,并 ...
- Python进阶:值传递,引用传递?不存在的,是赋值传递
Python的变量及其赋值 c/c++/c#/java 里面都有值传递,引用传递的概念,在Python中是如何的? 例 a = 1 b = a print(id(a),id(b)) #14072334 ...
最新文章
- 软件开发环境-工具集
- Vmware安装提示在关闭以下进程 之前,无法进行安装的解决办法
- 服务器和云服务器的安全性哪个更好?—Vecloud
- RUN++ | 对比学习加持,多轮对话改写新SOTA!
- 三款运用二维码分享与预览的原型设计工具
- 关于两个jar包中存在包名和类名都完全相同的jar包冲突问题
- SpringBoot自动化配置的注解开关原理
- 计算机视觉哪个方向最火?来看这篇综述《中国图像工程:2020》
- 从复杂指令系统到精简指令系统
- php 判断是否在线,关于判断用户是否在线的问题!!!
- Java数据结构与算法——图
- PHP在线教育直播平台源码 网课小程序源码 在线学习系统源码(PC+小程序+H5 )
- [Ubuntu]安装微信/QQ/TIM的简便方法
- mysql监控工具-PMM,让你更上一层楼(下)
- 基于韦东山视频 regulator 学习笔记
- selenium +geogle chomer批量爬取(百度知道、爱问、360、悟空问答、搜狗)的第一条结果
- java入门123 pdf下载_Java入门123:一个老鸟的Java学习心得 pdf_IT教程网
- DBeaver连接mysql数据库执行.sql脚本,Windows
- CS5265参数说明|CS5265设计资料|CS5265设计电流|type-CtoHDMI2.0拓展坞资料
- 化工单元操作复习题(含答案)