TLDR: una singola classe con centinaia di metodi va benissimo, non si avranno problemi se non si hanno migliaia di metodi.
Per verificarlo correttamente, ho creato il seguente modello T4 in Visual Studio:
class LotsOfMethods
{
<# for (int i = 0; i < 100; i++) { #>
public static void M<#= i #>()
{
}
<# } #>
}
Variando la costante nel ciclo, posso scoprire come si comportano vari numeri di metodi. A quanto pare, 100, 1 000, 10 000 o persino 100 000 metodi si compilano bene (anche se in questi ultimi casi la compilazione richiede più tempo di un singolo progetto con una o due classi normalmente e VS anche a volte si blocca per pochi secondi ).
Quando ho provato a eseguire effettivamente il codice, i casi con 100, 1 000 o 10.000 metodi erano tutti perfetti. La parte interessante è che quando provi ad usare la classe con 100.000 metodi, otterrai un'eccezione:
System.TypeLoadException: Type 'LotsOfMethods' from assembly 'ConsoleApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' contains more methods than the current implementation allows.
In particolare, questa eccezione si verifica quando la classe ha 65 521 (2 16 -15) metodi o più. (Una domanda interessante è perché esattamente questo numero. Cosa significa il 15?)
Un'altra osservazione è che più metodi in una classe rendono la compilazione JIT più lenta. (O sono più metodi in un assembly? Non l'ho provato.) Quando eseguo 500 dei metodi ottengo i seguenti risultati:
Per una classe con 65 520 metodi:
For the first time: 2,2079481 s
For the second time: 0,0003259 s
Con 1 000 metodi:
For the first time: 0,0545898 s
For the second time: 0,0003138 s
E 500 metodi:
For the first time: 0,0361426 s
For the second time: 0,0003226 s
I risultati sono stati misurati utilizzando il seguente codice:
var sw = Stopwatch.StartNew();
int n = 500; // this is constant no matter how many methods does the class have
for (int i = 0; i < n; i++)
{
typeof(LotsOfMethods).GetMethod(string.Format("M{0}", i)).Invoke(null, null);
}
var first = sw.Elapsed.TotalSeconds;
sw.Restart();
for (int i = 0; i < n; i++)
{
typeof(LotsOfMethods).GetMethod(string.Format("M{0}", i)).Invoke(null, null);
}
var second = sw.Elapsed.TotalSeconds;
Console.WriteLine("For the first time: {0} s", first);
Console.WriteLine("For the second time: {0} s", second);