C#中的out 参数,ref参数,值参数
大家可能在编码中或多或少的使用过out的ref,但是是否注意过他两的详细用法以及区别?
本文想介绍下详细介绍下out参数,ref参数以及一般值参数。
值参数
在使用参数时,把一个值传递给函数使用的一个变量。在函数中对此变量的任何修改都不影响函数调用中指定的参数。如下面的函数,是使函数是使传递过来的参数值加倍,并显示出来:
static void ShowDouble(int num)
{
num = num * ;
Console.WriteLine("num*2={0}", num);
}
参数num在函数中被加倍,如果按以下方式调用它:
int num = ;
Console.WriteLine("num={0}", num);
ShowDouble(num);
Console.WriteLine("num={0}", num);
输出到控制台的文本如下所示:
把num作为参数,调用ShowDouble()并不影响Mian()中num的值,即使把num值加倍之后再赋值给num,在函数调用完之后num的值还是不会变。
这也没什么问题。
但是如果我们想改变num的值呢?我们会想到使用为num返回新值的函数:
static int DoubleNum(int num)
{
num = num * ;
return num;
}
然后调用:
int num = ;
Console.WriteLine("num={0}", num);
num = DoubleNum(num);
Console.WriteLine("num={0}", num);
这段代码不是很直观,且不能改变用作参数的多个变量值(因为函数只有一个返回值)。这个时候我们可以想到引用参数,即函数处理的变量和函数调用的变量相同,而不仅仅是值相同的变量。因此对这个变量的任何改变都会影响用作参数的变量值。为此,我们使用ref关键词指定参数。
ref参数
int num = ;
Console.WriteLine("num={0}", num);
ShowDouble(ref num);
Console.WriteLine("num={0}", num);
运行控制台结果如下:
用作ref的参数的变量有两个限制:
1.函数可能会改变引用参数的值,所以必须在函数调用中使用“非常量”变量,所以下面的代码是不被允许的:
const int num = ;
Console.WriteLine("num={0}", num);
ShowDouble(ref num);
Console.WriteLine("num={0}", num);
2.必须使用初始化过的变量。C#不允许假定ref参数在函数调用时初始化,下面的代码也是不被允许的:
int num;
Console.WriteLine("num={0}", num);
ShowDouble(ref num);
Console.WriteLine("num={0}", num);
输出参数(out)
除了ref外,还可以指定out关键字,指定所给的参数时一个输出参数,out参数和ref参数都在函数定义和函数调用中作为参数的修饰符。事实上,它的执行方式与ref参数几乎完全一样,因为在函数执行完毕后,该参数的值将返回给函数调用中使用的变量。但是,二者存在一些重要区别:
1.把未赋值的变量用作ref参数是非法的,但是未赋值的变量可以用作out参数
2.在函数中使用out参数时,必须将其看成尚未赋值。也就是说调用代码可以把已赋值的变量用作out参数,但在函数执行时该变量的值会丢失。
如现在有一个返回数组中最大值得Max()函数,获取数组中最大值得元素索引(这里假设如果有多个最大值,只返回第一个最大值索引),添加out参数:
static int Max(int[] intArray,out int maxIndex)
{
int maxVal = intArray[];
maxIndex = ;
for (int i = ; i < intArray.Length; i++)
{
if(intArray[i]>maxVal)
{
maxVal = intArray[i];
maxIndex = i;
}
}
return maxVal;
}
调用上面的代码:
int[] myArray = { , , , , , , , , , };
int maxIndex;
Console.WriteLine("the maxium value is {0}", Max(myArray, out maxIndex));
Console.WriteLine("the index of the maxium value is{0}", maxIndex + );
控制台输出的结果如下所示:
C#中的out 参数,ref参数,值参数的更多相关文章
- C#中引用参数ref和输出参数out
引用参数 用于按引用传递自变量. 为引用参数传递的自变量必须是具有明确值的变量,并且在方法执行期间,引用参数指明的存储位置与自变量相同. 引用参数使用 ref 修饰符进行声明. 输出参数 用于按引用传 ...
- C#方法参数--值参数,引用参数,输出参数
值参数: 使用值参数,通过复制实参的值到形参的方式,把数据传递到方法,方法被调用的时候,系统做如下操作: 在栈中为形参分配空间: 复制实参到形参. 注意:一个值参数的实参不一定是变量,它可以是任何能够 ...
- scala 学习笔记(03) 参数缺省值、不定个数参数、类的属性(Property)、泛型初步
继续学习,这一篇主要是通过scala来吐槽java的,同样是jvm上的语言,差距咋就这么大呢? 作为一个有.NET开发经验的程序员,当初刚接触java时,相信很多人对java语言有以下不爽(只列了极小 ...
- 04 python学习笔记-函数、函数参数和返回值(四)
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数能提高应用的模块性,和代码的重复利用率.Python提供了许多内建函数,比如print(),我们也可以自己创建函数,这叫做用户自定 ...
- C#方法的六种参数,值参数、引用参数、输出参数、参数数组、命名参数、可选参数
方法的参数有六种,分别是值参数.引用参数.输出参数.参数数组.命名参数.可选参数. 值参数 值参数是方法的默认类型,通过复制实参的值到形参的方式把数据传递到方法,方法被调用时,系统作两步操作: 在栈中 ...
- C#中引用(ref关键字)参数
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 函数的参 ...
- C#方法中参数ref和out的解析
一.C#方法中参数类型 有4种参数类型,有时候很难记住它们的不同特征,下图对它们做一个总结,使之更容易比较和对照. 二.C#方法中的参数 1.值参数 使用值参数,通过复制实参的值到形参的方式把数据传递 ...
- C#中的out参数/ref参数/params可变参数
out参数: out关键字 通过引用来传递参数,在定义方法和调用方法的时候都必须使用out关键字 简单来讲out可以用来返回多个参数类型. static void Main(string[] args ...
- C# 中out,ref,params参数的使用
C#中有三个高级参数,分别是out,ref,params: 1.out参数 方法使用return 只能返回一个值(一个数值或一个指针值),out参数可以帮助我们在一个方法中返回多个值,不限类型. ...
随机推荐
- php实现中文字符串无乱码截取
在PHP开发中会经常用到字符串截取,有的时候字符串截取会出现乱码的情况,那么怎么解决这个问题呢,其实也很容易 首先我们要了解关于中英文占多少字节的问题. ASCII码:一个中文汉字占两个字节的空间. ...
- 一句话HTML编辑器
一句话HTML编辑器 data:text/html,<body oninput="i.srcdoc=h.value"><style>#i{width:70% ...
- SQLI LABS Basic Part(1-22) WriteUp
好久没有专门练SQL注入了,正好刷一遍SQLI LABS,复习巩固一波~ 环境: phpStudy(之前一直用自己搭的AMP,下了这个之后才发现这个更方便,可以切换不同版本的PHP,没装的小伙伴赶紧试 ...
- .NET Core微服务之基于Ocelot实现API网关服务
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.啥是API网关? API 网关一般放到微服务的最前端,并且要让API 网关变成由应用所发起的每个请求的入口.这样就可以明显的简化客户端 ...
- SpringBoot技术栈搭建个人博客【前台开发/项目总结】
前言:写前台真的是我不擅长的东西...所以学习和写了很久很久...前台页面大概开发了两天半就开发好了,采用的静态的html和bootstrap来写,写后台的时候纠结住了...怎么说呢,写页面真的是头疼 ...
- 数据结构系列(2)之 AVL 树
本文将主要讲解平衡二叉树中的 AVL 树,其中将重点讲解二叉树的重平衡方法,即左旋和右旋,以及 3+4 重构:这些方法都是后面要讲的 B 树,红黑树等 BBST 的重要基础:此外在看本文之前最好先看一 ...
- go并发调度原理学习
aaarticlea/jpeg;base64,/9j/4AAQSkZJRgABAQAAkACQAAD/4QB0RXhpZgAATU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAA
- 基于Springboot集成security、oauth2实现认证鉴权、资源管理
1.Oauth2简介 OAuth(开放授权)是一个开放标准,允许用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容,OAu ...
- 使用 MSIX 打包 DotNetCore 3.0 客户端程序
如何你希望你的 WPF 程序能够以 Windows 的保护机制保护起来,不被轻易反编译的话,那么这篇文章应该能帮到你. 介绍 MSIX 是微软于去年的 Windows 开发者日峰会 上推出的全新应用打 ...
- PHP+nginx 启动后访问超时
场景 在Windows上, nginx配置并启动后, 访问报504超时 解决 很尴尬, php-cgi没启动 php-cgi -b