C# ref、out、params与值类型参数修饰符
1.值类型:
static void Main(string[] args)
{
int a = ;
int b = ;
NumVal(a, b);
Console.WriteLine("a={0},b={1}", a, b); //输出结果为:a=5,b=3 Console.ReadKey();
} static void NumVal(int a, int b)
{
a = a + b;
b = a - b;
}
代码
值类型被当做参数时,传递的是值的副本,所以在下面的方法中修改参数的值并不能影响函数调用中指定的参数的值。
当然也可以为函数定义返回值从而得到一些想要的结果:
static void Main(string[] args)
{
int a = ;
int b = ;
int num1 = NumVal(a, b);
int num2 = NumValC(a, b);
Console.WriteLine("a={0},b={1}", num1, num2); //输出结果为:a=8,b=2 Console.ReadKey();
} static int NumVal(int a, int b)
{
a = a + b;
return a;
} static int NumValC(int a, int b)
{
b = a - b;
return b;
}
代码
但是这样做不好的地方就是不能改变用作参数的多个变量值。(因为函数只有一个返回值)。
2.引用类型(ref):
static void Main(string[] args)
{
int a = ;
int b = ;
NumVal(ref a, ref b);
Console.WriteLine("a={0},b={1}", a, b); //输出结果为:a=8,b=2 Console.ReadKey();
} static void NumVal(ref int a, ref int b)
{
int c = a; // c=5
a = a + b; // a=5+3
b = c - b; // b=5-3
}
代码
此时可以通过“引用”参数修饰符(即关键字 ref)传递参数,这样函数处理与函数调用中使用的变量就是同一个(因为引用类型参数传递的是引用的地址),所以在方法中对这个变量进行任何修改都会影响用作参数的变量的值。
但经过 ref 修饰符修饰的变量在用作函数的参数传递时必须先初始化,不能在函数中进行初始化操作。
3.输出类型(out):
static void Main(string[] args)
{
int a;
int b;
NumVal(out a, out b);
Console.WriteLine("a={0},b={1}", a, b); //输出结果为:a=15,b=4 Console.ReadKey();
} static void NumVal(out int a, out int b)
{
a = ;b = ; // 初始化输出参数 int c = a;
a = a * b;
b = (c + b) / ;
}
代码
out 关键字的使用方式和 ref 关键字类似,使参数按引用传递值。
不同之处:ref 参数在用作参数传递时必须先初始化。out 参数则不需要在传递之前初始化(就算在传递之前已经初始化,在函数里面也需要重新初始化,忽略传递之前初始化的值),但必须在方法结束返回之前赋值。
4.参数数组(params):
static void Main(string[] args)
{
int i = ;
int[] arr = new int[] { , , , , }; //可以先定义一个数组对象 SumVals(ref i, arr); //然后把这个数组对象作为参数传递 Console.WriteLine("总共有{0}个元素!", i); //输出结果为:总共有5个元素! SumVals(ref i, , , , , ); //也可以直接调用 Console.ReadKey();
} static void SumVals(ref int i,params int[] vals)
{
for (i = ; i < vals.Length; i++)
{
Console.WriteLine("第{0}个元素为:{1}", i + , vals[i]);
}
}
代码
C#中函数可以指定一个特定的参数(即 params 修饰的参数数组,只能有一个),且这个参数必须是函数定义中的最后一个参数(即 params 关键字后面不允许出现任何其他参数)。
params 修饰的参数数组不指定参数的数量,唯一的限制就是所有的参数类型必须和参数数组是同类型。
C# ref、out、params与值类型参数修饰符的更多相关文章
- C#中方法的参数修饰符
做项目久了,有的时候真的需要静下心来认真的总结一下自己所用到的技术,而不是每天依葫芦画瓢,每天忙忙碌碌,到头来不知道自己忙了个啥,学了什么,自己到底掌握了多少知识.所以我想回顾一下C#的基础知识,把重 ...
- Vue修饰符
为了方便大家写代码,vue.js给大家提供了很多方便的修饰符,比如我们经常用到的取消冒泡,阻止默认事件等等~ 目录 表单修饰符 事件修饰符 鼠标按键修饰符 键值修饰符 v-bind修饰符(实在不知道叫 ...
- 事件&vue修饰符
JavaScript 事件 HTML事件是发生在HTML元素上的事情.当在HTML页面帐使用JavaScript时,javascript可以触发这些事件 HTML 事件 HTML事件可以是浏览器的行为 ...
- 深入浅出OOP(五): C#访问修饰符(Public/Private/Protected/Internal/Sealed/Constants)
访问修饰符(或者叫访问控制符)是面向对象语言的特性之一,用于对类.类成员函数.类成员变量进行访问控制.同时,访问控制符也是语法保留关键字,用于封装组件. Public, Private, Protec ...
- Java中的(构造方法、方法重载、final修饰符使用及继承和抽象)
构造方法: 构造方法的名称和类名相同,没有返回类型,参数列表(类型.个数)不同 方法重载:成员方法和构造方法都可以进行重载 方法名相同但是参数列表(类型,个数)不同,成为方法的重载. 继承:直支持单继 ...
- C#学习笔记06--类/对象/访问修饰符/方法
编程思想 1.面向过程 面向过程是要把问题解决的过程分成有一定顺序的不同步骤, 然后按照步骤一步步的将问题解决. 2.面向对象 面向对象解决问题的思路是先分析问题中所涉及的对象, 然后 ...
- vue 学习三 v-model 表单绑定输入 以及修饰符的用处
v-model 指定使用过vue的同学都应该是很熟悉的了,这里就不多介绍,本章主要就是记录一些v-model非常实用的修饰符和对于v-model在html文本框,多行文本框,选择框,单选框,复选框上对 ...
- 参数修饰符ref,out ,params的区别
参数修饰符ref,out ,params的区别 C#中有三个关键字-ref,out ,params,可是这三个之间的区别你都明白了吗? 那么我们就来认识一下参数修饰符ref,out ,params吧, ...
- C#之out修饰符、ref修饰符、params修饰符的简单介绍
一.out修饰符 1.调用一个带有输出参数的方法也需要使用out 修饰符,但是作为输出变量传递的本地变量在将他们作为输出变量传递前不需要赋值(因为调用后会改变或丢失),编译器允 许 ...
随机推荐
- CocoaPods安装和使用
CocoaPods是iOS最常用的第三方类库管理工具,绝大部分有名的开源类库都支持CocoaPods. CocoaPods是用Ruby实现的,要想使用它首先需要有Ruby的环境.幸运的是OS X系统默 ...
- 如何直接在ftp里编辑文件
首先要连接ftp,如何链接ftp,这个我已经分享过,如果还有不懂的,可以查看下经验分享,打开ftp,并连接你要修改的站点! 下载安装代码编辑器,比如EditPlus.sublime text等,随 ...
- Symmetric Tree
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...
- win下sass安装失败的一种可能
首先声明,本篇转自CSDN的LZGS_4. 今天我也遇到这个问题,就把文章擅自转载了,方便自己也方便更多的人吧. 因为sass和compass依赖于ruby环境,所以装之前先确认装了ruby.可到官网 ...
- 【BO】为WEBI报表添加自定义字体font
本篇主要讲解如何为sap business objects 的web intelligence报表组件新增字体.因为系统默认预设的字体对中文而言实在是太丑了,有的字体特喵的直接把中文变成方框框了! 一 ...
- Spring3:AOP
AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.OOP引入 ...
- BlockCanary 一个轻量的,非侵入式的性能监控组件(阿里)
开发者博客: BlockCanary — 轻松找出Android App界面卡顿元凶 开源代码:moduth/blockcanary BlockCanary对主线程操作进行了完全透明的监控,并能输出有 ...
- SecureCRT中python脚本编写
SecureCRT中python脚本编写学习指南 SecureCRT python 引言 在测试网络设备中,通常使用脚本对设备端进行配置和测试以及维护:对于PE设备的测试维护人员来说使用较多是Secu ...
- 《Storm入门》中文版
本文翻译自<Getting Started With Storm>译者:吴京润 编辑:郭蕾 方腾飞 本书的译文仅限于学习和研究之用,没有原作者和译者的授权不能用于商业用途. 译者序 ...
- java接口的嵌套
java接口 1.接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值 2.接口中的方法默认都是 public abstract ...