我来自PHP和Javascript的Wild Wild West,您可以从函数返回任何内容.虽然我不喜欢缺乏问责制,但我在努力保持代码"完美"方面也遇到了新的挑战.
我制作了这个通用函数来从列表中选择一个随机元素
public static T PickRandom<T>(this IList<T> list) {
Random random = new Random();
int rnd = random.Next(list.Count);
return list[rnd];
}
Run Code Online (Sandbox Code Playgroud)
但我想保护自己不要在0值列表中使用它.显然我不能从T以外的函数返回任何东西,例如false或-1.我当然可以这样做
if(myList.Count > 0)
foo = Utilites.PickRandom(myList);
Run Code Online (Sandbox Code Playgroud)
然而,在C#中有很多疯狂的事情我不知道,对于这个应用程序,我正在创建我非常,经常必须从列表中选择一个可以在其Count中不断递减的随机元素.有没有更好的办法?
你有的选择
return default(T)
Run Code Online (Sandbox Code Playgroud)
这将是一个模棱两可的行为,因为这可能是列表的有效元素.
或者你可以像-1你说的那样返回一些东西,但这与你的代码完全相关.
或者你可以返回null,但这只能在可以T为空的类型时才能完成.
在以前的所有情况下,如果调用者不知道这种情况,应用程序可能会继续使用无效值,从而导致未知后果.
所以最好的选择可能是抛出异常:
throw new InvalidOperationException();
Run Code Online (Sandbox Code Playgroud)
通过这种方法,您可以快速失败并确保在调用者的意图之外不会发生任何意外情况.
支持此选项的一个原因.以Linq的扩展方法为例.如果你打电话First(),Single()或Last()对空列表,你会得到一个InvalidOperationException与消息"序列不包含任何元素".给你的类一个类似于框架类的行为总是一件好事.
由于阿列克谢·列文科夫在问题中的评论,我正在添加旁注.随机生成并不是最好的方法.看看这个问题.
第二方注意.您将函数声明为扩展方法IList<T>(通过使用this第一个参数之前执行此操作),然后将其称为静态辅助方法.扩展方法是一种语法糖,而不是这样做:
foo = Utilites.PickRandom(myList);
Run Code Online (Sandbox Code Playgroud)
让你这样做:
foo = myList.PickRandom();
Run Code Online (Sandbox Code Playgroud)
有关扩展方法的更多信息,请点击此处.
| 归档时间: |
|
| 查看次数: |
73 次 |
| 最近记录: |