一、out参数
    如果你在一个方法中,返回多个相同类型的值得时候,可以考虑返回一个数组。但是,如果返回多个不同类型的值得时候,返回数组就不行了,那么这个时候,我们可以考虑使用out参数。

    out参数就侧重于在一个方法中可以返回多个不同类型的值。

    out参数要求在方法的内部必须为其赋值**

    1. using System;
    2. namespace _034_out参数
    3. {
    4. class Program
    5. {
    6. static void Main(string[] args)
    7. {
    8. int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
    9. //未使用out
    10. //int[] res = GetMaxMinSumAvg(numbers);
    11. //Console.WriteLine("这个数组最大值:{0},最小值:{1},总和:{2},平均值:{3}", res[0], res[1], res[2], res[3]);
    12. //使用out
    13. int max1, min1, sum1, avg1;
    14. bool b;
    15. string s;
    16. double d;
    17. Test(numbers, out max1, out min1, out sum1, out avg1,out b,out s,out d);
    18. Console.WriteLine("这个数组最大值:{0},最小值:{1},总和:{2},平均值:{3}", max1, min1, sum1, avg1);
    19. Console.WriteLine(b);
    20. Console.WriteLine(s);
    21. Console.WriteLine(d);
    22. Console.ReadKey();
    23. }
    24. /// <summary>
    25. /// 计算一个数组的最大值,最小值,总和,平均值
    26. /// </summary>
    27. /// <param name="nums">所求的数组</param>
    28. /// <returns>返回数组的最大值,最小值,总和,平均值</returns>
    29. public static int[] GetMaxMinSumAvg(int[] nums)
    30. {
    31. int[] res = new int[4];
    32. //假设 res[0]最大值,res[1]最小值,res[2]总和,res[3]平均值
    33. res[0] = nums[0];
    34. res[1] = nums[0];
    35. res[2] = 0;
    36. for (int i = 0; i < nums.Length; i++)
    37. {
    38. if (nums[i] > res[0])
    39. {
    40. res[0] = nums[i];
    41. }
    42. if (nums[i] < res[1])
    43. {
    44. res[1] = nums[i];
    45. }
    46. res[2] += nums[i];
    47. }
    48. res[3] = res[2] / nums.Length;
    49. return res;
    50. }
    51. /// <summary>
    52. /// 计算一个数组的最大值,最小值,总和,平均值
    53. /// </summary>
    54. /// <param name="nums">要求值的数组</param>
    55. /// <param name="max">多余返回的最大值</param>
    56. /// <param name="min">多余返回的最小值</param>
    57. /// <param name="sum">多余返回的总和</param>
    58. /// <param name="avg">多余返回的平均值</param>
    59. public static void Test(int[] nums,out int max,out int min,out int sum,out int avg,out bool b,out string s,out double d)
    60. {
    61. //out参数要求在方法的内部必须为其赋值
    62. max = nums[0];
    63. min = nums[0];
    64. sum = 0;
    65. for (int i = 0; i < nums.Length; i++)
    66. {
    67. if (nums[i]>max)
    68. {
    69. max = nums[i];
    70. }
    71. if (nums[i]<min)
    72. {
    73. min = nums[i];
    74. }
    75. sum += nums[i];
    76. }
    77. avg = sum / nums.Length;
    78. b = true;
    79. s = "wxl";
    80. d = 3.14;
    81. }
    82. }
    83. }
    1. using System;
    2. namespace _035_out参数的使用
    3. {
    4. class Program
    5. {
    6. static void Main(string[] args)
    7. {
    8. #region 输入用户名和密码
    9. //分别提示用户输入用户名和密码
    10. //写一个方法来判断用户输入的是否正确
    11. //返回给用户一个登陆结果,并且还要单独的给用户返回一个登陆信息
    12. Console.WriteLine("请输入用户名:");
    13. string UserName = Console.ReadLine();
    14. Console.WriteLine("请输入密码");
    15. string UserPwd = Console.ReadLine();
    16. string msg;
    17. bool b = IsLogin(UserName, UserPwd, out msg);
    18. Console.WriteLine("登陆结果:{0}", b);
    19. Console.WriteLine("登陆信息:{0}", msg);
    20. #endregion
    21. #region 自己写int.tryparse
    22. //自己写int.tryparse
    23. Console.WriteLine("请输入一个数据:");
    24. string s = Console.ReadLine();
    25. int num;
    26. //bool b1 = int.TryParse("123", out num);
    27. bool b1 = MyTryParse(s, out num);
    28. Console.WriteLine(num);
    29. Console.WriteLine(b1);
    30. #endregion
    31. Console.ReadKey();
    32. }
    33. /// <summary>
    34. /// 判断用户是否登陆成功
    35. /// </summary>
    36. /// <param name="name">用户名</param>
    37. /// <param name="pwd">密码</param>
    38. /// <param name="msg">多余返回的登陆信息</param>
    39. /// <returns>返回登陆结果</returns>
    40. public static bool IsLogin(string name, string pwd, out string msg)
    41. {
    42. if (name == "admin" && pwd == "888888")
    43. {
    44. msg = "登陆成功";
    45. return true;
    46. }
    47. else if (name == "admin")
    48. {
    49. msg = "密码错误";
    50. return false;
    51. }
    52. else if (pwd == "888888")
    53. {
    54. msg = "用户账号错误";
    55. return false;
    56. }
    57. else
    58. {
    59. msg = "未知错误";
    60. return false;
    61. }
    62. }
    63. /// <summary>
    64. /// 判断输入的数据是否为整型
    65. /// </summary>
    66. /// <param name="s">用户输入的数据</param>
    67. /// <param name="result">多余返回的结果</param>
    68. /// <returns>是否为整型</returns>
    69. public static bool MyTryParse(string s,out int result)
    70. {
    71. result = 0;
    72. try
    73. {
    74. result = Convert.ToInt32(s);
    75. return true;
    76. }
    77. catch
    78. {
    79. return false;
    80. }
    81. }
    82. }
    83. }

    二、ref参数
    能够将一个变量带入一个方法中进行改变,改变完成后再将改变后的值带出方法。

    ref参数要求在方法外必须为其赋值,而方法内可以不赋值。**

    1. using System;
    2. namespace _36_ref参数
    3. {
    4. class Program
    5. {
    6. static void Main(string[] args)
    7. {
    8. double salary = 5000;
    9. JiangJIn(ref salary);
    10. Console.WriteLine(salary);
    11. FaKuan(salary);
    12. Console.WriteLine(salary);
    13. Console.ReadKey();
    14. }
    15. public static void JiangJIn(ref double s)
    16. {
    17. s += 500;
    18. }
    19. public static void FaKuan(double s)
    20. {
    21. s -= 500;
    22. }
    23. }
    24. }
    1. using System;
    2. namespace _037_ref参数的使用
    3. {
    4. class Program
    5. {
    6. static void Main(string[] args)
    7. {
    8. //使用方法来交换两个int类型的变量
    9. int n1 = 10;
    10. int n2 = 20;
    11. Exchange(ref n1, ref n2);
    12. Console.WriteLine(n1);
    13. Console.WriteLine(n2);
    14. Console.ReadKey();
    15. //int temp = n1;
    16. //n1 = n2;
    17. //n2 = temp;
    18. //n1 = n1 - n2;
    19. //n2 = n1 + n2;
    20. //n1 = n2 - n1;
    21. }
    22. public static void Exchange(ref int n1,ref int n2)
    23. {
    24. int temp = n1;
    25. n1 = n2;
    26. n2 = temp;
    27. }
    28. }
    29. }

    三、params参数
    将实参列表中跟可变参数数组类型一致的元素都当做数组的元素去处理。
    params参数数组必须是形参列表中的最后一个参数。
    image.png

    1. using System;
    2. namespace _038_params参数
    3. {
    4. class Program
    5. {
    6. static void Main(string[] args)
    7. {
    8. int[] s = { 77, 88, 99 };
    9. Test("张三", s);
    10. Test("李四", 100, 100, 100);
    11. //对任意数组求最大值
    12. int max = GetMax(1,2,5,6,4,5,3,5,9,9,9);
    13. Console.WriteLine(max);
    14. Console.ReadKey();
    15. }
    16. //params 可变参数数组
    17. /// <summary>
    18. /// 统计总分
    19. /// </summary>
    20. /// <param name="name">学生名字</param>
    21. /// <param name="score">学生各科目成绩</param>
    22. public static void Test(string name,params int[] score)
    23. {
    24. int sum = 0;
    25. for (int i = 0; i < score.Length; i++)
    26. {
    27. sum += score[i];
    28. }
    29. Console.WriteLine("{0}这次的总成绩是:{1}",name,sum);
    30. }
    31. /// <summary>
    32. /// 求数组最大值
    33. /// </summary>
    34. /// <param name="a">输入的数组</param>
    35. /// <returns>最大值</returns>
    36. public static int GetMax(params int[] a)
    37. {
    38. int max = a[0];
    39. for (int i = 0; i < a.Length; i++)
    40. {
    41. if (a[i] > max)
    42. {
    43. max = a[i];
    44. }
    45. }
    46. return max;
    47. }
    48. }
    49. }