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_A1149#Dangerous Goods Packaging
Source: PAT A1149 Dangerous Goods Packaging (25 分) Description: When shipping goods with containers, ...
- WebLogic的服务搭建
一.简介 WebLogic是美国Oracle公司出品的一个application server,确切的说是一个基于JAVAEE架构的中间件,WebLogic是用于开发.集成.部署和管理大型分布式Web ...
- 【剑指Offer】18、二叉树的镜像
题目描述: 操作给定的二叉树,将其变换为原二叉树的镜像. 解题思路: 求一棵树的镜像的过程:先前序遍历这棵树的每个结点,如果遍历到的结点有子结点,就交换它的两个子结点.当交换完所有的非 ...
- switch 语句的反汇编浅析
switch 的简单情景(case 不超过 3 项) 首先,我们分析一下 switch 语句的一种简单情景,我们可以用 C 写出如下如下代码. 编译后用 OllyDBG 载入,它将显示出如下的反汇编代 ...
- [51Nod1486] 大大走格子 (dp+容斥)
传送门 Description 有一个h行w列的棋盘,里面有一些格子是不能走的,现在要求从左上角走到右下角的方案数. Input 单组测试数据. 第一行有三个整数h, w, n(1 ≤ h, w ≤ ...
- SOA架构设计的案例分析
面向服务的架构(SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)进行拆分,并通过这些服务之间定义良好的接口和契约联系起来.接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台. ...
- open-ldap服务安装(1)
LDAP简介 LDAP 代表 轻量级目录访问协议.在我的理解中ldap就是一个数据库. 在LDAP中,目录条目以分层树状结构排序. 传统上,这种结构反映了地理和组织边界,表示国家/地区的条目显示在树的 ...
- vue中访问数据接口的配置
业务API接口地址: http://localhost:3816/api/ 前端UI浏览地址:http://127.0.0.1:8080/#/home 由于同源策略的问题: 需要配置代理: 在开发环境 ...
- 1.3 eclipse中配置Tomcat
下载并成功安装Eclipse和Tomcat(): 打开Eclipse,单击“window”菜单,选择下方的“Preferences”: 步骤阅读 3 找到Server下方的Runtime Envi ...
- numpy中sum(axis=0)和axis=1的计算原理
看起来挺简单的样子,但是在给sum函数中加入参数.sum(a,axis=0)或者是.sum(axis=1) 就有点不解了 在我实验以后发现 我们平时用的sum应该是默认的axis=0 就是普通的相加 ...