使用C#中的ref关键字,用2个简单例子来说明
在C#中,如果在方法参数前面加上ref关键字,说明参数传递的是引用,而不是值。如何理解呢?
参数是简单类型的例子
static void Main(string[] args)
{
string temp = "a";
Change(temp);
Console.WriteLine(temp); ChangeByRef(ref temp);
Console.WriteLine(temp);
Console.ReadKey();
} private static void Change(string temp)
{
temp = temp + "--changed";
} private static void ChangeByRef(ref string temp)
{
temp = temp + "--refchanged";
}
输出结果:
a
a--refchanged
● 在Change()方法中,虽然改变了temp的值,但方法没有返回值,打印temp依然是初始值a;
● 在ChnageByRef()方法中,由于加上了关键字,虽然也没有返回值,当改变temp的值后,temp的引用地址发生了改变,再次打印,temp的值为新的引用地址对应的值。
参数是类类型的例子
class Program
{
static void Main(string[] args)
{
Pet p = new Pet(){Age = 5};
Console.WriteLine("初始年龄是:{0}", p.Age);
ChangeAge(p);
Console.WriteLine("改变pet的属性值后,年龄是:{0}", p.Age);
ChangeAgeByRef(ref p);
Console.WriteLine("改变pet引用地址后,年龄是:{0}", p.Age);
Console.ReadKey();
} private static void ChangeAge(Pet p)
{
p.Age = 10;
} private static void ChangeAgeByRef(ref Pet p)
{
p = new Pet(){Age = 20};
}
} public class Pet
{
public int Age { get; set; }
}
输出结果:
● 在ChangeAge()方法中,改变的是Pet实例的属性值。
● 在ChangeAgeByRef()方法中,改变的Pet实例的引用地址。
总结
方法参数无论是简单类型,还是类类型,当在其前加上ref关键字后,对参数的赋值,实际上是改变的是方法参数变量的引用地址。使用ref注意点:
● 使用带ref的方法之前,需要给方法参变量赋上初始值
● 无论是定义方法还是使用方法,都要带上关键字ref
使用C#中的ref关键字,用2个简单例子来说明的更多相关文章
- 如何用java语言实现C#中的ref关键字(按引用传递参数)的效果
https://www.cnblogs.com/nnngu/p/8300164.html
- SEXTANTE中调用任意C++控制台程序的简单例子
在sextante中单纯利用python或者调用sextante已有算法进行自定义开发,很多情况下速度不咋给力,同样的操作调用QGIS的C++插件比用sextante里的算法要快,有时候快的 还不止一 ...
- ref关键字的作用
ref关键字使参数按引用传递.其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中. 就是说,在调用方法的参数中使用ref关键字可以使得变量能够改变. ref和out都是 ...
- C#中三个关键字params,Ref,out
关于这三个关键字之前可以研究一下原本的一些操作 using System; using System.Collections.Generic; using System.Text; namespace ...
- C# 中三个关键字params,Ref,out
一. using System; using System.Collection.Generic; using System.Text; namespace ParamsRefOut { class ...
- C#中 ref 关键字的认识和理解
之前接手老项目的时候有遇到一些的方法参数中使用了ref关键字加在传参的参数前面的情况.对于新手,这里介绍和讲解一下ref的用法和实际效果. CLR中默认所有方法的参数传递方式都是传值,也就是说不管你传 ...
- C#中ref关键字的用法总结
ref表示引用的意思,C#中它有多种用法,这里简单总结一下: 1.按引用传递参数 具体可见:C#中的值传递与引用传递(in.out.ref) 2.引用局部变量 引用局部变量指的是在变量声明时使用ref ...
- C#中引用类型的变量做为参数在方法调用时加不加 ref 关键字的不同之处
一直以为对于引用类型做为参数在方法调用时加不加 ref 关键字是没有区别的.但是今天一调试踪了一下变量内存情况才发现大有不同. 直接上代码,结论是:以下代码是使用了 ref 关键字的版本.它输出1 ...
- Swift中的一些关键字
以下关键字关于引用传参.属性.修改成员变量.静态变量.索引和构造函数重载 读过The Swift Programming Language的人都能看得出,我上面的这几个说法全不是apple的习惯用语. ...
随机推荐
- 【oracle】入门学习(二)
oracle登录身份有三种:normal 普通身份sysdba 系统管理员身份sysoper 系统操作员身份每种身份对应不同的权限 sysdba权限:●启动和关闭操作●更改数据库状态为打开/装载/备份 ...
- sql server 提取汉字/数字/字母的方法
sql server 提取汉字/数字/字母的方法 --提取数字 IF OBJECT_ID('DBO.GET_NUMBER2') IS NOT NULL DROP FUNCTION DBO.GET_NU ...
- Linux学习笔记:ctrl+z、ctrl+c、ctrl+d的区别
ctrl+c和ctrl+z都是中断命令,但是他们的作用却不一样. 1.ctrl+c是强制中断程序的执行,进程已经终止. 2.ctrl+z的是将任务中止(暂停的意思),但是此任务并没有结束,他 ...
- 防止一个exe被打开多次
mutex有一个名字,如果这个exe已经打开了,createNew返回的就是false,程序就退出了. 这是个wpf application的例子 protected override void On ...
- 全方位掌握nsis脚本
NSIS 确实是一个不错的安装程序制作软件.新版本 2.0a7 真正实现了中文支持和支持 WinXP 的安装对话框. 不过要用它实现漂亮的安装界面和完美的安装功能就必须好好的写脚本. 而 NSIS 的 ...
- CentOS7.5安装MongoDB4.0与CRUD基本操作
一 MongoDB简介 MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数 ...
- mac系统编译安装ImageMagick7.0.1-3
1.下载源码包: git clone http://git.imagemagick.org/repos/ImageMagick.git 2.编译安装: cd ImageMagick/ ./config ...
- 解决ASP.NET MVC(post数据)Json请求太大,无法反序列化(The JSON request was too large to be deserialized)
这个问题出现的场景并不是很多,当你向服务端异步(ajax)post数据非常大的情况下(比如做权限管理的时候给某个角色分配权限那么就可能会出现,我所遇到的就是该角色大概200个模块每个模块平均2个功能- ...
- 跟我一起学WPF(0):初识WPF
WPF是什么 WPF是微软的新一代图形引擎系统,全称为Windows Presentation Foundation,从.NET3.0版本开始引入,为用户界面.2D/3D 图形.文档和媒体提供了统一的 ...
- Android应用程序签名打包(AS)
使用Android studio对Android应用签名步骤: 第一步: 第二步: 第三步: 第四步: 数字证书创建完成后,点击OK----->点击Next------>Finish. 注 ...