Tom*_*han 7 c# null extension-methods
可能重复:
C#:在扩展方法中验证"this"参数的最佳实践
我对设计选择感到矛盾,并希望听到SO社区的意见.我在这里提出的例子只是一个可能的情况,必须进行这种设计选择 - 实际上,可能会有更多的情况.对这个具体案例和更一般的方法都欢迎回答,并且对于如何在特定案例中做出决定的指导方针也表示赞赏.
基本上,我想知道如何考虑这个:当编写一个扩展方法,如果将null引用作为this实例传递,本质上不会失败,是否应该对参数执行null检查?
例:
我正在编写一个扩展方法IEnumerable<T>,它将遍历集合并执行一些Action<T>- 基本上,这就是它的作用:
public static void Each<T>(this IEnumerable<T> collection, Action<T> action)
{
foreach (var t in collection)
{
action.Invoke(t);
}
}
Run Code Online (Sandbox Code Playgroud)
我无法决定的是,如果null传递给任一参数,这个扩展方法应该做什么.如果我不添加任何空检查,我将得到一个NullReferenceExceptionon action.Invoke(T),但是如果collection是nullfor循环将只是默默地做什么(并且即使action也是null...... 也不会抛出异常).
我决定添加一个空检查action,所以我可以抛出一个ArgumentNullException而不是NullReferenceException.但是我该collection怎么做呢?
选项1:添加空检查,并抛出ArgumentNullException.
选项2:只是默默地让方法什么都不做.
哪个在将来我想要使用该方法会更有用?为什么?
Jam*_*are 12
如果在LINQ中调用的集合为空,则Microsoft抛出ArgumentNullException.这实际上更多的是风格问题,但与扩展方法的行为方式一致.
@ m0sa是正确的,但你会从你的foreach获得一个null引用,但我会说检查top并抛出ArgumentNullException.那样你就可以和LINQ一样.
例如,如果您在反编译器中查看Any(),您会看到:
public static bool Any<TSource>(this IEnumerable<TSource> source)
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
using (IEnumerator<TSource> enumerator = source.GetEnumerator())
{
if (enumerator.MoveNext())
{
return true;
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1616 次 |
| 最近记录: |