out与ref,他们的作用是一样的,可以按地址传递对象,在函数内部改变后将改变原来参数的值。
out的主要作用是传出数据,因此传入的时候可以选择性的初始化,但是在方法(函数)中必须对其赋值;ref 的主要作用是传入数据,因此在传入之前(Main中) 必须要对其赋值
out 与 ref的区别
1. out 传递的参数 ,在方法(函数)中必须赋值 , 在声明变量时(Main中) ,可以赋值也可以不赋值
2. ref 传递的参数 ,在声明必须赋值 , 在方法中, 可以赋值也可以不赋值
1、输入一个字符串,获取一个整数型数组
//用户输入一组数据用空格隔开 求这组数据的最大值 最小值 平均值 总和
string str = Console.ReadLine();//12 23 45 786 456 456
//此操作可以拿到 用户输入的数据 形成一个新的字符串数组
string[] strarr = str.Split(' ');
//因为要数数学运算 字符串没有办直接做数学操作 所以要进行整数转换
//转换的整数要进行存放
int[] numarr = new int[strarr.Length];
//转换
for (int i = 0;i<strarr.Length;i++)
{
numarr[i] = int.Parse(strarr[i]);
}
//可以得到一组 用户输入 分割之后的整数数据
2、out 使用演示
static void Main(string[] args)
{
Console.Write("请输入一组数据并以空格隔开:");
string str = Console.ReadLine (); //输入一个字符串
string[] str_arr = str.Split(' '); //分割 通过指定的字符分割字符串,返回一个数组
int[] num_arr= new int[str_arr.Length]; // 创建一个等长度的整数类型的数组
for (int i = 0; i < str_arr.Length; i++) //拿到每一个字符串的数字 得到一个整数型数组
{
num_arr[i]= int.Parse(str_arr[i]);
}
int max, min, sum; //声明变量 分别代表 最大值 最小值 总和 平均值 可以不进行赋值
double aver;
Math(num_arr, out max, out min, out sum, out aver);
Console.WriteLine($"最大值:{max} 最小值:{min} 和:{sum} 平均值:{aver}");
}
//定义一个方法
#region 数学方法 传出out
/// <summary>
/// 求最大值,最小值,和,平均值
/// </summary>
/// <param name="arr"></param>
/// <param name="max"></param>
/// <param name="min"></param>
/// <param name="sum"></param>
/// <param name="aver"></param>
static void Math(int[] arr, out int max, out int min, out int sum, out double aver)
{
max = arr[0]; //必须赋初值
for (int i = 1; i < arr.Length; i++)
{
if (max < arr[i])
{
max = arr[i];
}
}
min = arr[0]; //必须赋初值
for (int i = 1; i < arr.Length; i++)
{
if (min > arr[i])
{
min = arr[i];
}
}
sum = 0; //必须赋初值
for (int i = 0; i < arr.Length; i++)
{
sum += arr[i];
}
aver = 0; //必须赋初值
aver=(double )sum / arr.Length ;
}
#endregion
3、ref 使用演示
static void Main(string[] args)
{
Console.Write("请输入一组数据并以空格隔开:");
string str = Console.ReadLine (); //输入一个字符串
string[] str_arr = str.Split(' '); //分割 通过指定的字符分割字符串,返回一个数组
int[] num_arr= new int[str_arr.Length]; // 创建一个等长度的整数类型的数组
for (int i = 0; i < str_arr.Length; i++) //转换 拿到每一个字符串的数字
{
num_arr[i]= int.Parse(str_arr[i]);
}
int max= num_arr[0], min= num_arr[0], sum=0;
double aver = 1; //声明变量 分别代表 最大值 最小值 总和 平均值 必须进行赋值
Math2(num_arr, ref max, ref min, ref sum, ref aver);
Console.WriteLine($"最大值:{max} 最小值:{min} 和:{sum} 平均值:{aver}");
}
#region 数学方法 传入ref
static void Math2(int[] arr,ref int max, ref int min, ref int sum, ref double aver)
{
for (int i = 1; i < arr.Length; i++)
{
if (max < arr[i])
{
max = arr[i];
}
}
for (int i = 1; i < arr.Length; i++)
{
if (min > arr[i])
{
min = arr[i];
}
}
for (int i = 0; i < arr.Length; i++)
{
sum += arr[i];
}
aver = (double)sum / arr.Length;
}
#endregion