C#中的引用传递和值传递。
最近在写项目中有同事碰到这样的传值问题,可能很多对这个参数的传递还有点疑惑,自己也是对这个基础知识做一个回顾和巩固。
首先什么是值类型和引用类型可以去园里看一下相关的资料,都有介绍。
常用值类型包括:int ,long ,bool,decimal,char,float 等
常用的引用类型包括:string,arry,delegate, interface,class 等
一。传递值类型参数
向方法传递值类型变量意味着向方法传递变量的一个副本。方法内发生的对参数的更改对该变量中存储的原始数据无任何影响。如果希望所调用的方法更改参数的值,必须使用 ref 或 out 关键字通过引用传递该参数。
static void SquareInt(int x)
{
x *= x;
System.Console.WriteLine("步骤二: {0}", x);
}
static void Main()
{
int n = ;
System.Console.WriteLine("步骤一: {0}", n); SquareInt(n);
System.Console.WriteLine("步骤三: {0}", n);
}
以上通过值传递值类型,输出:步骤一:5 步骤二:25 步骤三:5
static void SquareInt(ref int x)
{
x *= x;
System.Console.WriteLine("步骤二: {0}", x);
}
static void Main()
{
int n = ;
System.Console.WriteLine("步骤一: {0}", n);
SquareInt(ref n);
System.Console.WriteLine("步骤三: {0}", n);
}
以上通过引用传递值类型,输出:步骤一:5 步骤二:25 步骤三:25
二。传递引用类型参数
引用类型的变量不直接包含其数据;它包含的是对其数据的引用。当通过值传递引用类型的参数时,有可能更改引用所指向的数据,如某类成员的值。但是无法更改引用本身的值;也就是说,不能使用相同的引用为新类分配内存并使之在块外保持。若要这样做,应使用 ref 或 out 关键字传递参数。
public class People
{
public string name { get; set; } public int age { get; set; }
} static void Main()
{
People model = new People();
model.name = "张三";
model.age = ;
System.Console.WriteLine("姓名:{0},年龄:{1}", model.name, model.age);
Change(model);
System.Console.WriteLine("姓名:{0},年龄:{1}", model.name, model.age);
} private void Change(People model)
{
model.name = "李四";
model = new People() { name = "王五", age = };
System.Console.WriteLine("姓名:{0},年龄:{1}", model.name, model.age);
}
以上通过值传递引用类型,输出:姓名:张三,年龄:18 姓名:王五,年龄:20 姓名:李四,年龄:18
public class People
{
public string name { get; set; } public int age { get; set; }
} static void Main()
{
People model = new People();
model.name = "张三";
model.age = ;
System.Console.WriteLine("姓名:{0},年龄:{1}", model.name, model.age);
Change(ref model);
System.Console.WriteLine("姓名:{0},年龄:{1}", model.name, model.age);
} private void Change(ref People model)
{
model.name = "李四";
model = new People() { name = "王五", age = };
System.Console.WriteLine("姓名:{0},年龄:{1}", model.name, model.age);
}
以上通过引用传递引用类型,输出:姓名:张三,年龄:18 姓名:王五,年龄:20 姓名:王五,年龄:20
二。传递特殊的引用类型参数string
string是引用类型,没错,但它的很多操作是与值类型看齐的,下面直接代码演示
static void Main()
{
string str1 = "张三";
StringBuilder str2 = new StringBuilder();
str2.Append("李四");
System.Console.WriteLine("str1是{0}str2是{1}", str1, str2.ToString()); SwapStrings(str1, str2);
System.Console.WriteLine("str1是{0}str2是{1}", str1, str2.ToString());
} private void SwapStrings(string s1,StringBuilder s2)
{
s1 = "张三疯";
s2.Append("李四疯");
s2 = new StringBuilder();
s2.Append("王五");
System.Console.WriteLine("str1是{0}str2是{1}", s1, s2.ToString());
}
以上通过值传递引用类型string,输出:str1是张三str2是李四 str1是张三疯str2是王五 str1是张三str2是李四李四疯
static void Main()
{
string str1 = "张三";
StringBuilder str2 = new StringBuilder();
str2.Append("李四");
System.Console.WriteLine("str1是{0}str2是{1}", str1, str2.ToString()); SwapStrings(ref str1, ref str2);
System.Console.WriteLine("str1是{0}str2是{1}", str1, str2.ToString());
} private void SwapStrings(ref string s1,ref StringBuilder s2)
{
s1 = "张三疯";
s2.Append("李四疯");
s2 = new StringBuilder();
s2.Append("王五");
System.Console.WriteLine("str1是{0}str2是{1}", s1, s2.ToString());
}
以上通过引用传递引用类型string,输出:str1是张三str2是李四 str1是张三疯str2是王五 str1是张三疯str2是王五
C#中的引用传递和值传递。的更多相关文章
- 理解Java中的引用传递和值传递
关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑.关于值传递和引用传递其实需要分情况看待,今天学习 ...
- (转载)理解Java中的引用传递和值传递
关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑.关于值传递和引用传递其实需要分情况看待,今天 ...
- Java中的引用传递和值传递
Java中的引用传递和值传递 关于Java的引用传递和值传递,在听了老师讲解后,还是没有弄清楚是怎么一回事,于是查了资料,所以在这里与大家分享,有不对的地方,欢迎大家留言. java中是没有指针的,j ...
- Java中没有引用传递只有值传递(在函数中)
◆传参的问题 引用类型(在函数调用中)的传参问题,是一个相当扯的问题.有些书上说是传值,有些书上说是传引用.搞得Java程序员都快成神经分裂了.所以,我们最后来谈一下“引用类型参数传递”的问题. 如下 ...
- effective c++:引用传递与值传递,成员函数与非成员函数
以pass-by-reference-to-const 替换pass-by-value 考虑以下class继承体系 class Person { public: Person(); // parame ...
- (转载)PHP数组传递是值传递而非引用传递
(转载)http://www.fengfly.com/plus/view-212127-1.html 在调用函数时通过将PHP数组作为实参赋给形参,在函数中修改,并不会影响到数组本身. 说明此过程中的 ...
- Java Object 引用传递和值传递
Java Object 引用传递和值传递 @author ixenos Java没有引用传递: 除了在将参数传递给方法(或函数)的时候是"值传递",传递对象引用的副本,在任何用&q ...
- java到底是引用传递还是值传递?
今天我们来讲讲一个在学习中容易误解的问题,面试中也偶尔问到,java方法调用时到底是值传递还是引用传递? 首先,请大家来做一个判断题,下面的3个问题是否描述正确 1. java基本数据类型传递是值传递 ...
- Java千百问_05面向对象(011)_引用传递和值传递有什么差别
点击进入_很多其它_Java千百问 1.什么是值传递 值传递,是将内存空间中某个存储单元中存放的值,传送给还有一个存储单元.(java中的存储单元并不是物理内存的地址,但具有相关性) 比如: //定义 ...
- java引用传递和值传递
关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑.关于值传递和引用传递其实需要分情况看待,今天学习 ...
随机推荐
- Vue解决跨域之反向代理
目录 : config/index.js module.exports = { dev: { // Paths assetsSubDirectory: 'static', assetsPublicPa ...
- @dalao help!!!
- TFS代码迁移Git
描述 将TFS上的代码迁移到Git做版本控制. 参考地址 tfs-git下载:https://github.com/git-tfs/git-tfs/releases chocolatey安装:http ...
- js中writeln()方法
writeln( ) 方法与 write( ) 方法几乎一样,差别仅在于是前者将在所提供的任何字符串后添加一个换行符.在 HTML 中,这通常只会在后面产生一个空格:不过如果使用了 <PRE&g ...
- BZOJ 2956 模积和 (数学推导+数论分块)
手动博客搬家: 本文发表于20170223 16:47:26, 原地址https://blog.csdn.net/suncongbo/article/details/79354835 题目链接: ht ...
- CentOS6.2上安装Oracle10g报ins_emdb.mk错误处理方法
oracle安装过程报ins_emdb.mk错误,此时继续点击“continue”即可,待Oracle完成安装后,再手工执行相应脚本完成链接即可 在CentOS6.2操作系统上,安装Oracle10g ...
- qsort快速排序
C库函数qsort七种使用方法示例 七种qsort排序方法<本文中排序都是采用的从小到大排序> 一.对int类型数组排序C++ / C 代码 int num[100]; Sample: i ...
- CentOS6.3安装Mysql-5.5.29
转自:http://www.cnblogs.com/zhoulf/archive/2013/01/25/zhoulf.html 安装方式分为rpm和源码编译安装两种,本文是采用mysql源码编译方式, ...
- [Cypress] Get started with Cypress
Adding Cypress to a project is a simple npm install away. We won’t need any global dependencies beyo ...
- linux下Oracle11g RAC搭建(七)
linux下Oracle11g RAC搭建(七) 六.安装Grid 启动GRID安装界面 方式一:redhat下调整分辨率 [root@node1 ~]# xhost + //授权 [ro ...