Jeśli zaimplementuję typ ogólny, który może być instancjonowany przy użyciu wielu typów parametrów, czy powinienem (z powodu JIT wydajności/rozmiaru kodu itp.) Mieć wiele zagnieżdżonych typów nietypowych?Czy należy unikać typów zagnieżdżonych w typach ogólnych?
Przykład:
public class MyGenericType<TKey, TValue>
{
private struct IndexThing
{
int row; int col;
}
private struct SomeOtherHelper
{
..
}
private struct Enumerator : IEnumerator<KeyValuePair<TKey, TValue>> { }
}
Alternatywą który działa równie dobrze jest mieć nierodzajową rodzajów zewnątrz, ale potem zanieczyszczają nazw. Czy istnieje najlepsza praktyka?
public class MyGenericType<TKey, TValue>
{
private struct Enumerator : IEnumerator<KeyValuePair<TKey, TValue>> { }
}
internal struct IndexThingForMyGenericType
{
int row; int col;
}
internal struct SomeOtherHelper
{
...
}
Jak zawsze, nigdy nie optymalizuj, nigdy nie uderzając w wąskie gardła. Po prostu koduj w sposób, który ma sens, w większości nie będzie to problemem.Jeśli chodzi o pytanie, nie wiem, ale można zobaczyć wiele zagnieżdżonych klas prywatnych w BCL, więc nie miałbym nic przeciwko jeździe z punktu widzenia projektu. Drugi, jak mówisz, może być mylący. – nawfal
Ten kod nie jest semantycznie taki sam. W twoim pierwszym przykładzie 'SomeOtherHelper' nie jest pojedynczym typem, ponieważ zależy od ogólnych parametrów. Na przykład 'typeof (MyGenericType .SomeOtherHelper)' nie jest tym samym, co 'typeof (MyGenericType .SomeOtherHelper)'. –
Enigmativity
Jeśli Twoim problemem jest posiadanie klas w przestrzeni nazw, ponieważ chcesz, aby były czystsze, dodaj je do pod-przestrzeni nazw, na przykład, jeśli twój obszar nazw to MyNamespace, a następnie dodaj do obszaru MyNamespace.AccesoryNamespace. – Gusman