黑马程序员_浅谈out参数、ref参数和可变参数

1、out参数

out关键字会导致参数通过引用来传递,通俗点说,就是往外传值的。

out参数的作用:用于以内部变量为外部变量赋值的,out一般适用于某个方法不只是使用return返回单个值,而是需要有多个返回值的情况。

out参数的使用需要注意以下几点:

 1)out参数传递的变量在传递之前不需要对其进行初始化。

分析:在调用方法之前,对out参数传递的变量只需声明,可以赋值也可以不赋值,不过反正都是要在调用时被覆盖掉,所以大可不必赋值,因为赋值了虽然不会报错,但却根本也没有用处,没必要多此一举!(详见以下代码)

2)如果方法的参数有使用out关键字修饰时,在调用该方法时,记住也要在out参数传递的变量前面加上out才行。

分析:加上out能表明这个参数不是传入的,而是传出值的,但是out修饰的参数依然可以传入值;不加out关键字,会使得该 参数成为无效参数而报错。

3)方法使用了out参数传递变量时,就是要返回值,所以必须在方法返回值或方法结束之前,对out所修饰的变量进行赋值。

 1         static void Main(string[] args)
 2         {
 3             int rst;   //out修饰的变量在调用之前只需声明即可
 4             int num=8;
 5             if (isMod(num, out rst))   //记住加上out修饰变量
 6             {
 7                 Console.WriteLine("{0}是偶数,{0}/2={1}", num, rst);
 8             }
 9             else
10             {
11                 Console.WriteLine("{0}不是偶数",num);
12             }
13             Console.ReadKey();
14         }
15
16         public static bool isMod(int number,out int result)//通过参数返回值
17         {
18             if (number % 2 == 0)
19             {
20                 result = number / 2;  //方法结束之前必须对result赋值
21                 return true;
22             }
23             else
24             {
25                 result = 0;  //方法结束之前必须对result赋值
26                 return false;
27             }
28         }

在上述代码中,out 修饰了rst 和result 两个变量,就相当于在它们之间建立了一种联系,对result 进行赋值也就是对rst进行赋值,等于把方法中的局部变量的值返出去了,成功达到了通过参数返值的目的。

4)另外,若是要在方法内部使用out 修饰的变量,如上述程序,在isMod 方法中使用result 之前,必须先对其进行赋值才能使 用。虽然可能在isMod 方法被调用之前,已经对rst 赋值,比如 rst=2,当参数rst 以out 形式传入时,result 虽然也能收到rst 传来的值,即调用时result 也等于2,然而,在isMod 方法里想要使用result 变量时,还是必须先要对它赋一次值,这就显得调用之前的赋值变得毫无意义。

2、Ref参数

ref 关键字,同out一样,可以使得参数通过引用来传递。换句话说,ref能够让你直接对原来那个数进行操作,而不是将原数复制一份,对那个复制项进行操作。

ref参数的作用:与out不同的是,它可以双向传值,主要适用于场景内部对外部的值进行改变的情况。

ref参数的使用需要注意以下几点:

1)ref参数传递的变量在传递之前一定要对其进行初始化赋值。

分析:ref本来就适用于场景内部对外部的值进行改变的情况,所以在传参之前,一定要对其赋初值,才能有值传过去。

2)如果方法的参数有使用ref关键字修饰时,在调用该方法时,记住也要在ref参数传递的变量前面加上ref才行。

分析:加上ref能表明这个参数既是传入的,又可以是传出值的,不加ref关键字,会使得该参数成为无效参数而报错,num和number两个变量都使用了ref来修饰,使得number指向了num,所以在Test方法中对number进行操作时,就是对num进行操作。(详见以下代码)

 1        static void Main(string[] args)
 2         {
 3             int num = 100;  //ref修饰的变量,必须对其赋初值
 4             Test(ref num);  //记住加上ref变量
 5             Console.WriteLine(num);
 6             Console.ReadKey();
 7         }
 8
 9         public static void Test(ref int number)
10         {
11             int numA = number;
12             number = 2; //不一定要赋值
13         }

3)方法使用了ref参数传递变量时,不同于out,没有要求一定在方法返回值或方法结束之前,对ref所修饰的变量进行赋值,所以可以不赋值。

4)另外,若是要在方法内部使用ref修饰的变量,如上述程序,在Test方法中使用number之前,因为要求已经对即将传入的num,赋了初值100,不同于out,此时可以在Test方法内直接使用number变量,并且,当参数num以ref形式传入时,number就能收到num传来的值,即调用时number也等于100,之后改变number的值,也同时改变了num的值。

3、可变参数

params 是关键字,可以使得在参数个数可变处采用参数的数组型参数,比如 int sum(params int[] values)。

    可变参数的作用:使得个数不确定的可变参数以数组的形式传递,适合于方法的参数个数未知的情况时,用于传递大量的数组集合参数。

    可变参数在使用时需注意:

1)不允许将params修饰符与refout修饰符组合起来使用。

2)当方法的参数列表中有多个参数时,params修饰的参数必须放在最后,不能放在前面,以免程序不好确定参数究竟有多少个而报错。比如: int sum(string name,params int[] values)

3) 一个方法当然可以包含可变参数和不变参数,两个可以同时使用。

这样,有了可变参数,就可以在某些情况下根据特定的需要来确定方法的参数个数。

    小结:

    这是我的第一篇学习日记,知识点可能讲的不是很细,但其中的每一点都是我自己归纳出来的,以前只学过点C++基 础,没接触过C#,更不知道有Out参数、Ref参数和可变参数这三个概念,通过学习黑马基础入门视频的C#编程基础部分,以及查阅相关资料,对这三个知识点已经能够基本掌握,还记得当初跳着看视频,不能理解调用int.TryParse方法时,为什么要在参数前加上out,out又有什么作用,现在已经能清楚地运用它们了。即使这是些很简单的内容,但是却是很重要的基础,我需要把它记录下来,以便于提醒自己。现在发现,写学习笔记不仅可以提高自己的表达能力,还有助于学习。

    我告诉自己,需要坚持下去!

