确定某个值是否设置为其类型的默认值的可维护方法是什么?

时间:2013-03-05 23:30:51

标签: c# .net

说我有一些代码如下:

var someCollection = new int[] {};
var result = someCollection.SingleOrDefault();

然后,我想确定result是否为默认值。 但是,我希望以可维护的方式执行此操作,以便在someCollection的元素类型发生更改时,其余代码不需要更改。

这通常似乎完成的方式(一般意义上)是result == null。在这种情况下,当然,类型不是引用类型,因此这不起作用。

避免这种假设的改进是result == default(int)。但是,更改元素类型还需要将参数更改为default,因此仍然不满足仅在一个位置更改类型的要求。

验收标准

  1. 内置逻辑优于自定义逻辑。
  2. 首选优雅简洁的代码。
  3. 首选高效代码。 (对于参考类型,只应进行参考比较。)

3 个答案:

答案 0 :(得分:4)

您可以使用default关键字。由于您不知道类型是什么,因此您可以使用泛型。

public bool IsDefault<T>(T value)
{
    return EqualityComparer<T>.Default.Equals(value, default(T));
}

答案 1 :(得分:3)

从Sam那里偷窃并改进它:

public static bool IsDefault<T>(this T value)
{
    return value == null || value.Equals(default(T));
}

无需进行型式检查。 JIT会使它工作,因为它知道T在JIT时是什么。

  

请注意,如果类型覆盖等于,那么它甚至可以说是false   当它是default(T)时它可能会说是真的,即使它不是。    - Eric Lippert评论

答案 2 :(得分:2)

我认为这会奏效。

public static bool IsDefault<T>(this T value)
{
    var isValueType = typeof(T).IsValueType;

    if (isValueType)
        return value.Equals(default(T));
    else
        return value == null;
}

但是,对于值类型,我认为这会调用它们重载的Equals方法,这可能是也可能不是问题。

相关问题