我有以下代码来优化执行时间,只搜索一次类型:
internal static Type[] SpecTestClasses =
AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(t => t.GetTypes())
.Where(t =>
t.GetCustomAttribute<CompilerGeneratedAttribute>() == null &&
t.GetCustomAttribute<TestClassAttribute>() != null &&
t.GetCustomAttribute<SerialSeleniumTestAttribute>() != null)
.ToArray();
我曾经有过:
internal static IEnumerable<Type> SpecTestClasses =
AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(t => t.GetTypes())
.Where(t =>
t.GetCustomAttribute<CompilerGeneratedAttribute>() == null &&
t.GetCustomAttribute<TestClassAttribute>() != null &&
t.GetCustomAttribute<SerialSeleniumTestAttribute>() != null);
但是这并没有优化我的执行,因为每次调用都会查询CurrentDomain。然后我添加.ToArray(),然后将返回类型更改为Type []。
现在我的问题:我应该有什么回报类型?我应该将返回类型保持为IEnumerable,如果是这样,为什么? ReSharper对此问题没有任何建议。
谢谢,
Drutten
修改:为了澄清,GetAssemblies()
在应用程序生命周期内不会发生变化。
答案 0 :(得分:1)
因为它是内部的,所以我可能会使用Type[]
,因为如果有人更改数组可能会发生许多不好的事情,可以通过不更改数组来避免。
如果它是公开的,我会将其换成ReadOnlyCollection<Type>
。然后我必须决定我将其暴露给用户的方便性IReadOnlyList<T>
或IList<T>
是否超过了我从那时起必须继续支持的负担,同时{{{ 1}}让我有更多的自由来改变实施方式。
答案 1 :(得分:0)
取决于您希望如何使用 SpecTestClasses 。如果您只需要枚举它,我建议使用 IEnumerable 。我认为只有在需要使用 SpecTestClasses 上的索引时才应该转换为数组。
答案 2 :(得分:0)
最好将数据保存在表达式树中,因此请使用枚举。 这样,始终只从表达式树的结果中检索一个项目。 因此,如果有可能,您不需要结果中的所有项目,也不需要多次枚举结果,则不应事先将其转换为数组,因为这样做没有任何好处。