C#异步方法GetProductAsync冗余return的优化方案咨询
优化C#产品查询方法的代码逻辑
原代码
public async Task<ServiceResponse<Product>> GetProductAsync(int productId) { var response = new ServiceResponse<Product>() { Data = await _context.Products.AsNoTracking().FirstOrDefaultAsync(p => p.Id == productId) } ; if ( response.Data == null ) { response.Success = false ; response.Message = "Sorry, but this product does not exist." ; } else return response ; return response ; }
问题分析
原代码通过else分支提前返回正常响应,空值处理后又重复返回,导致代码冗余且逻辑不够直观。可以通过两种方式优化,消除重复return,同时保持逻辑清晰。
优化方案1:统一返回点
保留单个response对象,仅在空值时修改状态,最后统一返回,适合需要复用响应对象的场景:
public async Task<ServiceResponse<Product>> GetProductAsync(int productId) { // 显式设置Success默认值,避免依赖类的默认初始化逻辑 var response = new ServiceResponse<Product> { Data = await _context.Products.AsNoTracking().FirstOrDefaultAsync(p => p.Id == productId), Success = true }; if (response.Data == null) { response.Success = false; response.Message = "Sorry, but this product does not exist."; } return response; }
优化方案2:提前返回模式
先处理空值的异常情况,直接返回错误响应,再处理正常情况,代码更简洁,减少嵌套:
public async Task<ServiceResponse<Product>> GetProductAsync(int productId) { var product = await _context.Products.AsNoTracking().FirstOrDefaultAsync(p => p.Id == productId); if (product == null) { return new ServiceResponse<Product> { Success = false, Message = "Sorry, but this product does not exist." }; } return new ServiceResponse<Product> { Data = product, Success = true }; }
方案选择
- 若
ServiceResponse有更多需要统一设置的属性(比如请求时间、跟踪ID等),优先选方案1; - 若追求代码简洁、减少不必要的对象创建,方案2更合适,空值场景下无需初始化包含空Data的响应对象。
内容的提问来源于stack exchange,提问作者sayditto
相关产品推荐
相关产品推荐

