8

假设我有一些代码,如下所示:

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

然后我想确定是否result是默认值。但是,我想以可维护的方式这样做,以便如果元素类型发生someCollection更改,则其余代码不需要更改。

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

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

验收标准

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

3 回答 3

4

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

public bool IsDefault<T>(T value)
{
    return EqualityComparer<T>.Default.Equals(value, default(T));
}
于 2013-03-05T23:36:42.673 回答
3

从 Sam 那里窃取并改进它:

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

无需类型检查。JIT 将使它工作,因为它知道在 JIT 时间 T 是什么。

请注意,如果类型覆盖 Equals,那么即使它是default(T),它也可能会说 false,即使不是,它也可能会说 true。——埃里克·利珀特评论

于 2013-03-05T23:35:57.303 回答
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方法,这可能是也可能不是问题。

于 2013-03-05T23:32:25.843 回答