Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么';这是一种可维护的方法,用于确定值是否设置为其类型';默认值是多少?_C#_.net - Fatal编程技术网

C# 什么';这是一种可维护的方法,用于确定值是否设置为其类型';默认值是多少?

C# 什么';这是一种可维护的方法,用于确定值是否设置为其类型';默认值是多少?,c#,.net,C#,.net,假设我有如下代码: var someCollection = new int[] {}; var result = someCollection.SingleOrDefault(); 然后我想确定result是否为默认值但是,我希望以可维护的方式执行此操作,以便在someCollection的元素类型发生更改时,不需要更改其余的代码。 通常(在一般意义上)这样做的方式是result==null。当然,在这种情况下,该类型不是引用类型,因此这不起作用 避免这种假设的改进是result==defa

假设我有如下代码:

var someCollection = new int[] {};
var result = someCollection.SingleOrDefault();
然后我想确定
result
是否为默认值但是,我希望以可维护的方式执行此操作,以便在
someCollection
的元素类型发生更改时,不需要更改其余的代码。

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

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

验收标准
  • 内置逻辑优于自定义逻辑
  • 优雅简洁的代码优先
  • 最好使用高效的代码。(对于引用类型,只应进行引用比较。)

  • 我想这会管用的

    public static bool IsDefault<T>(this T value)
    {
        var isValueType = typeof(T).IsValueType;
    
        if (isValueType)
            return value.Equals(default(T));
        else
            return value == null;
    }
    
    公共静态bool IsDefault(此T值)
    {
    var isValueType=类型(T)。isValueType;
    if(isValueType)
    返回值。等于(默认值(T));
    其他的
    返回值==null;
    }
    

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

    从Sam中窃取并改进它:

    public static bool IsDefault<T>(this T value)
    {
        return value == null || value.Equals(default(T));
    }
    
    公共静态bool IsDefault(此T值)
    {
    返回值==null | | value.Equals(默认值(T));
    }
    
    不需要进行类型检查。JIT将使它工作,因为它知道在JIT时间T是什么

    注意,如果类型重写等于,那么它可能会说false 当它是
    default(T)
    时,它可能会说true,即使它不是。 –Eric Lippert评论

    您可以使用关键字。因为您不知道类型是什么,所以可以使用泛型

    public bool IsDefault<T>(T value)
    {
        return EqualityComparer<T>.Default.Equals(value, default(T));
    }
    
    public bool IsDefault(T值)
    {
    返回EqualityComparer.Default.Equals(值,默认值(T));
    }
    
    默认值(类型)
    如果默认值是有效值,则没有多大帮助。0表示整数,例如。是的,这是有效的,因为将值类型与null进行比较总是返回false。@MatthewWatson:将不可为null的值类型与null进行比较总是导致false。将可为null值类型的值与null值进行比较可以返回true。@usr:请注意,如果类型重写等于,则即使它是默认值(T),也可能会说false,即使它不是默认值,也可能会说true。@usr如果您觉得其他用户的答案可以改进,请随意改进(编辑)它,而不是创建(改进的)副本。在这种特殊情况下,考虑到您和Sam的代表差异,这特别有意义。@zespri未经他的同意,我不能在语义上改变他的解决方案。那太粗鲁了。我的解决方案表现得不同。我复制方法签名是为了方便,不是因为我无法生成它。谢谢!这正是我想要的。