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与值类型参数修饰符的更多相关文章

  1. C#中方法的参数修饰符

    做项目久了,有的时候真的需要静下心来认真的总结一下自己所用到的技术,而不是每天依葫芦画瓢,每天忙忙碌碌,到头来不知道自己忙了个啥,学了什么,自己到底掌握了多少知识.所以我想回顾一下C#的基础知识,把重 ...

  2. Vue修饰符

    为了方便大家写代码,vue.js给大家提供了很多方便的修饰符,比如我们经常用到的取消冒泡,阻止默认事件等等~ 目录 表单修饰符 事件修饰符 鼠标按键修饰符 键值修饰符 v-bind修饰符(实在不知道叫 ...

  3. 事件&vue修饰符

    JavaScript 事件 HTML事件是发生在HTML元素上的事情.当在HTML页面帐使用JavaScript时,javascript可以触发这些事件 HTML 事件 HTML事件可以是浏览器的行为 ...

  4. 深入浅出OOP(五): C#访问修饰符(Public/Private/Protected/Internal/Sealed/Constants)

    访问修饰符(或者叫访问控制符)是面向对象语言的特性之一,用于对类.类成员函数.类成员变量进行访问控制.同时,访问控制符也是语法保留关键字,用于封装组件. Public, Private, Protec ...

  5. Java中的(构造方法、方法重载、final修饰符使用及继承和抽象)

    构造方法: 构造方法的名称和类名相同,没有返回类型,参数列表(类型.个数)不同 方法重载:成员方法和构造方法都可以进行重载 方法名相同但是参数列表(类型,个数)不同,成为方法的重载. 继承:直支持单继 ...

  6. C#学习笔记06--类/对象/访问修饰符/方法

    编程思想   1.面向过程   面向过程是要把问题解决的过程分成有一定顺序的不同步骤, 然后按照步骤一步步的将问题解决.   2.面向对象   面向对象解决问题的思路是先分析问题中所涉及的对象, 然后 ...

  7. vue 学习三 v-model 表单绑定输入 以及修饰符的用处

    v-model 指定使用过vue的同学都应该是很熟悉的了,这里就不多介绍,本章主要就是记录一些v-model非常实用的修饰符和对于v-model在html文本框,多行文本框,选择框,单选框,复选框上对 ...

  8. 参数修饰符ref,out ,params的区别

    参数修饰符ref,out ,params的区别 C#中有三个关键字-ref,out ,params,可是这三个之间的区别你都明白了吗? 那么我们就来认识一下参数修饰符ref,out ,params吧, ...

  9. C#之out修饰符、ref修饰符、params修饰符的简单介绍

    一.out修饰符 1.调用一个带有输出参数的方法也需要使用out 修饰符,但是作为输出变量传递的本地变量在将他们作为输出变量传递前不需要赋值(因为调用后会改变或丢失),编译器允           许 ...

随机推荐

  1. Codeforces Round #256 (Div. 2)

    A - Rewards 水题,把a累加,然后向上取整(double)a/5,把b累加,然后向上取整(double)b/10,然后判断a+b是不是大于n即可 #include <iostream& ...

  2. type of 操作符和instanceof操作符的区别以及使用方法

    经常见到用typeof和instanceof检测一个变量类型,作为前端小白经常不知道这两者具体的详细用法和区别,今天就整理一下谨记! javaScript中有6中数据类型: 1.Undefinde 2 ...

  3. LINUX内核参数FS与VM相关

    文件系统相关 fs.aio-nr = 0 当前aio请求数 fs.aio-max-nr = 1048576 最大允许的aio请求数 fs.file-nr = 3456 0 94159 已分配的文件ha ...

  4. 13.final关键字

    1.final修饰的变量只能赋一次值,不赋值时,会提示初始化 2.final修饰的方法不能被重写 3.final修饰的类不能被继承

  5. JavaScript 三级联动

    附件连接下载地址:http://files.cnblogs.com/files/CaktyRiven/js.zip <!DOCTYPE html> <html lang=" ...

  6. mysql快速导出数据库ER图和数据字典(附navicat11安装教程及资源)

    ♣ mysql使用navicat11快速导出数据库ER图 ♣ mysql使用navicat11快速导出数据库数据字典 ♣ navicat11 for mysql (这里是mysql5.7.12)专业版 ...

  7. 基于spring 的单元测试

    需要引用的依赖: import org.junit.runner.RunWith;import org.springframework.test.context.ContextConfiguratio ...

  8. 一起来做chrome扩展《基础介绍》

    首先说明,chrome的扩展并不它的插件,网上很多说写插件,其实都是说的扩展.写扩展并不复杂,只要根据chrome提供的一系列的API进行就可以实现很多的功能.只是对API的学习是有代价的,加上国内访 ...

  9. netfiler源代码分析之框架介绍

    netfiler框架是在内核协议栈实现的基础上完成的,在报文从网口接收,路由等方法实现基础上使用NF_HOOK调用相应的钩子来进入netfiler框架的处理,如 ip_rcv之后会调用NF_HOOK( ...

  10. Mysql中实现row_number

    CREATE TABLE `zsl_test` (          `ID` INT(10) NULL DEFAULT NULL,          `class` INT(10) NULL DEF ...