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中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑.关于值传递和引用传递其实需要分情况看待,今天学习 ...
随机推荐
- PAT_A1137#Final Grading
Source: PAT A1137 Final Grading (25 分) Description: For a student taking the online course "Dat ...
- 【双系统】windows 和 Ubuntu 双系统安装
本博客主要讲述如何在已安装windows系统的计算机上安装Ubuntu双系统,涉及系统安装和相应磁盘空间分配等问题. 所需环境: 电脑已安装windows系统 下载Ubuntu16.04系统镜像 ...
- php第四节课
对象 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.o ...
- Centos7.5虚拟机无法ping通网关、外网IP地址
问题:前两天Centos7.5虚拟机关机,第二天重启后使用Xshell发现无法连接虚拟机,经检测发现虚拟机无法ping通192.168.1.1.无法ping通192.168.1.118(客户机)和ww ...
- Codeforces 879A/B
A. Borya's Diagnosis 传送门:http://codeforces.com/contest/879/problem/A 本题是一个模拟问题. 依次访问n个元素,第i个元素首次出现于s ...
- 【Codeforces Round #519 by Botan Investments E】Train Hard, Win Easy
[链接] 我是链接,点我呀:) [题意] [题解] 设每个人做第一题.第二题的分数分别为x,y 我们先假设没有仇视关系. 即每两个人都能进行一次训练. 那么 对于第i个人. 考虑第j个人对它的贡献 如 ...
- 【例题4-6 uva12412】A Typical Homework (a.k.a Shi Xiong Bang Bang Mang)
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 训练编程的题. 原题中没有除0的数据,所以别担心你的代码是因为除0错了. 多半跟我一样. 也是因为没有+eps 就是比如你要算tot ...
- css sprites拼合
一.什么是css sprites css sprites直译过来就是CSS精灵.通常被解释为“CSS图像拼合”或“CSS贴图定位”.就是把网页中一些背景图片整合拼合成一张图片中,再利用DIV CSS的 ...
- FZU - 2062 - Suneast & Yayamao
先上题目: Problem 2062 Suneast & Yayamao Accept: 146 Submit: 319Time Limit: 1000 mSec Memory L ...
- UVA 10159
http://blog.csdn.net/metaphysis/article/details/6926997 先向作者表达一下敬佩吧,十分巧妙地利用了状态压缩. 这道题有点组合数学的味道,当一个格子 ...