out 参数又名多余返回的值:
如果一个方法中,返回多个相同类型的值的时候,可以考虑返回一个数组,但是,如果返回不同类型的值的时候,数组就不行了,这时候可以考虑使用out参数
如果一个方法中,返回多个相同类型的值的时候,可以考虑返回一个数组,但是,如果返回不同类型的值的时候,数组就不行了,这时候可以考虑使用out参数
out参数侧重于在一个方法中可以放回多个不同类型的值,也可以返回多个类型相同的值,
语法:
方法声明的时候:
Test(out int n1,out string n2)
{
方法体中要对 n1,n2 初始化;
}
调用的时候:
Test(out n, out m)
1、out参数使用的前奏之求一个数组的最大值最小值,总和,平均值
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 方法的高级参数out前奏 { class Program { static void Main(string[] args) { //求一个数组的最大值最小值,总和,平均值 int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int[] res = GetMaxMinSumAvg(arr); Console.WriteLine("数组的最大值:{0},数组的最小值是:{1},数组的总和是:{2},数组的平均值是:{3}",res[0],res[1],res[2],res[3]); Console.ReadKey(); } private static int[] GetMaxMinSumAvg(int[] arr) { int[] temp = new int[4]; //我们自己定义temp[0]存最大值temp[1]存最小值,temp[2]存总和,temp[3]存平均值 temp[0] = arr[0]; temp[1] = arr[1]; temp[2] = 0; for (int i = 0; i < arr.Length; i++) { if (temp[0] < arr[i]) { temp[0] = arr[i]; } if (temp[1] > arr[i]) { temp[1] = arr[i]; } temp[2] += arr[i]; } temp[3] = temp[2] / arr.Length; return temp; } } }
运行结果:
扫描二维码关注公众号,回复:
1633644 查看本文章
使用out多余返回参数的情况:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 方法的高级参数out的应用 { class Program { static void Main(string[] args) { int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int max1; int min1; int sum1; int avg1;//先声明赋初值后使用这里在下面的方法中赋过初值了这里可以不赋初值; GetMaxMinSumAvg(arr,out max1,out min1,out sum1,out avg1); Console.WriteLine("数组的最大值:\t"+ max1); Console.WriteLine("数组的最小值:\t"+ min1); Console.WriteLine("数组的和:\t"+ sum1); Console.WriteLine("数组的平均值:\t"+ avg1); Console.ReadKey(); } /// <summary> /// 求数组中的最大值,最小值,总和,平均值 /// </summary> /// <param name="arr">数组</param> /// <param name="max">多余返回的最大值</param> /// <param name="min">多余返回的最小值</param> /// <param name="sum">多余返回的总和</param> /// <param name="avg">多余返回的平均值</param> private static void GetMaxMinSumAvg(int[] arr, out int max, out int min, out int sum, out int avg) { max = arr[0]; min = arr[1]; sum = 0; for (int i = 0; i < arr.Length; i++) { if (max < arr[i]) { max = arr[i]; } if (min > arr[i]) { min = arr[i]; } sum += arr[i]; } avg = sum / arr.Length; } } }
运行结果:
IL中间语言:即更底层的语言
调用含有out多余返回参数的方法时分别反编译成C#语言和IL中间语言的差别;
含有out多余返回参数的方法反编译成C#语言和IL中间语言后:我们发现out多余返回参数里多了一个取地址符‘&’
out参数的使用:
问题:1\分别提示用户输入用户名和密码2、再写一个方法判断用户的输入是否正确3、返回给用户一个登陆结果,并且还要单独的返回给用户一个登陆的结果3、如果用户名错误,除了返回登陆结果外,还要返回一个"用户名错误"
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 方法的高级参数out的使用登陆 { class Program { static void Main(string[] args) { while (true) { Console.WriteLine("请输入用户名"); string userName = Console.ReadLine(); Console.WriteLine("请输入密码"); string userPwd = Console.ReadLine(); string msg1; if (IsLogin(userName, userPwd, out msg1)) { Console.WriteLine(msg1); Console.ReadKey(); return;//用户名和密码都正确整个方法结束 } else//打印返回来的信息 { Console.WriteLine(msg1); } } //Console.ReadKey(); } public static bool IsLogin(string name, string pwd, out string msg) { //先写用户名和密码都正确的然后再排除 if (name == "admin" && pwd == "123456") { msg = "登陆成功"; return true; } else if (name == "admin")//此时不用写pwd!="123456"的判断 { msg = "密码错误"; return false; } else if (pwd == "123456")//此时不用写name!= "admin"的判断 { msg = "用户名错误"; return false; } else { msg = "用户名和密码都错了"; return false; } } } }
运行结果:
另一种;
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 方法的高级参数out的使用登陆2 { class Program { static void Main(string[] args) { Console.WriteLine("请输入用户名"); string userName = Console.ReadLine(); Console.WriteLine("请输入密码"); string userPwd = Console.ReadLine(); string msg1; bool b = IsLogin(userName,userPwd,out msg1); Console.WriteLine("登陆结果:\n{0}\n登陆信息:\n{1}",b,msg1); Console.ReadKey(); } /// <summary> /// 判断登陆是否成功 /// </summary> /// <param name="name">登录名</param> /// <param name="pwd">登录密码</param> /// <param name="msg">多余返回的登陆信息</param> /// <returns>返回登陆结果</returns> public static bool IsLogin(string name, string pwd, out string msg) { if (name == "admin" && pwd == "123456") { msg = "登陆成功"; return true; } else if (name == "admin") { msg = "密码错误"; return false; } else if (pwd == "123456") { msg = "用户名错误"; return false; } else { msg = "用户名和密码都错了"; return false; } } } }
运行结果:
out多与参数练习之模拟源码中的int.TryParse();方法public static bool TryParse(string s, out int result):
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 方法的高级参数out自己动手写tryParse { class Program { static void Main(string[] args) { int num1; int num2; //out 实参必须声明可以不用赋初值,因为在含有out形参的方法中一定付过出值了. bool b1 = int.TryParse("123", out num1); Console.WriteLine("我是调用源码中的方法由字符串\"123\"转换过来的整型值: " + num1); Console.WriteLine("我是调用源码中的方法由字符串\"123\"转整型的返回结果: " + b1); Console.WriteLine("\t======分割线======\n\n\n"); bool b2 = int.TryParse("wnike", out num2); Console.WriteLine("我是调用源码中的方法由字符串\"wnike\"转换过来的整型值: "+num2); Console.WriteLine("我是调用源码中的方法由字符串\"wnike\"转整型的返回结果: " + b2); Console.WriteLine("\n\n\t====下面是调用我们自己写的TryParse====\n\n\n"); int myNum1; int myNum2; bool b3 = MyTryParse("123", out myNum1); Console.WriteLine("我是调用自己的方法由字符串\"123\"转换过来的整型值: " + myNum1); Console.WriteLine("我是调用自己的方法由字符串\"123\"转整型的返回结果: " + b3); Console.WriteLine("\t======分割线======\n\n\n"); bool b4 = MyTryParse("wnike", out myNum2); Console.WriteLine("我是调用自己的方法由字符串\"wnike\"转换过来的整型值: " + myNum2); Console.WriteLine("我是调用自己的方法由字符串\"wnike\"转整型的返回结果: " + b4); Console.ReadKey(); } /// <summary> ///我们自己写的功能和源码中的 int.TryParse()功能一样 /// </summary> /// <param name="str">要转换成int类型的字符串</param> /// <param name="result"></param> /// <returns></returns> public static bool MyTryParse(string str, out int result) { result = 0;//相当于源码中的默认值 try { result = Convert.ToInt32(str); return true; } catch { return false; } } } }
运行结果: