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

3
我有以下代码来优化执行时间,只搜索一次类型:
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()在应用程序的生命周期内不会改变。

4
也许这个能帮到你:https://dev59.com/9lsX5IYBdhLWcg3wAbi6#34334726 - Dennis
1
我理解 GetAssemblies() 的结果在调用之间不会改变?那么你应该将第一次调用的结果缓存到一个私有容器中,可以是任何类型,并返回一个可枚举对象。 - Peter - Reinstate Monica
3
公共属性返回数组类型将触发此代码分析规则:CA1819: 属性不应返回数组 - Martin Liversage
1
@MartinLiversage 这是一个有趣的警告;我从未听说过它。担心数组完整性在“敌对”环境中是有道理的,当你不知道属性调用者可能会做什么时,但对于我自己控制的代码,我不会太认真对待它。 - Peter - Reinstate Monica
@PeterA.Schneider: 微软为“库开发人员”创建了许多代码分析警告,即微软开发.NET基础类库的开发人员。在你自己的代码中,你可以完全忽略这样的规则。但即使在一个小团队中,你也可能发现这些规则是有用的,因为没有“隐藏”的规则,你得到一个数组,但不允许修改它。 - Martin Liversage
3个回答

1

由于这是内部的,我可能会使用Type[],因为如果不更改数组,则可以避免许多不良后果。

如果它是公共的,我会将其包装在ReadOnlyCollection<Type>中。然后我需要决定是否将其公开为IReadOnlyList<T>IList<T>,这样对用户来说方便,但同时我需要继续支持该功能,而IEnumerable<Type>则给了我更多实现变更的自由。


@PeterA.Schneider 你为什么这么说?回顾一下问题,看起来提问者通过使用 ToArray() 解决了性能问题,并且只是想知道他们是否正确地更改了存储字段的类型。 - Jon Hanna

0

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


我认为问题的一部分在于每次访问属性时,都会再次执行CurrentDomain.GetAssemblies(),这会导致性能下降。 - Peter - Reinstate Monica

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接