zoukankan      html  css  js  c++  java
  • c#中的Out, params,ref 细说并沉淀

    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参数,而且必须是放在参数列表的最后一个参数,为了避免歧义。

  • 相关阅读:
    Progressbar
    winform c# 打包
    WinForm中给DataGridView添加 自动编号
    ASP.NET页面的CheckBoxList组件
    C#截取DOS命令输出流取得网卡MAC地址
    get; set ; 害的我搞了一天
    WinForm(C#) 引用app.config文件中的数据库
    WinForm编程中 Enter自动登录设置
    vs新建解决方案,添加新项目,为什么不在解决方案中显示
    使用delegate实现两窗体传参代码
  • 原文地址:https://www.cnblogs.com/wwwzzg168/p/3568995.html
Copyright © 2011-2022 走看看