检查值和引用类型是否为“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
。 代码将编译,并且只要T
是不可为空的值类型,它就会简单地计算为false
。
您不希望T
与默认值进行比较,因为默认值可能不是 null
。
无需显式检查T
是否为值类型,或者引用/值类型是否具有单独的重载,因为 ==
运算符在 JITted 时会处理此问题。