一,函数
return 只能返回一个值,如何才能返回多个值
(1)返回多个同类型的值:使用数组
(2)返回的是不同类型的值:out , ref
out参数的意义是 函数内部变量变化后 会将变化后的值带出来给实参,out参数必须赋初始值
ref会将函数中的变量带出来改变外部变量,但是ref参数的变量在函数中可以不用赋初始值
例:
static bool[] check(int num,out int num2,out string str)
{
bool[] isPrime = { true, false };
num2 = 23;
str = "dsafca";
return isPrime;//返回数值
}
int num2 = 13;
string str = "dada";
check(12, out num2, out str);
Console.WriteLine(num2+" "+str);//num2和str已被改变
(1)练习题
用户登录:提示输入用户名和密码,使用函数判断是否输入正确
用户名:admin
密码:1234
输入正确则输出“登录成功”
错误则输出密码错误或用户名错误...
static bool check(string user,string password,out string msg)
{
if (user == "admin"&&password=="1234")
{
msg = "登录成功";
return true;
}
else if (user == "admin" && password != "1234")
{
msg = "密码错误";
}
else if (user != "admin"&&password=="1234")
{
msg = "用户名错误";
}
else
{
msg = "用户名密码错误";
}
return false;
}
string user, password;
string msg = "";
Console.Write("请输入用户名:");
user=Console.ReadLine();
Console.Write("请输入密码:");
password = Console.ReadLine();
check(user,password,out msg);
Console.WriteLine(msg);
(2)练习题
青蛙跳台阶
static int Num(int n)
{
if (n == 1)
return 1;
if (n == 2)
return 2;
return Num(n - 1) + Num(n - 2);
}
Console.WriteLine("请输入台阶数:");
int n = Convert.ToInt32(Console.ReadLine());
Console.WriteLine(Num(n));
(3)练习题
static void hano(int n,string start,string middle,string end)
{
if (n == 1)
{
Console.WriteLine("从{0}经过{1}移到{2}",start,middle,end);
return;
}
hano(n - 1, start,end,middle);
hano(1,start,middle,end);
hano(n - 1, middle,start,end);
}
hano(3,"A","B","C");
二,枚举
enum 枚举名
{
枚举类型名称
}
例:
enum Role//遵循大驼峰命名法
{
战士,法师,辅助=10,刺客,坦克 //填写值 用逗号隔开 每个值对应一个编号,从0开始 若其中有赋值,则之后的值相继连接变化
}
Role role = Role.刺客;
Console.WriteLine(role);//输出刺客
Console.WriteLine((int)(role));//输出11
枚举类型可以转换成字符串
enum Date
{
周一,周二,周三,周四,周五,周六,周天
}
Date date = Date.周天;
Console.WriteLine(date);
Convert.ToString(date);
if (Date.周天 == date)
{
Console.WriteLine("相同");
}
Role role2 = (Role)Enum.Parse(typeof(Role), "1"); //如果在枚举类型中有对应编号的值,那么转化成的枚举值就是对应编号的值
将值转换成对应的枚举类型
Enum.Parse(typeof(Role), "1")
(1)练习题
在线状态:使用(switch)
输入1,显示在线OnLine
输入2,显示离线OffLine
输入3,显示忙线Busy
enum State
{
OnLine=1,OffLine,Busy
}
Console.WriteLine("请输入在线状态(1:在线;2:离线;3:忙线):");
int n = Convert.ToInt32(Console.ReadLine());
switch (n)
{
case 1:
Console.Write((State)Enum.Parse(typeof(State), ""));
break;
case 2:
Console.Write((State)Enum.Parse(typeof(State), "n"));
break;
case 3:
Console.Write((State)Enum.Parse(typeof(State), "n"));
break;
default:
break;
}
遍历枚举
foreach(string i in Enum.GetNames(typeof(Role)))//获取枚举类型中的名称
{
Console.WriteLine(i);
}
foreach (string i in Enum.GetValues(typeof(Role)))//获取枚举类型中的值
{
Console.WriteLine(i);
}
Enum.GetNames(typeof(Role))//获取枚举类型中的名称
Enum.GetValues(typeof(Role))//获取枚举类型中的值
三,结构体
结构体基本语法:
struct Student //一类数据 每创建一个学生数据 就会声明结构体中的变量
{
public int age;//结构体中的变量要用publlic修饰符,这样才可以公开被访问
public string name;
public string[] hobby;//减少重复定义声明变量的操作 更好整理和维护
}
//结构体 表达很多不同类型的数据 struct
Student student1,student2;//声明
student1.age = 20;//赋值
student1.name = "kjh";
student1.hobby = new string[]{ "爬山","游泳"};
student2.age = 3;
Console.WriteLine(student1.age);
Console.WriteLine(student2.age);//每个由结构体声明的结构体类型数据是互不影响的
四,委托
(1) 从数据结构来讲,委托是和类一样是一种用户自定义类型。
(2) 从设计模式来讲,委托(类)提供了方法(对象)的抽象。
定义
delegate int Delegate1(int num1, int num2);
委托类型声明:
(1) 以deleagate关键字开头。
(2)返回类型+委托类型名+参数列表。
委托函数/匿名方法
static int Max(int num1,int num2)
{
return num1 > num2 ? num1 : num2;
}
static int Min(int num1, int num2)
{
return num1 > num2 ? num2 : num1;
}
Delegate1 delegate2;
delegate2 = Max;
delegate2(12, 21);//=>Max(12,21)可以指向某个函数返回值类型要相同
delegate2 = Min;
delegate2(12, 21);//函数变量