VR_C#拒绝摸鱼第七天

108 阅读4分钟

一,函数

return 只能返回一个值,如何才能返回多个值

(1)返回多个同类型的值:使用数组

(2)返回的是不同类型的值:outref

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);//函数变量