零基础新手的 C# 基础知识 21-22

课程马上就要到尾声了,时间过得真快……

21

21.1 枚举

什么是枚举?首先,请设想一种情况:

你接到了一个大项目,其中有一个要求是,要你判断12450种颜色,在你先有的知识框架下(20课)以前,你可能会这么写:

class bigproject

{

……

public string color {get;set;}

……

}

……

if (color == "#66CCFF")

{

Console.WriteLine("洛天依");

}

……

else if ()

……

这样不但麻烦不说,还容易打错字符,要是你错了一个字,还得全部重新来……

有人说,我可以这样:

public int color {get;set;}

可是,你还得用个excel来记录你到底用了什么颜色,这可如何是好?

这里,隆重推出新类型:枚举。

以一个任务的状态来看,用枚举类型,我们能写出如下的代码:

    enum Status
{
NotStarted,
InProgress,
OnHold,
Completed,
Deleted
}

▲注:与class是同等级的!

粗看没什么区别,实际上差别大了去了,你把鼠标悬浮在上面,可以看见出现了XXX = 0之类的提示框。实际上,这就是把第一种方法和第二种方法相互结合起来了:在编译器内部,他所理解的是数字,而你看到的却是字符。这样,有两个好处:不仅你打代码的时候不会弄错,对于编译器来说,占用的空间也相对小了。

有人会问:那我不是还要写好多if elseif else的东西么?

这时候,就需要下一个东西出场了:

21.2 Switch语句

说起来,这有点像VB里的Select Case语句,但是,VS不愧是世界上最强的IDE,由于输入太多条件太麻烦,还有一个很智能的功能。不过,在那之前,让我们先看一下基本语法:

switch (属性)

{

case 值 :

语句;

break;

case ……

default:

break;

}

▲与if语句不同,switch语句的条件和判断是分离的

然后,再把要处理的类看一下:

    class Todo
{
public string Description { get; set; }
public int EstimatedHours { get; set; }
public Status Status { get; set; }
//注:这两个相同的Satus不是打错了,前面那个是枚举类型

}

然后,我们输入switch,敲两下Tab,出现这个:

switch (switch_on)
{
default:
}

把switch_on改一下,改成这个:

todos.ElementAt(0).Status

发现变黄了没?然后按Enter!

太神奇了!是吧?

通过Switch,我们可以快速的、简易的来进行批量操作,比如:

static void Main(string[] args)
{
List<Todo> todos = new List<Todo>()
{
new Todo { Description = "Task 1", EstimatedHours = 6, Status = Status.Completed },
new Todo { Description = "Task 2", EstimatedHours = 2, Status = Status.InProgress },
new Todo { Description = "Task 3", EstimatedHours = 8, Status = Status.NotStarted },
new Todo { Description = "Task 4", EstimatedHours = 12, Status = Status.Deleted },
new Todo { Description = "Task 5", EstimatedHours = 6, Status = Status.InProgress },
new Todo { Description = "Task 6", EstimatedHours = 2, Status = Status.NotStarted },
new Todo { Description = "Task 7", EstimatedHours = 14, Status = Status.NotStarted },
new Todo { Description = "Task 8", EstimatedHours = 8, Status = Status.Completed },
new Todo { Description = "Task 9", EstimatedHours = 8, Status = Status.InProgress },
new Todo { Description = "Task 10", EstimatedHours = 8, Status = Status.Completed },
new Todo { Description = "Task 11", EstimatedHours = 4, Status = Status.NotStarted },
new Todo { Description = "Task 12", EstimatedHours = 10, Status = Status.Completed },
new Todo { Description = "Task 13", EstimatedHours = 12, Status = Status.Deleted },
new Todo { Description = "Task 14", EstimatedHours = 6, Status = Status.Completed }
};

PrintAssessment(todos);
Console.ReadLine();

}

private static void PrintAssessment(List<Todo> todos)
{
foreach (var todo in todos)
{
switch (todo.Status)
{
case Status.NotStarted:
Console.ForegroundColor = ConsoleColor.DarkRed;
break;
case Status.InProgress:
Console.ForegroundColor = ConsoleColor.Green;
break;
case Status.OnHold:
Console.ForegroundColor = ConsoleColor.Yellow;
break;
case Status.Completed:
Console.ForegroundColor = ConsoleColor.White;
break;
case Status.Deleted:
Console.ForegroundColor = ConsoleColor.Gray;
break;
default:
break;
}
Console.WriteLine(todo.Description);
}
}

(在刚刚的代码上改的)其实就是把Bob的拿了过来

输出后,你会发现,程序会根据不同的情况来输出不同颜色,用Bob的话来说,It's Cool!

22

还记得吗,在好久之前,我们曾经做过一个小小的游戏,里面有一个选择开哪个门的操作步骤。在那个时候,我测试到一半时,突然手一抖,直接输了一个空字符进去,然后,程序就崩溃了……在那时,我注意到,Vs的智能提示器给出了错误情况的种类。可是我怎么找都找不到怎么处理错误,在今天,Bob为我们带来了程序中最重要的功能之一——异常处理。

总之,先上示例代码吧:

string content = File.ReadAllText(@"D:\1.txt");
Console.WriteLine(content);
Console.ReadLine();

▲注意啦!顶部还有using System.IO;

异常处理说简单也简单,格式是这样的:

try

{

}

catch (FileNotFoundException)

//这里放具体的错误

{

}

catch(Exception Error)

//这里是无法判断的错误 Error的名字可以自己定

{

}

finally

{

}

//这里放无论如何都要执行的语句

把我们的代码套进去,大概是长这样的:

static void Main(string[] args)
{
try
{
string content = File.ReadAllText(@"D:\1.txt");
Console.WriteLine(content);
Console.ReadLine();
}
catch (DirectoryNotFoundException)

//找不到文件夹
{
Console.WriteLine("天哪!我亲爱的老伙计!这恼人的电脑竟然出错了!我想你可以检查一下你的文件夹名是不是正确");
}
catch (FileNotFoundException)

//找不到文件
{
Console.WriteLine("天哪!我亲爱的老伙计!这恼人的程序竟然出错了!我觉得你可能像隔壁鲍勃叔叔那样打错了文件名!");
}
catch (Exception ERR)
{
Console.WriteLine("天哪!我亲爱的老伙计!这恼人的电脑竟然运行不了了!你看:");
Console.WriteLine(ERR.Message);
}
finally
{
Console.WriteLine("哦!老伙计!实在对不住,先走一步了!");
}
}

▲翻译就要有翻译的意境

最后,Bob还强调了一件事情:用户体验最重要!因为:你要是弄一大堆莫名其妙的错误让用户什么都不知道,还用不了软件,这很令人恼火的。

有些程序员想偷懒,直接一个大括号外面放一个try,虽然说功能也能实现,但是,给人的感觉相当糟糕。

点赞

发表回复

电子邮件地址不会被公开。必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据