【发布时间】:2016-03-12 09:42:18
【问题描述】:
如果我实现了一个泛型类型,它可能会被大量类型参数实例化,我是否应该避免(出于 JIT 性能/代码大小等原因)有许多嵌套的非泛型类型?
例子:
public class MyGenericType<TKey, TValue>
{
private struct IndexThing
{
int row; int col;
}
private struct SomeOtherHelper
{
..
}
private struct Enumerator : IEnumerator<KeyValuePair<TKey, TValue>> { }
}
同样有效的替代方法是将非泛型类型放在外部,但它们会污染命名空间。 有最佳做法吗?
public class MyGenericType<TKey, TValue>
{
private struct Enumerator : IEnumerator<KeyValuePair<TKey, TValue>> { }
}
internal struct IndexThingForMyGenericType
{
int row; int col;
}
internal struct SomeOtherHelper
{
...
}
【问题讨论】:
-
一如既往地优化而不遇到瓶颈。只需以最有意义的方式进行编码,大多数情况下它不会成为问题。关于这个问题,我不知道,但你可以在 BCL 中看到很多嵌套的私有类,所以从设计的角度来看,我不介意走这条路。你说的第二个可能会令人困惑
-
这段代码在语义上不一样。在您的第一个示例中,
SomeOtherHelper不是单一类型,因为它取决于泛型参数。例如,typeof(MyGenericType<int, string>.SomeOtherHelper)与typeof(MyGenericType<long, bool>.SomeOtherHelper)不同。 -
如果您的问题是因为您希望命名空间中的类更干净,则将其添加到子命名空间,例如,如果您的命名空间是 MyNamespace,然后添加到 MyNamespace.AccesoryNamespace。
-
@Enigmativity 我意识到它们变成了不同的类型,但我不需要它们是不同的(除非它们有静态字段或者我使用例如 typeof(..) 在什么它们有明显不同的方式吗?)。我想嵌套它们,因为它们仅在我的类型中使用。但我不想支付性能费用。
-
@Gusman 我想我在想的是,在我班以外的任何人都不能使用的任何地方都有一种可发现的类型是一种气味。这是一种微弱的气味,所以如果对性能有一点好处,我很乐意为此付出代价。