检查值和引用类型是否为“null”

本文关键字:null 是否 引用类型 检查 | 更新日期: 2023-09-27 18:31:05

我目前对检查值和/或引用类型的"null"(空,不可用,没有值)有点困惑。似乎有很多可能的方法可以做到这一点,并且所有这些方法都经常使用。

假设我有以下扩展方法,可以以某种方式类似于 monad:

public static TResult UseWith<T, TResult>(this T value, Func<T, TResult> action)
{
    // if value not null
    //     execute action
    // else return the default value of 'TResult'
}

所以?如何检查空值?

if(value != null)

或(检查引用类型上的 null,但值类型的默认值)

if(!Equals(value, default(T))

if(!EqualityComparer<T>.Default.Equals(value, default(T))

或(带预检查)

 if (!typeof(T).IsValueType)
 {
     if (Equals(source, default(T))) 
          return TResult; 
 }

还是创建 2 种有限制的方法更好?

 public static TResult UseWith<T, TResult>(this T value, Func<T, TResult> action)
    where T : class
 {
    if(value == null)
  public static TResult UseWith<T, TResult>(this T value, Func<T, TResult> action)
    where T : struct
 {
    if(value.HasValue)

检查值和引用类型是否为“null”

第一个代码段中的伪代码将完全按照您的要求工作。 键入为无界泛型参数的变量可以与使用 == 运算符的变量进行比较null。 代码将编译,并且只要T是不可为空的值类型,它就会简单地计算为false

您不希望T与默认值进行比较,因为默认值可能不是 null

无需显式检查T是否为值类型,或者引用/值类型是否具有单独的重载,因为 == 运算符在 JITted 时会处理此问题。