我应该使用IEnumerable作为数组的返回类型吗?

时间:2016-02-02 09:01:07

标签: c#

我有以下代码来优化执行时间,只搜索一次类型:

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()在应用程序生命周期内不会发生变化。

3 个答案:

答案 0 :(得分:1)

因为它是内部的,所以我可能会使用Type[],因为如果有人更改数组可能会发生许多不好的事情,可以通过不更改数组来避免。

如果它是公开的,我会将其换成ReadOnlyCollection<Type>。然后我必须决定我将其暴露给用户的方便性IReadOnlyList<T>IList<T>是否超过了我从那时起必须继续支持的负担,同时{{{ 1}}让我有更多的自由来改变实施方式。

答案 1 :(得分:0)

取决于您希望如何使用 SpecTestClasses 。如果您只需要枚举它,我建议使用 IEnumerable 。我认为只有在需要使用 SpecTestClasses 上的索引时才应该转换为数组。

答案 2 :(得分:0)

最好将数据保存在表达式树中,因此请使用枚举。 这样,始终只从表达式树的结果中检索一个项目。 因此,如果有可能,您不需要结果中的所有项目,也不需要多次枚举结果,则不应事先将其转换为数组,因为这样做没有任何好处。