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 修饰符,但是作为输出变量传递的本地变量在将他们作为输出变量传递前不需要赋值(因为调用后会改变或丢失),编译器允 许 ...
随机推荐
- 从零开始山寨Caffe·壹:仰望星空与脚踏实地
请以“仰望星空与脚踏实地”作为题目,写一篇不少于800字的文章.除诗歌外,文体不限. ——2010·北京卷 仰望星空 规范性 Caffe诞生于12年末,如果偏要形容一下这个框架,可以用"须敬 ...
- @寒冬winter 大神的css作业问题
块级元素 ①总是在新行上开始: ②高度,行高以及外边距和内边距都可控制: ③宽度缺省是它的容器的100%,除非设定一个宽度. ④它可以容纳内联元素和其他块元素 行内级元素 ①和其他元素都在一行 ...
- Java知识结构
- 阿里云SLB双机IIS多站点负载均衡部署笔记
首先SLB是通过局域网与ECS链接 ECS1服务器 test文件夹增加index.html test1文件夹增加index.html 设置ECS1服务器(130)IIS test站点 设置test主机 ...
- iOS开发之XCode模拟器不能连接网络
新装的Xcode7 编译程序 出现 #warning: 获取app配置信息失败: The resource could not be loaded because the App Transport ...
- hibernate学习(5)——一对多关系表达
一对多实现 1. 实现类 package com.alice.hibernate02.vo; import java.util.HashSet; import java.util.Set; publi ...
- eclipse SE增加Web开发插件;安装配置Apache
在eclipse SE版本点击"Help"--"Install New Software..."--"Work with"中输入" ...
- J2SE核心开发实战
原图链接:http://naotu.baidu.com/file/7e3fb5d333b8cb665038390617834559?token=3c3c9d183944dd8e 课程来源:https: ...
- spring bean的重新加载
架构体系 在谈spring bean的重新加载前,首先我们来看看spring ioc容器. spring ioc容器主要功能是完成对bean的创建.依赖注入和管理等功能,而这些功能的实现是有下面几个组 ...
- QStriingList
#include <QCoreApplication> #include<QDebug> #include<QStringList> int main(int ar ...