当IEnumerable<Member>实际为List时,多次调用First()是否合理?是否应存变量?
多次调用List.First()是否有不妥?是否该存入变量?
先看你提供的代码示例:
方法实现:
public async Task SomeMethod(IEnumerable<Member> members) { await DoSomething(members.First()); await DoSomethingElse(members.First()); }
调用方式:
List<Member> members = GetMembers(); await SomeMethod(members);
针对你的问题,分两部分说明:
1. 针对List场景,多次调用First()的直接影响
对于List<T>来说,First()方法是直接访问内部数组的第一个元素,属于O(1)的常量时间操作,性能上几乎没有额外开销,不会像IQueryable<T>那样触发多次数据库查询。所以从纯功能和当前性能角度,这么写不会出问题。
2. 为什么存入变量是更佳实践
虽然当前场景没问题,但把First()的结果存入变量是更稳妥的做法,原因如下:
- 可读性更强:给变量起一个有意义的名字(比如
firstMember),能让代码意图更清晰,后续维护的人一眼就能知道这个变量的用途。 - 维护成本更低:如果后续需要修改获取逻辑(比如改成
FirstOrDefault()加空值判断,或者换用Single()),只需要修改一次变量赋值的地方,不用在多个地方重复修改,减少出错概率。 - 方法健壮性更好:你的方法参数是
IEnumerable<Member>,虽然现在调用方传的是List,但未来如果有其他调用方传入一个惰性枚举的IEnumerable(比如自定义迭代器、LINQ延迟查询的结果),多次调用First()会触发多次枚举,可能导致重复计算、数据不一致甚至性能问题。存入变量能避免这种潜在风险。
总结
哪怕当前用的是List,将First()的结果存入变量依然是最佳实践——它不会带来任何性能损失,却能提升代码的可读性、可维护性和方法的健壮性。
内容的提问来源于stack exchange,提问作者David Klempfner
相关产品推荐
相关产品推荐

