聊聊 if else 那些事
2024-09-02 01:16:59
从这周起,公司技术部每周五组织一次内部的技术分享,日常工作中,发现大家对if掌握的不是很好,今天先来聊聊if。
一、场景
简历的价格是根据专业的父Id设定的,下面根据简历Id获取简历的价格。
/// <summary>
/// 专业
/// </summary>
public class Subject
{
public int Id { get; set; }
public int Pid { get; set; }
}
/// <summary>
/// 简历
/// </summary>
public class Resume
{
public int Id { get; set; }
public int SubjectId { get; set; }
}
二、if、三元运算符、Null合并运算符
下面的方法用来获取专业实体,如果出现专业数据异常,给一个默认的专业,这里主要为了说明三元运算符和Null合并运算符的用法
public interface ISubjectService
{
Subject GetSubjectById(int id);
}
public interface ISubjectDao
{
Subject GetSubjectById(int id);
}
public class SubjectService : ISubjectService
{
private readonly ISubjectDao _subjectDao; /// <summary>
/// 1、if判断
/// </summary>
/// <param name="subjectId"></param>
/// <returns></returns>
public Subject GetSubjectById(int subjectId)
{ var subject = _subjectDao.GetSubjectById(subjectId);
if (subject == null)
subject = new Subject() {Id = , Pid = }; return subject;
} /// <summary>
/// 2、三元运算符
/// </summary>
/// <param name="subjectId"></param>
/// <returns></returns>
public Subject GetSubjectById(int subjectId)
{ var subject = _subjectDao.GetSubjectById(subjectId) != null
? _subjectDao.GetSubjectById(subjectId)
: new Subject() { Id = , Pid = }; return subject;
} /// <summary>
/// 3、null 合并运算符
/// </summary>
/// <param name="subjectId"></param>
/// <returns></returns>
public Subject GetSubjectById(int subjectId)
{
return _subjectDao.GetSubjectById(subjectId) ?? new Subject() { Id = , Pid = };
}
}
三、if else和switch
根据简历Id计算简历价格
public interface IResumeService
{
Resume GetResumeById(int id);
int GetResumePrice(int id);
}
public interface IResumeDao
{
Resume GetResumeById(int id);
}
public class ResumeService
{
private readonly IResumeDao _resumeDao;
private readonly ISubjectService _SubjectService;
/// <summary>
/// 1、if else
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public int GetResumePrice(int id)
{
var resume = _resumeDao.GetResumeById(id);
var subject = _SubjectService.GetSubjectById(resume.SubjectId);
if (subject.Pid == )
{
return ;
}
else if (subject.Pid == )
{
return ;
}
else if (subject.Pid == )
{
return ;
} return ;
}
/// <summary>
/// 2、switch
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public int GetResumePrice(int id)
{
var resume = _resumeDao.GetResumeById(id);
var subject = _SubjectService.GetSubjectById(resume.SubjectId);
switch (subject.Pid)
{
case :
return ;
case :
return ;
case :
return ;
default:
return ;
}
}
}
四、if else和卫语句
什么是卫语句?
许多程序员觉得函数应该只有一个出口 (return), 结果导致函数中的条件逻辑 (Conditional Logic) 本来完全可以终止下面的代码继续执行 (因为没有必要), 结果却只在函数最后 return, 使人难以看清程序的执行路径.“使用卫语句取代嵌套条件”用来解决这个问题, 它能带给代码可读性的提高, 还有性能上一点点的优化。
public int GetResumePrice(int id)
{
var resume = _resumeDao.GetResumeById(id);
var subject = _SubjectService.GetSubjectById(resume.SubjectId);
if (subject.Pid == ) return ;
if (subject.Pid == ) return ;
if (subject.Pid == ) return ; return ;
}
五、if else和策略模式
/// <summary>
/// 抽象一个计算简历价格的接口
/// </summary>
public interface IResumePrice
{
int GetResumePrice();
}
/// <summary>
/// 专业One的简历价格
/// </summary>
public class OneSubjectPrice : IResumePrice
{
public int GetResumePrice()
{
return ;
}
}
/// <summary>
/// 专业Two的简历价格
/// </summary>
public class TwoSubjectPrice : IResumePrice
{
public int GetResumePrice()
{
return ;
}
}
/// <summary>
/// 专业Three的简历价格
/// </summary>
public class ThreeSubjectPrice : IResumePrice
{
public int GetResumePrice()
{
return ;
}
}
public class ResumeService
{
private readonly IResumePrice _resumePrice;
/// <summary>
/// 实例化IResumePrice
/// </summary>
/// <param name="resumePrice"></param>
public ResumeService(IResumePrice resumePrice)
{
_resumePrice = resumePrice;
}
/// <summary>
/// 技术简历价格
/// </summary>
/// <param name="subjectPrice"></param>
/// <returns></returns>
public int GetResumePrice(string subjectPrice)
{
return _resumePrice.GetResumePrice();
}
}
六、if else和状态模式
使用上面定义的ResumePrice的接口和实现,状态模式需要用到反射
public class ResumeService
{
/// <summary>
/// 专业1价格计算类
/// </summary>
public static String OneSubjectPrice = "OneSubjectPrice";
/// <summary>
/// 专业2价格计算类
/// </summary>
public static String TwoSubjectPrice = "TwoSubjectPrice";
/// <summary>
/// 专业3价格计算类
/// </summary>
public static String ThreeSubjectPrice = "ThreeSubjectPrice"; /// <summary>
/// 技术简历价格
/// 利用了反射的伪代码
/// </summary>
/// <param name="subjectPriceType"></param>
/// <returns></returns>
public int GetResumePrice(string subjectPriceType)
{
var dll = Assembly.LoadFrom("assemblyName");
var type = (IResumePrice)dll.GetType(subjectPriceType, true);
return type.GetResumePrice();
}
} public class Main
{
public void CalPrice()
{
var resumeService = new ResumeService();
var price1 = resumeService.GetResumePrice(ResumeService.OneSubjectPrice);
var price2 = resumeService.GetResumePrice(ResumeService.TwoSubjectPrice);
var price3 = resumeService.GetResumePrice(ResumeService.ThreeSubjectPrice); }
}
最新文章
- UI第七节——UISlider详解
- Android开发者必备的42个链接
- Java 程序 ——感想
- system 函数
- 解决&#160;SqlServer执行脚本,文件过大,内存溢出问题
- 利用烧鹅制作简单BadUSB,插谁谁怀孕
- Send Mail using C# code
- axure 母版 模板
- jQuery基础选择器
- Photoshop CS4 启动弹出许可协议
- EXCEL VB
- iOS UILabel:宽度固定,自动高度显示全部文字
- C语言 对数组名取地址
- WCF小试
- IIC接口下的24C02 驱动分析
- java容易混淆的15个知识点
- showDialog 必须Stateful
- [Err] 1093 - You can&#39;t specify target table &#39;master_data&#39; for update in FROM clause
- java中常规使用的mysql语句
- 1.Ansible安装以及配置