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未经他的同意,我不能在语义上改变他的解决方案。那太粗鲁了。我的解决方案表现得不同。我复制方法签名是为了方便,不是因为我无法生成它。谢谢!这正是我想要的。