我使用的是C#12. 在C#12中,我可以使用主构造函数:

public class UserService(IUnitOfWork uow) : IUserService
{

}

在C#12之前,我对注入到构造函数中的项使用空判断:

public class UserService : IUserService
{
    private readonly IUnitOfWork _uow;

    public UserService(IUnitOfWork uow)
    {
        ArgumentNullException.ThrowIfNull(uow);
        _uow = uow;
    }
}

如何在C#12中进行null判断?
是否需要在主构造函数中使用fail fast?

推荐答案

据我所知,如果您想切换到主构造函数,最简单的 Select 之一将是引入field/Property:

public class UserService(IUnitOfWork uow) : IUserService
{
    private readonly IUnitOfWork _uow = uow 
         ?? throw new ArgumentNullException(nameof(uow));
}

请注意,如果您不想用一个额外的名称(如Heinzi所示)使您的类变得混乱,那么您也可以将该字段命名为与构造函数参数相同的名称(_uow->;uow),这样做的另一个好处是通过一个不变的字段来隐藏可变的主ctor参数.

您还可以将逻辑封装到助手方法中.大致是这样的:

public class UserService(IUnitOfWork uow) : IUserService
{
    private readonly IUnitOfWork uow = uow.IsNotNull();
}

public static class Check
{
    [return:NotNull]
    public static T IsNotNull<T>(this T t,
         [CallerArgumentExpression("t")] string? paramName = null) where T : class
    {
        ArgumentNullException.ThrowIfNull(t, paramName);
        return t;
    }
}

Csharp相关问答推荐

System.Data.SQLite:判断SQLite数据库是否为空(任何表中至少有一行)

ASP.NET Core 8.0 JWT验证问题:尽管令牌有效,但SecurityTokenNoExpirationError异常

有没有办法在WPF文本框中添加复制事件的处理程序?

在C#中,有没有一种方法可以集中定义跨多个方法使用的XML参数描述符?

在命名管道上使用GRPC ASP.NET核心时如何配置命名管道权限

在EF Core中,有没有什么方法可以防止在查询中写入相同的条件,而代之以表达式?

如何在C#中转换泛型包装类内部的派生类

什么类型的对象存储在大对象堆(LOH)中

如何从另一个类的列表中按ID取值

WPF动态设置弹出窗口水平偏移

如何在发布NuGet包之前设置命名空间?

在.NET8中如何反序列化为私有字段?

我可以强制System.Text.Json.JsonSerializer以非递归方式工作吗?

C#System.Commandline:如何向命令添加参数以便向其传递值?

为什么Swashbakle/Swagger在参数中包含变量名?

RavenDb:为什么在字符串==空的情况下过滤会过滤得太多?

try 访问字典中的模拟对象时引发KeyNotFoundException

如何在特定时间间隔运行多个后台任务?

如何更改Datagridview行标题

单位中快照的倾斜方向