You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 19:21:09