如何写出优雅漂亮的c#代码(二)
上篇我们讲到更合理的定义变量名,以及变量类型,今天我们讲代码工整很重要的一个环节,if else
例:
- 检查年龄
写一个方法,参数为int类型,如果大于18岁则输出已成年,否则输出未成年。
private void CheckAge(int age) { if (age > 18) { Console.WriteLine("已成年"); } else { Console.WriteLine("未成年"); } }
这是常规的做法,这个需求很简单,这么做也无可厚非,但是我更推荐另一种做法
private void CheckAge(int age) { if (age > 18) { Console.WriteLine("已成年"); return; } Console.WriteLine("未成年"); }
这样做的好处是什么呢,减少嵌套。如果大于18岁肯定已成年,我们无需在考虑else中的内容。所以直接ruturn,Console.WriteLine("未成年")也不必嵌套在else中,本例比较简单。两种写法可能区别并不大,接下来我们修改下需求。
如果年龄小于三岁,在家玩,否则需要上幼儿园
大于三岁上幼儿园,,如果年龄为三岁则
每天上午12点之前做游戏
如果12点之后,14点之前,则睡午觉。
剩下的时间学画画
这个代码并不难,学过编程的人都能轻易写出来。但是经验不足的新人很容易将代码写成这样
private void CheckAge(int age) { if (age < 3) { //在家玩 } else { //上幼儿园 if (age == 3) { if (DateTime.Now.Hour < 12) { //做游戏 } else { if (DateTime.Now.Hour > 12 && DateTime.Now.Hour < 14) { //睡觉 } else { //学画画 } } } } }
恐怖的缩进,我们看到这个代码居然有四层嵌套,如果逻辑在复杂些,按照这个逻辑写10层嵌套都是做的到的。
易读的代码请不要超过两层嵌套,能用if搞定,尽量不要用else
易读的代码请不要超过两层嵌套,能用if搞定,尽量不要用else
易读的代码请不要超过两层嵌套,能用if搞定,尽量不要用else
接下来我们对这段代码进行优化
public void CheckAge(int age) { //年龄小于三岁在家玩就够了,所以我们没有必要判断其他的直接 //return出去就可以了 if (age <= 3) { //在家玩 return; //因为这里return了,所以不需要else } //三岁,12点之前在做游戏,没有其他,不需要else直接return if (age == 3 && DateTime.Now.Hour < 12) { //做游戏 return; } //三岁,12点之后14点钱在睡午觉,没有其他 if (age == 3 && DateTime.Now.Hour > 12 && DateTime.Now.Hour < 14) { //睡觉 return; } //三岁,12点之后14点钱在学画画,没有其他 if (age == 3 && DateTime.Now.Hour > 14) { //睡觉 return; } }
好的,这是我们优化后的结果。原本的四层嵌套变成了现在单层if,代码量也减少了很多,哪个易读,相信大家都看的出来。
- 三元表达式
我们重新回到第一个例子
private void CheckAge(int age) { if (age > 18) { Console.WriteLine("已成年"); return; } Console.WriteLine("未成年"); }
根据上面的经验我们已经了解了,如果杜绝多余的else,可是我们还有更完美的做法,三元表达式。
public void CheckAge(int age) { string txt = age > 18 ? "已成年" : "未成年"; Console.WriteLine(txt); }
代码变得更加简单易读,推荐:情况简单,逻辑不复杂时用三元表达式代替if else
接下来我们再举几个例子
例:
用户登录:
输入用户名密码,如果不正确,抛出相应的提示。
如果正确,判断用户状态是否可用
如果不可用,判断是否锁定,是否封禁,是否密码过期。
如果可用,判断用户权限。
如果是游客,则访问游客界面
如过是普通用户,则访问普通用户界面
如果是管理员,则访问管理员界面
class User { public enum Role { Guest, NormalUser, Admin } public enum State { Lock, PasswordExpired, Killed } public Role role { get; set; } public bool Enable { get; set; } public State state { get; set; } } public void Login() { User user = GetUser(); if (user == null) { //用户名或密码不正确 } else { if (user.Enable) { switch (user.state) { case User.State.Killed: //封号 break; case User.State.Lock: //锁定 break; case User.State.PasswordExpired: //密码过期 break; default: break; } } else { switch (user.role) { case User.Role.Admin: //管理员页面 break; case User.Role.Guest: //游客界面 break; case User.Role.NormalUser: //普通用户界面 break; default: break; } } } } /// <summary> /// 查询登录用户 /// </summary> /// <returns>如果用户名密码不正确则返回空</returns> private User GetUser() { return new User(); }
优化后主方法所有嵌套全部消除,40余行代码变为30几行,可读性明显提升。
public void Login() { User user = GetUser(); if (user == null) { //用户名或密码不正确 return; } if (user.Enable && user.state == User.State.Killed) { //封号 return; } if (user.Enable && user.state == User.State.Lock) { //锁定 return; } if (user.Enable && user.state == User.State.PasswordExpired) { //密码过期 return; } if (!user.Enable && user.role == User.Role.Admin) { //管理员页面 return; } if (!user.Enable && user.role == User.Role.Guest) { //游客界面 return; } if (!user.Enable && user.role == User.Role.NormalUser) { //普通用户界面 return; } }
- 模拟开车
检查外观,如果正常则检查内部。
内检无问题,则启动引擎。
引擎启动正常,则挂挡。
挂挡成功,踩油门开车。
各项检查不通过均要给出对应提示。
private void Drive() { if (CheckExterior()) { if (CheckInside()) { if (PutIntoGear()) { Throttle(); } else { //变速箱损坏,无法挂挡 } } else { //油量不足 } } else { //左前轮胎气压不足 } }
优化后
private void Drive() { if (!CheckExterior()) { //左前轮胎气压不足 return; } if (!CheckInside()) { //油量不足 return; } if (!PutIntoGear()) { //变速箱损坏,无法挂挡 return; } Throttle(); }
总结下,if else一定注意避免嵌套,if + return能搞定的事,不要用else,如嵌套超过两层就要考虑如何优化,简单的if else逻辑,可以考虑用三元表达式代替
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?