gpt4 book ai didi

c# - 具有不抛出保证的 IEnumerable 扩展

转载 作者:太空狗 更新时间:2023-10-30 00:44:14 25 4
gpt4 key购买 nike

就我个人而言,作为客户端,我很喜欢 C# 中 IEnumerable/List 扩展方法的流畅接口(interface)语法。也就是说,我更喜欢这样的语法:

    public void AddTheseGuysToSomeLocal(IEnumerable<int> values)
{
values.ToList().ForEach(v => _someLocal += v);
}

而不是像 foreach 循环这样的控制结构。一目了然,我发现这更容易在心理上进行处理。问题是,如果客户向我传递一个空参数,我这里的代码将生成空引用异常。

假设我不想将 null 枚举视为异常——我希望这会导致保留一些局部原样——我会添加一个 null 守卫。但是,根据我的口味,这在语法上有点嘈杂,如果您在流畅的界面中将这些链接在一起并且中间结果也可能为空,那么这种噪音就会增加。

因此,我创建了一个名为 SafeEnumerableExtensions 的类,它通过将 null 视为空可枚举(列表)来提供不抛出保证。示例方法包括:

    //null.ToList() returns empty list
public static List<T> SafeToList<T>(this IEnumerable<T> source)
{
return (source ?? new List<T>()).ToList();
}

//x.SafeForEach(y) is a no-op for null x or null y
//This is a shortcut that should probably go in a class called SafeListExtensions later
public static void SafeForEach<T>(this List<T> source, Action<T> action)
{
var myAction = action ?? new Action<T>(t => { });
var mySource = source ?? new List<T>();
mySource.ForEach(myAction);
}

public static void SafeForEach<T>(this IEnumerable<T> source, Action<T> action)
{
SafeToList(source).SafeForEach(action);
}

现在,我的原始方法比有 null 守卫的情况更漂亮,但同样安全,因为 null 会导致空操作:

    public void AddTheseGuysToSomeLocal(IEnumerable<int> values)
{
values.ForEach(v => _someLocal += v);
}

所以,我的问题是双重的。 (1) 我假设我不是第一个想到这个的人——有没有人知道是否有一个现有的库可以做这个或类似的事情?并且(2)是否有人使用过上述库或实现过这样的方案并经历过不愉快的后果,或者有人能预见到做这样的事情会带来不愉快的后果吗?这是个好主意吗?

(我在检查重复项时确实找到了 this question,但我不想在客户端中明确执行此检查 - 我希望扩展类隐式执行此操作,而不是用额外的方法调用打扰客户端)

最佳答案

And (2) has anyone used said library or implemented a scheme like this and experienced unpleasant consequences or else can anyone foresee unpleasant consequences for doing something like this? Is this even a good idea?

我个人认为这是个坏主意。在大多数情况下,传递一个 null 枚举或 null Func 可能不是故意的。

您正在“修复”可能会在以后导致看似无关的问题的问题。相反,我宁愿在这种情况下抛出异常,以便您尽早在代码中发现此问题("Fail fast")。

关于c# - 具有不抛出保证的 IEnumerable 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8372075/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com