ref out params
一、out使用规则
1.out参数返回多个不同的值(方法只能有一个返回值)
2.out参数在方法内部必须为out参数赋值。(方法外部可以不赋值使用变量)
一个数组求出最大值,最小值,和,平均值。
using System;
public class Program
{
public static void Main()
{
int[] arr= {1,2,3,4,5,6,7,8,9,10};
int max1,min1,sum1,ave1;//可以不赋值
MyTest(arr,out max1,out min1,out sum1,out ave1);
Console.WriteLine("max:"+max1);
Console.WriteLine("min:"+min1);
Console.WriteLine("sum:"+sum1);
Console.WriteLine("ave:"+ave1);
}
public static void MyTest(int[] array,out int max,out int min,out int sum,out int ave)
{
Array.Sort(array);
max = array[array.Length-1];
min = array[0];
int temp=0;
foreach(var item in array)
{
temp +=item;
}
sum=temp;
ave = (int)sum/array.Length;
}
}
练习:out 验证登录名和密码正确性
name :admin
password :666666
using System;
public class Program
{
public static void Main()
{
string name =Console.ReadLine();
string password =Console.ReadLine();
string mess ;
bool b = IsLogin(name, password, out mess);
Console.WriteLine("mess:"+mess);
Console.WriteLine("b:"+b);
Console.WriteLine("Hello World");
}
public static bool IsLogin(string usename,string password, out string message)
{
bool b1= false;
bool b2= false;
switch (usename)
{
case "admin":
b1=true;
Console.WriteLine("name is right!");
break;
default :
b1= false;
Console.WriteLine("name is error!");
break;
}
switch (password)
{
case "666666":
b2 = true;
Console.WriteLine("password is right!");
break;
default :
b2 = false;
Console.WriteLine("password is error!");
break;
}
if(b1&&b2)
{
message = "成功了";
return true;
}
else
{
message = "失败了 ";
return false;
}
}
}
练习:out TryParse的练习
using System;
public class Program
{
public static void Main()
{
int num;
//bool res = int.TryParse("123d",out num);
string str = Console.ReadLine();
bool res = MyTryParse(str,out num);
Console.WriteLine("num:"+num);
Console.WriteLine("b:"+res);
}
public static bool MyTryParse(string str, out int result)
{
result = 0;
try
{
result = Convert.ToInt32(str);
return true;
}
catch
{
//result = 0;
return false;
}
}
}
二、ref 使用,
主要作用:能够把一个变量作为一个参数带到一个方法中进行改变,再将改变完成后的值带出来。
实现原理:按照地址传入(将地址传入数据)
1.按照地址传入,变量在方法中的改变,改变完成后会自动将这个值带出。
2.参数在方法的外部必须赋值,方法内可以不赋值。
using System;
public class Program
{
public static void Main()
{
float price = 20.5f;
AddPrice(ref price);
SubPrice(ref price);
Console.WriteLine("price:"+price);
}
public static void AddPrice(ref float p)
{
p+=10f;
}
public static void SubPrice(ref float p)
{
p-=5f;
}
}
------------------------------------------------------------
结果:
price : 25.5
三、parms可变参数
1.可以传入数组【】
2.将实参列表中跟可变参数数组类型一致的元素都当做数组的元素去处理。
3.可变参数只能有一个,而且必须是形式参数的最后一个位置。否则出错。
4.会自动匹配前面的形参,剩余的元素和数组【】类型相同的元素自动处理。
using System;
public class Program
{
public static void Main()
{
int[] arr = {10,20,30,40,50,60,90,70,80};
int sum;
ParamsTest(out sum,10,arr);
Console.WriteLine("sum:"+sum);
ParamsTest(out sum, 20,30,60);
Console.WriteLine("sum:"+sum);
ParamsTest(out sum,10);
Console.WriteLine("sum:"+sum);
int max = GetMax(arr);
Console.WriteLine("max:"+max);
}
public static void ParamsTest(out int sum ,int num ,params int[] array)
{
int temp=0;
foreach(var item in array)
{
temp += item;
}
sum = temp;
}
public static int GetMax(params int[] array)
{
Array.Sort(array);
return array[array.Length-1];
}
}
------------------------------------------------------------------------
sum:450
sum:90
sum:0
max:90
四、方法的重载
1.方法名称相同
2.方法的参数列表不同
A:参数的个数相同,参数的类型就不能相同。
B:参数的类型相同,参数的个数就不能相同。
3.方法的重载跟返回值没有任何关系
using System;
public class Program
{
public static void Main()
{
Mythod(10,20); // 没有输出
int sum = Mythod(10,20,30);
Console.WriteLine("sum:"+sum);// 结果 :sum:60
}
public static void Mythod(int num1 ,int num2)
{
}
public static int Mythod(int num1 ,int num2,int num3)
{
return num1+num2+num3;
}
}
五、方法的递归
方法自己调用自己 ( 整数的阶乘 )
using System;
public class Program
{
public static void Main()
{
int sum = JiCheng(10);
Console.WriteLine("sum:"+sum); // sum:3628800
}
public static int JiCheng(int i)
{
if(i==1||i==2)
{
return i;
}
else{
return i*JiCheng(i-1);
}
}
}
using System;
public class Program
{
public static void Main()
{
DiGui();
Console.WriteLine("---end----");
}
public static void DiGui()
{
int i = 0;
i++;
Console.WriteLine("digui");
if(i>=10)
{
return ;
}
DiGui();
}
}
六、方法的练习
方法练习一:
输入两个数字(检查是否能转化成功,第一个数字要比第二个数字小,并且返回两个数字之间的数字和。1~100 = 5050)
using System;
public class Program
{
public static void Main()
{
Console.WriteLine("Input the first number");
string number1 = Console.ReadLine();
int firstNumber = GetIntNumber(number1);
Console.WriteLine("Input the second number");
string number2 = Console.ReadLine();
int secondNumber = GetIntNumber(number2);
DetermineSize(ref firstNumber,ref secondNumber);
int sum = GetSum(firstNumber,secondNumber);
Console.WriteLine("sum:"+sum);
Console.WriteLine("---------");
}
public static int GetIntNumber(string str)
{
while(true)
{
try
{
int number = Convert.ToInt32(str);
return number;
}
catch
{
Console.WriteLine("error,please intput once again:");
str = Console.ReadLine();
}
}
}
public static int GetSum(int num1,int num2)
{
int sum = 0;
for(int i = num1; i<=num2;i++)
{
sum+=i;
}
return sum;
}
public static void DetermineSize(ref int num1,ref int num2)
{
while(true)
{
if(num1<num2)
{
return ;
}
else
{
Console.WriteLine("firstNumber>secondnumber,please intput once again!");
Console.WriteLine("Input the first number");
string number1 = Console.ReadLine();
num1= GetIntNumber(number1);
Console.WriteLine("Input the second number");
string number2 = Console.ReadLine();
num2 = GetIntNumber(number2);
}
}
}
}
Input the first number
100
Input the second number
1
firstNumber>secondnumber,please intput once again!
Input the first number
1
Input the second number
100
sum:5050
---------
方法练习二:
using System;
public class Program
{
///求字符串中数组最长的元素
public static void Main()
{
string[] values = {"first","second","fox","infamation"};
string longMax= GetLongest(values);
Console.WriteLine("longMax:"+longMax);//longMax:infamation
}
///求字符串中数组最长的元素
public static string GetLongest(string[] s)
{
string max = s[0];
for(int i = 0;i <s.Length;i++)
{
if(s[i].Length > max.Length)
{
max = s[i];
}
}
return max;
}
}
方法练习三:
using System;
public class Program
{
public static void Main()
{
int[] arr = {1,2,3,4,5,6,8,10};
double average = GetAverage(arr);
Console.WriteLine("average:"+average);
//1.保留两位小数
Console.WriteLine("average:"+"{0:0.00}",average);
//2.保留两位小数,先转成string ,在转double
string temp = average.ToString("0.00");
Console.WriteLine("temp:"+temp);
average = Convert.ToDouble(temp);
Console.WriteLine("average:"+average);
Console.WriteLine("---end---");
}
public static double GetAverage(int[] array)
{
int sum=0;
foreach(var item in array)
{
sum+=item;
}
return (double)sum/array.Length;
}
}
方法练习四:
using System;
public class Program
{
public static void Main()
{
Console.WriteLine(isPrime(7));
}
public static bool isPrime(int number)
{
if(number<2)
{
return false;
}
else
{
for(int i = 2; i<number; i++)
{
if(number%i==0)
{
return false;
}
}
return true;
}
}
}
方法练习五:
using System;
public class Program
{
public static void Main()
{
while(true)
{
Console.WriteLine("input number...");
string inputNumber = Console.ReadLine();
if(CheckNumber(inputNumber))
{
break;
}else
{
continue;
}
}
Console.WriteLine("Hello World");
}
public static bool CheckNumber(string input)
{
bool islog;
MyTest(input,out islog);
return islog;
}
public static void MyTest(string str,out bool islog)
{
islog = false;
foreach(var item in str)
{
switch (item)
{
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '0':
case 'a':
case 'b':
case 'c':
islog = true;
break;
default:
islog = false;
Console.WriteLine("指定字母");
return;
}
}
}
}
-------------------------------------------------------------------------------------------------------------------------------
使用ref参数,传递到ref的参数必须最先初始化。
使用out参数,传递到out的参数可以不进行初始化。
使用ref参数,必须将参数作为ref参数显示传递到方法。
使用out参数,必须将参数作为out参数显示传递到方法。