C#中 ref 关键字的认识和理解
之前接手老项目的时候有遇到一些的方法参数中使用了ref关键字加在传参的参数前面的情况。对于新手,这里介绍和讲解一下ref的用法和实际效果。
- CLR中默认所有方法的参数传递方式都是传值,也就是说不管你传递的对象是值类型还是引用类型,在作为参数传入到方法中时,传递的是原对象的副本。无论在方法中对该对象做何更改,都不影响外部的对象。
- 而使用了ref参数之后,传递的是对象的引用
- 对于值类型,传递的是值的引用,可以理解为值的地址
- 对于引用类型,传递的就是变量的引用,同样可以理解成变量的栈地址
值类型对象使用ref参数示例
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
class Program
{ static void Main(string[] args) { ; Console.WriteLine(testInt); DoRef(ref testInt); Console.WriteLine(testInt); DoNotRef(testInt); Console.WriteLine(testInt); Console.ReadLine(); } public static void DoRef(ref int txt) { txt = ; } public static void DoNotRef(int txt) { txt = ; } } |
结果
string类型对象使用ref参数示例
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
class Program
{ static void Main(string[] args) { string testValue = "origin"; Console.WriteLine(testValue); UseRef(ref testValue); Console.WriteLine(testValue); NotUseRef(testValue); Console.WriteLine(testValue); Console.ReadLine(); } public static void UseRef(ref string txt) { txt = "ref txt"; } public static void NotUseRef(string txt) { txt = "not ref txt"; } } |
结果
类对象使用ref传参示例
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
class Program
{ static void Main(string[] args) { TestModel t0 = new TestModel() { Text = "test" }; Console.WriteLine(t0.Text); UseRef(ref t0); Console.WriteLine(t0.Text); NotUseRef(t0); Console.WriteLine(t0.Text); Console.ReadLine(); } public static void UseRef(ref TestModel tModel) { tModel.Text = "use ref"; } public static void NotUseRef(TestModel tModel) { tModel.Text = "not use ref"; } } public class TestModel { public string Text { get; set; } } |
结果
C#中 ref 关键字的认识和理解的更多相关文章
- C#中ref关键字的用法总结
ref表示引用的意思,C#中它有多种用法,这里简单总结一下: 1.按引用传递参数 具体可见:C#中的值传递与引用传递(in.out.ref) 2.引用局部变量 引用局部变量指的是在变量声明时使用ref ...
- C#中ref和out的使用与区别
C#中ref关键字和out关键字所实现的功能差不多,都是指定一个形参按照引用传递而不是实参的副本传递.但是二者适用场景还是有些区别的:out适合用在需要retrun多个返回值的地方,而ref则适合用在 ...
- 关于c#中”ref”和”out”关键字的一些理解
一. 综述(本文内容大部分来自网络,经本人整理而成,仅供学习参考,不免理解错误,欢迎批评指正) 在c#中,方法的参数传递有四种类型: (1) 传值参数(by value) 传值参数无需额外的修饰符.传 ...
- 使用C#中的ref关键字,用2个简单例子来说明
在C#中,如果在方法参数前面加上ref关键字,说明参数传递的是引用,而不是值.如何理解呢? 参数是简单类型的例子 static void Main(string[] args) { string te ...
- C#中引用类型的变量做为参数在方法调用时加不加 ref 关键字的不同之处
一直以为对于引用类型做为参数在方法调用时加不加 ref 关键字是没有区别的.但是今天一调试踪了一下变量内存情况才发现大有不同. 直接上代码,结论是:以下代码是使用了 ref 关键字的版本.它输出1 ...
- 为什么C#中ref和out 关键字 ?
需求假设:现需要通过一个叫Swap的方法交换a,b两个变量的值.交换前a=1,b=2,断言:交换后a=2,b=1. 现编码如下: class Program { static void ...
- c#中ref和out 关键字
问题:为什么c#中要有ref和out?(而java中没有)需求假设:现需要通过一个叫Swap的方法交换a,b两个变量的值.交换前a=1,b=2,断言:交换后a=2,b=1. 现编码如下: class ...
- 【转载】理解C语言中的关键字extern
原文:理解C语言中的关键字extern 最近写了一段C程序,编译时出现变量重复定义的错误,自己查看没发现错误.使用Google发现,自己对extern理解不透彻,我搜到了这篇文章,写得不错.我拙劣的翻 ...
- C# 中ref与out关键字区别
ref 关键字通过引用传递的参数的内存地址,而不是值.简单点说就是在方法中对参数的任何改变都会改变调用方的基础参数中.代码举例: class RefExample { static void Meth ...
随机推荐
- MySql配置环境变量
完成后安装好MySQL,为MySQL配置环境变量. 0)在我的电脑上点击右键选择属性-->高级系统设置-->环境变量1)新建MYSQL_HOME变量,并配置:D:\Develop\mysq ...
- Docker扩展内容之容器开机自启
前言 部署项目服务器时,为了应对停电等情况影响正常web项目的访问,会把Docker容器设置为开机自动启动. 在使用docker run启动容器时,使用--restart参数来设置,具体参数如下详解 ...
- 深入SpringMVC注解
原文链接:https://blog.csdn.net/chenpeng19910926/article/details/70837756 @Controller 在SpringMVC 中提供了一个非常 ...
- ArrayAccess 接口(源码)
The ArrayAccess interface (PHP 5 >= 5.0.0, PHP 7) Introduction Interface to provide accessing obj ...
- 暑假第六周总结(对HBASE进行编程实践并且安装Redis)
本周主要是根据教程对HBASE进行了编程实践,对于hadoop的编程来说需要用到很多的.jar 包,在进行编程实践的时候需要参照相关的教程将jar包添加至程序当中去.教程上给的代码还是比较详细的,加上 ...
- convertto-securestring结果 使用python解密
根据微软帮助文档,convertto-securestring有两种加密模式.如果在指定密码的情况下,则使用aes加密,否则使用windows dpapi加密.而且aes加密也没有指明iv值与加密模式 ...
- 【转载】计算机程序的思维逻辑 (8) - char的真正含义
看似简单的char 通过前两节,我们应该对字符和文本的编码和乱码有了一个清晰的认识,但前两节都是与编程语言无关的,我们还是不知道怎么在程序中处理字符和文本. 本节讨论在Java中进行字符处理的基础 - ...
- Java的Integer与int互转
int转Integer ; Integer wrapperi = new Integer(i); Integer转int ); int i = wrapperi.intValue(); JDK1.5以 ...
- wordpress 如何正确升级
http://www.admin5.com/article/20141230/578710.shtml 正确的版本升级应该是,备份数据库和文件,然后禁用所有的插件后在执行升级.这样也避免不了升级过后启 ...
- HDU_3853_区间dp
http://acm.hdu.edu.cn/showproblem.php?pid=3853 dp[i][j]表示由空白串刷成b的从i到j位所需要的最小次数. 然后在比较a和b的每一位,再次更新dp表 ...