详细请查看:www.itheima.com

黑马程序员_浅谈out参数、ref参数和可变参数

时间: 2024-08-02 10:44:25

黑马程序员_浅谈out参数、ref参数和可变参数的相关文章

黑马程序员_集合

集合1.集合和对象数组的区别: 数组的长度不可变,集合的可变: 数组可以存储基本数据类型和对象,集合只能存储对象. 集合的框架图 集合派系的顶层接口Collection1.Collection集合存储对象的方法: add(E e)将元素存储到集合中 addAll(Collection c)将一个集合添加到另外的集合中2.Collection集合提取对象的方法: 通过迭代器iterator中的方法:hasNext()和next()来取出 Iterator it=new iterator(); wh

黑马程序员_交通灯管理系统

(1)项目的需求 模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 例如: 由南向而来去往北向的车辆 右转车辆 由东向而来去往南向的车辆 ---- 左转车辆 平时开车过十字路口红绿灯的时候,也知道红绿灯运行的顺序 (1)任何方向的车,向右边转弯的时候,是不需要看红绿灯 (2)在十字路口,相对方向的红绿灯的工作方式是一样的,南相对与北,东相对与西,这把它分成两对 (3)红绿灯顺序,一对直行通道绿灯直行车辆,等直行变红,还是这对的车辆可以左转,等左转变红,就轮到下一对了.所以在设计程序的时候,只

黑马程序员_构造函数间的调用

这是我的第一篇博客,从这篇开始我将记录下学习java的心得体会,欢迎志同道合的朋友随时与我讨论,共同进步. 我们都知道,函数间可以互相调用.构造函数是一种特殊的函数,它用来给对象进行初始化,如果想在构造构造函数中调用另一个构造函数,分为以下两种情况: 1.子类调用父类的构造函数 先来看一段代码 1 class Person 2 { 3 public Person() 4 { 5 // 构造语句 6 } 7 } 8 9 class Student extends Person 10 { 11 pu

黑马程序员_毕向东_Java基础视频教程_Java基础学习知识点总结

黑马程序员_毕向东_Java基础视频教程 Java基础学习知识点总结 2016年01月06日  day01 一.基础知识:软件开发 1.什么是软件?软件:一系列按照特定顺序组织的计算机数据和指令的集合. 2.常见的软件:系统软件:如:DOS,Windows,Linux等.应用软件:如:扫雷,迅雷,QQ等. 3.什么是开发?制作软件. 二.基础知识:人机交互方式 4.软件的出现实现了人与计算机之间的更好的交互. 5.交互方式:图形化界面:这种方式简单直观,使用者易于接受,容易上手操作.命令行方式:

黑马程序员_高新技术_1_Java反射

------- android培训.java培训.期待与您交流! ---------- 0.反射知识体系 下图为反射整体的知识体系,把握住此图也就全局上掌握住反射所有内容. 1.反射概论 1)反射概念 其实字面上可以这么理解反射,平时使用类时都是由类new出对象,而反射则是通过对象"反射"出类的信息,好比一个人照镜子可以看到人类的特征,而看出机制就是镜子反射. 2)Java对象两种类型 Java程序中的许多对象在运行时会出现两种类型:编译时类型和运行时类型.如下代码: Person p

黑马程序员_使用Jquery实现AJAX功能

1.AJAX是什么? AJAX技术虽然一直听过,但是真正用起来还是工作有一年了的时候,当时需要实现一个异步更新推送的功能.如:在档案管理系统中,存在代办事项和站内信,而这些模块需要在页面不刷新的情况下定时的反馈给前台待办事项的数量以及简要内容,站内信也是如此.这个时候我认为只有AJAX能够胜任,那AJAX是什么?AJAX是在不重新加载整个页面的情况下与服务器交换数据并更新部分网页的技术. 2.为什么使用Jquery来实现? 学习ASP.NET开始,Jquery的强大已经深深捕获了我,而且我还记着

大数据-将MP3保存到数据库并读取出来《黑马程序员_超全面的JavaWeb视频教程vedio》day17

黑马程序员_超全面的JavaWeb视频教程vedio\黑马程序员_超全面的JavaWeb教程-源码笔记\JavaWeb视频教程_day17-资料源码\day17_code\day17_1\ 大数据 目标:把mp3保存到数据库中! 在my.ini中添加如下配置! max_allowed_packet=10485760 1 什么是大数据 所谓大数据,就是大的字节数据,或大的字符数据.标准SQL中提供了如下类型来保存大数据类型: 类型 长度 tinyblob 28--1B(256B) blob 216

黑马程序员_学习IOS之字典常用的方法

字典是无序的 数组是有序的.字典分为:可变字典和不可变字典  不可变字典对象 NSDictionary * dict = [[NSDictionary alloc]initWithObjectsAndKeys:@"one",@"1",@"two",@"2",@"three",@"3",@"four",@"4", nil]; //value = ke

黑马程序员_多线程

------- android培训.java培训.期待与您交流! ---------- 多线程1.进程: 正在运行的程序所占有的内存空间,叫做进程. 线程: 一个应用程序中的子程序,对于CPU,子程序可以有一条独立的执行路径,称为线程. 线程特点:依靠一个应用程序,对于其他子程序,独立被CPU执行的2.多线程的好处: 充分利用CPU的资源,程序的同时运行,提高效率3.java中线程创建的两种方法: 第一种: 定义类继承Thread class extends Thread 重写Thread中的r