博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c#中的Out, params,ref 细说并沉淀
阅读量:5958 次
发布时间:2019-06-19

本文共 2664 字,大约阅读时间需要 8 分钟。

1. Out,params,ref之前先记录平时用的最多的按值传递参数的情况,当然默认情况下参数传入函数的默认行为也是按值传递的。

1:  //默认情况下参数会按照值传递
2:  static int add(int x,int y) {
3:  int ans = x + y;
4:              x = 1000; y = 2000;
5:  return ans;
6:          }
 
1:  static void Main(string[] args) {
2:              Console.WriteLine("默认情况下按值传递");
3:  int x = 3, y = 8;
4:              Console.WriteLine("调用前:x:{0},y:{1}",x,y);
5:              Console.WriteLine("调用后的结果:{0}",add(x,y));
6:              Console.WriteLine("调用后:x:{0},y:{1}",x,y);
7:              Console.ReadLine();
8:          }

  输出的结果跟我们预期的一样:

     2009-12-13 22-05-36

  2.Out修饰符

1:  static void add(int x,int y,out int ans) {
2:              ans = x + y;
3:          }

 

  Main里面可以这么写:

1:   int ans;
2:   add(20, 20, out ans);
3:   Console.WriteLine("20+20={0}", ans);
4:   Console.ReadLine();

   输出的结果当然是:20+20=40啦,这个在原来如果没有用out的话那会出现“使用了未赋值的局部变量”。

   那即使我们给ans赋值如:int ans=10;

   它在调用add方法之后也不会改变,因为调用的方法根本不知道里面发生了什么。

   这样就变成了20+20=10了,显然是错的。

   当然Out的最大的亮点,就是在一个函数调用之后可以输出多个参数值。

   将上面的方法改为:

1:  static void setParams(out int x,out string y,out bool ans) {
2:              x = 2;
3:              y = "YeanJay";
4:              ans = true;
5:          }

我们在Main里面可以这么写:

1:  int x=3;
2:  string y = "ken";
3:  bool ans = false;
4:              setParams(out x,out y,out ans);
5:              Console.WriteLine("x:{0},y:{1},ans:{2",x,y,ans);
 

结果:

   2009-12-13 22-35-06

显然在调用setParams之后相应的变量已经改变了。

  这里对Out要注意的一点,在方法体内部必须对加有out 的参数赋值,不然会出现编译错误:必须对输出类型的参数赋值。

3.ref修饰符

最重要的一点,也是跟Out不同的一点,就是使用ref修饰符的时候需要事先对需要ref的参数赋值,不然就会出现对没有赋值的参数进行

操作的编译错误,而out是可以在事先不对变量进行赋值。

看方法:

  

1:  static void SwapStrings(ref string str1,ref string str2) {
2:  string temp;
3:              temp = str1;
4:              str1 = str2;
5:              str2 = temp;
6:          }

 

方法很简单,就是交换两个字符串。

看Main里面吧,可以这么写:

1:  string str1 = "Yean";
2:  string str2 = "Jay";
3:              Console.WriteLine("调用前:str1:{0},str2:{1}",str1,str2);
4:              SwapStrings(ref str1, ref str2);
5:              Console.WriteLine("调用后:str1:{0},str2:{1}",str1,str2);

结果:

    2009-12-13 22-54-39

4.params修饰符

  说白了就是一个数据作为参数。

  直接看方法:

1:   static double CalculateAverage(params double[] values) {
2:              Console.WriteLine("字符串的长度:{0}",values.Length);
3:  double sum = 0;
4:  if (values.Length == 0) {
5:  return sum;
6:              }
7:  else {
8:  foreach (var value in values) {
9:                      sum += value
10:                  }
11:  return (sum / values.Length);
12:              }
13:          }

一个求平均值的方法,也很简单。

然后看下Main中的写法:

1:  double[] data = { 2.2,2.5,1.1,5.3};
2:  double average = CalculateAverage(data);
3:              Console.WriteLine("最后的平均值:{0}",average);

 

 

 

结果就不写了。

这里需要注意的:C#中只支持一个params参数,而且必须是放在参数列表的最后一个参数,为了避免歧义。

转载于:https://www.cnblogs.com/wwwzzg168/p/3568995.html

你可能感兴趣的文章
新手入坑mpvue(没朋友)实战指南
查看>>
微信小程序组件开发规范
查看>>
15个必备的javascript小技巧,看的懂是入门,全会写就是大牛
查看>>
关于java集合框架的总结
查看>>
前端每日实战:7# 视频演示如何用纯 CSS 创作一个 3D 文字跑马灯特效
查看>>
前端构建工具 -- Webpack
查看>>
几种排序算法及 Python 实现
查看>>
java后端的学习之路(一) ------ mysql和jdbc&DBUtils
查看>>
(LeetCode-数组-2) 只出现一次的数字
查看>>
基于Nginx的中间件架构(三):Rewrite规则、secure_link和Geoip读取地域信息模块、HTTPS服务...
查看>>
CSS引入外部字体方法,附可用demo
查看>>
窥探React - 源码分析
查看>>
HTML之基础介绍
查看>>
puppeteer_node爬虫分布式进阶
查看>>
Phoenix报错(2-2)AccessDeniedException: Insufficient permissions
查看>>
leetcode 605 Can Place Flowers
查看>>
JS 单例模式
查看>>
解决oninput事件在中文输入法下会取得拼音的值的问题
查看>>
Hooking & Executing Code with dlopen & dlsym -- C functions
查看>>
GitLab 安装笔记
查看>>