在 C# 中对 if then 进行空检查

Null checking for if then in C#

我正在检查 C# 中的两个条件:

 if (result.Data.Count > 0)
 {
     if(result.Data[0].AdditionalData != null)
      {
         // To Do
      }
  } 

我的困惑是有没有更好的方法在一个 if 条件下检查这些?

我正在尝试使用 Null-Condition 运算符,但没有成功。 Null-Conditional operator in MSDN

您可以在 IEnumerable 上创建扩展方法并使用它

    public static bool HasValue<T>(this IEnumerable<T> source, int index)
    {
        if (source == null)
            return false;

        return source.Count() > index && source.ElementAt(index) != null;
    }

// usage
if(result.Data.HasValue(0))
{
}

就像@Hans Killian 也写的一样,尝试使用已经存在的扩展 IEnumerables 在你的情况下,我认为 .ElementAtOrDefault(0)(或者如果你总是想使用索引 0,只需使用 .FirstOrDefault())最适合你。

if (result?.Data != null)
{
    /// Expecting 'AdditionalData' is `string`
    if (!string.IsNullOrEmpty(result.Data.ElementAtOrDefault(0)?.AdditionalData))
    {
        Console.WriteLine("Null check working...");
    }
    else
    {
        Console.WriteLine("AdditionalData is null or empty!");
    }
}
else
{
    Console.WriteLine("No data!");
}

可以找到完整的工作示例here

空条件可以与 Any 一起工作,并短路下一个检查

if (result?.Data?.Any() && result.Data[0]?.AdditionalData != null)
{
    // to do
}

每个步骤的解释

result?

结果不为空吗?

Data?

如果是,数据不为空吗?

Any()

如果有,Data 有没有项目?

Data[0]?

如果是这样,第一项不是空的吗? (我在这里使用索引的原因是因为你可能想检查第n项,所以FirstOrDefault可能太严格了)

AdditionalData != null

如果是,附加数据是否不为空?

当然,如果这些检查中的任何一个是不必要的或多余的,您可以从链中删除特定的检查(在 null 条件的情况下删除 ?)。这里的检查都清楚地排在一行中,因此修改逻辑链很简单。

一个衬垫使用 System.Linq

if (result.Data.FirstOrDefault()?.AdditionalDate != null)
{
 
} 

我认为获得干净良好代码的最佳方法是使用 FluentValidation。请注意以下代码片段:

public class RegisterValidator : AbstractValidator<RegisterDTO>
{
    public RegisterValidator()
    {
        RuleFor(a => a.PhoneNumber).NotNull().WithMessage(Utility.GetEnumTitlePersian(enmErrorMessage.InValidMobileNumber));
        RuleFor(a => a.PhoneNumber).NotEmpty().WithMessage(Utility.GetEnumTitlePersian(enmErrorMessage.InValidMobileNumber));
        RuleFor(a => a.PhoneNumber).MinimumLength(11).WithMessage(Utility.GetEnumTitlePersian(enmErrorMessage.InValidMobileNumber));
        RuleFor(a => a.PhoneNumber).MaximumLength(11).WithMessage(Utility.GetEnumTitlePersian(enmErrorMessage.InValidMobileNumber));
    }
}

以上代码是验证模型以检查 null、empty 等的示例,此代码必须检查业务逻辑中的验证:

var validator = new RegisterValidator();
var validatorResult = await validator.ValidateAsync(register);

if (!validatorResult.IsValid)
    return BadRequest("", validatorResult.Errors[0].ToString());

使用起来很简单,也很干净。你甚至可以通过错误列表进行多次检查并得到结果

这个link是FluentValidation

的网址