74 votes

Créer une instance d'objet sans invoquer le constructeur ?

En C#, existe-t-il un moyen d'instancier une instance d'une classe sans invoquer son constructeur ?

Supposons que la classe soit publique et définie dans une bibliothèque tierce et que le constructeur soit interne. Les raisons pour lesquelles je veux faire cela sont compliquées mais il serait utile de savoir si c'est possible en utilisant une sorte de hacking C#.

NOTE : J'ai spécifiquement ne veulent pas appeler de constructeur Il n'est donc pas possible d'utiliser la réflexion pour accéder au constructeur interne.

97voto

Hallgrim Points 7198

Je n'ai pas essayé, mais il existe une méthode appelée FormatterServices.GetUninitializedObject qui est utilisé lors de la désérialisation.

Les remarques de MSDN disent :

Parce que la nouvelle instance du est initialisée à zéro et qu'aucun constructeur n'est exécuté, l'objet pourrait ne pas représenter un état qui est considéré comme valide par cet objet.

10voto

Zachary Yates Points 4952

En fait, on dirait qu'ils ont rendu le constructeur interne juste pour qu'on ne puisse pas l'instancier. Il se peut qu'il y ait une méthode de construction ou de fabrication.

Consultez ces articles :

Empêcher la dérivation par des tiers : Partie 1

Empêcher la dérivation par des tiers : Partie 2

ils expliquent en quelque sorte le raisonnement.

6voto

Contrairement à ce que beaucoup pensent, un constructeur n'a pas grand-chose à voir avec l'instanciation d'un objet (terme assez trompeur). Un constructeur est une méthode spéciale qui peut être appelée après l'instanciation d'un objet pour permettre à cet objet de s'initialiser correctement. En C++, l'instanciation d'un objet alloue de la mémoire à l'objet, tandis qu'en .NET et en Java, la mémoire est à la fois allouée et préinitialisée à des valeurs par défaut en fonction du type de champ (0, null, false, etc.). L'exécution appelle ensuite le constructeur. L'opérateur new encapsule ces deux actions distinctes dans ce qui semble être une seule opération. La désérialisation n'aurait jamais pu fonctionner dans .NET s'il n'était pas possible de créer une instance sans utiliser de constructeur. Cela dit, le type ConstructorInfo agit à la fois comme un nouvel opérateur et comme un constructeur lorsqu'il appelle sa méthode Invoke(...).

3voto

Orion Edwards Points 54939

En C#, existe-t-il un moyen d'instancier une instance d'une classe sans invoquer son constructeur ?

Non, vous ne pouvez pas faire cela. Oui, vous pouvez

1voto

Scott Dorman Points 25000

Quoi qu'il en soit, lorsque vous créez une instance d'un objet, un constructeur est appelé quelque part dans le processus, même si vous ne l'appelez pas explicitement vous-même. En utilisant la réflexion ou Activator.CreateInstance (qui utilise également la réflexion), vous finirez toujours par appeler un constructeur. N'oubliez pas que le compilateur génère un constructeur par défaut si la classe n'en fournit pas un directement.

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