16 votes

Combien de méthodes une classe C# peut-elle avoir

Y a-t-il une limite au nombre de propriétés et de méthodes qu'une classe C# peut avoir ?

J'ai parcouru rapidement la norme ECMA-334 et je n'ai trouvé aucune information à ce sujet.

Avant d'aborder les raisons pour lesquelles une classe avec de nombreuses méthodes est mal conçue, je veux être plus clair sur l'intention. Bien sûr, je n'écrirai pas une classe avec un grand nombre de méthodes manuellement. La raison pour laquelle je pose cette question est que j'ai besoin de générer un grand nombre d'unités d'exécution par code. Je suis en train de débattre entre avoir plusieurs classes avec une seule méthode ou une grande classe avec plusieurs méthodes.

Donc pour cette question, je suis seulement intéressé s'il y a une limite et quelle est la limite pour le nombre de propriétés, méthodes.

27voto

leppie Points 67289

16,7 millions d'euros par assemblage et par méthode (pas par classe).

18voto

Joe Albahari Points 13644

La réponse correcte, dans l'implémentation actuelle du CLR, est ushort.MaxValue - 15 . Ceci peut être testé comme suit :

AppDomain appDomain = AppDomain.CurrentDomain;

AssemblyName aname = new AssemblyName ("MyDynamicAssembly");

AssemblyBuilder assemBuilder =
  appDomain.DefineDynamicAssembly (aname, AssemblyBuilderAccess.Run);

ModuleBuilder modBuilder = assemBuilder.DefineDynamicModule ("DynModule");

TypeBuilder tb = modBuilder.DefineType ("Widget", TypeAttributes.Public);

for (int i = 0; i < ushort.MaxValue - 15; i++)
{
    MethodBuilder methBuilder = tb.DefineMethod ("SayHello" + i, MethodAttributes.Public, null, null);
    ILGenerator gen = methBuilder.GetILGenerator();
    gen.EmitWriteLine ("Hello world");
    gen.Emit (OpCodes.Ret);
}
Type t = tb.CreateType();
object o = Activator.CreateInstance (t);

La question est pertinente si vous utilisez Reflection.Emit pour créer un DataContext typé pour sauvegarder une base de données (comme le fait LINQPad). Avec suffisamment de procédures stockées, vous pouvez atteindre cette limite !

16voto

Fred Wuerges Points 111

Je ne sais pas combien de méthodes une classe C# peut avoir, mais je sais que lorsque vous y pensez, vous faites très certainement quelque chose de mal.

S'il y a une limite (ce dont je doute), elle est si élevée que vous ne la dépasserez pas. Sauf que vous avez une très mauvaise conception de classe.

Voir l'anti-modèle "Dieu objet" .

UPDATE :

Même si je ne sais pas encore exactement ce que vous voulez réaliser, je reste persuadé que vous devez créer beaucoup de classes avec seulement quelques méthodes pour les raisons suivantes :

  • Performance si vous placez toutes les propriétés dans une classe, il faudra allouer de la mémoire pour chaque propriété lorsque vous créerez une instance, même si vous n'avez besoin que de 5 % des propriétés de votre classe.

  • Modularité si vous créez beaucoup de classes, vous pouvez leur faire implémenter une interface/classe abstraite et ainsi définir une structure similaire, ce qui contribuera à rendre votre application plus modulaire.

  • Structure Il est assez simple de voir quelles méthodes utilisent quelles propriétés lorsqu'elles résident dans la même classe - sinon, les choses pourraient devenir vraiment très compliquées.

  • Temps de compilation : lorsque l'on change l'implémentation d'une fonction, les autres ne doivent pas être recompilées, comme c'est le cas dans d'autres classes.

4voto

João Silva Points 36619

Le site Type.GetMethods renvoie un tableau qui doit être indexé par un entier, donc je dirais que vous ne pouvez pas avoir plus de int.MaxValue méthodes par classe.

2voto

Dmitry Points 785

Regardez ça : https://softwareengineering.stackexchange.com/questions/193295/implications-of-a-large-partial-class/193304?noredirect=1#193304

Quelqu'un s'est donné la peine de générer une classe avec le plus grand nombre de méthodes possible.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X