Quel est le besoin du constructeur privé en C#? Je l'ai eu comme question pour un test C#.Quel est le besoin du constructeur privé en C#?
Répondre
Par exemple, si vous avez une classe qui ne devrait être créé grâce à des méthodes d'usine. Ou si vous avez des surcharges du constructeur, et que certaines d'entre elles ne devraient être utilisées que par les autres constructeurs. Probablement d'autres raisons aussi = =
Chaque fois que vous voulez empêcher l'instanciation directe d'une classe de l'extérieur, vous allez utiliser un constructeur private
. Par exemple, avant C# 2.0 qui a introduit des classes static
, vous avez utilisé un constructeur private
pour accomplir à peu près la même chose:
sealed class StaticClass {
private StaticClass() {
}
public static void DoSomething() {
}
}
Tout en this link is related to java, je pense que cela devrait vous aider à comprendre la raison pour laquelle l'idée est à peu près la même.
Les constructeurs privés empêchent une classe d'être explicitement instanciée par les appelants. Il y a quelques cas communs où un constructeur privé peut être utile:
- classes contenant uniquement des méthodes utilitaires statiques
- classes contenant des constantes ne
- de type énumérations de sécurité
- singletons
Par exemple lorsque vous fournissez des méthodes d'usine pour contrôler l'instanciation ...
public class Test(){
private Test(){
}
void DoSomething(){
// instance method
}
public static Test CreateCoolTest(){
return new Test();
}
}
Lorsque vous souhaitez empêcher les utilisateurs de votre classe d'instancier directement la classe. Certains cas communs sont:
- classes ne contenant que des méthodes statiques
- singletons
Je peux rappeler quelques usages pour elle:
- Vous pouvez l'utiliser à partir d'une méthode de fabrication statique à l'intérieur de la même classe
- Vous pourriez faire un travail commun à l'intérieur et ensuite l'appeler à partir d'autres contructures
- Vous pouvez l'utiliser pour empêcher l'exécution d'ajouter un contructure vide automatiquement
- Il pourrait être utilisé (bien que privé) de certains outils de moqueries et ORM (comme NHibernate)
Si vous connaissez un certain modèle de conception, c'est évident: une classe pourrait créer une nouvelle instance de lui-même en interne, et ne pas laisser les autres le faire. Un exemple en Java (je ne sais pas C# assez, désolé) avec un singleton classe:
class Meh
{
private Meh() { }
private static Meh theMeh = new Meh();
public static Meh getInstance() { return theMeh; }
}
De façon assez humoristique, ce Java est aussi valide en C# - peut-être connaissez-vous plus de C# que vous ne le pensez. ;) –
Vous pouvez l'utiliser avec l'héritage dans le cas où les arguments au constructeur de la classe de base sont de types différents à ceux du constructeur de classes enfant mais vous avez toujours besoin de la fonctionnalité de la classe de base dans la classe enfant, par exemple. méthodes protégées.
Généralement cela devrait être évité autant que possible car c'est une mauvaise forme d'héritage à utiliser.
Et bien sûr, vous pouvez utiliser le constructeur privé pour empêcher le sous-classement.
Les constructeurs privés sont utilisés pour empêcher la création d'instances d'une classe lorsqu'il n'existe aucun champ ou méthode d'instance, telle que la classe Math, ou lorsqu'une méthode est appelée pour obtenir une instance d'une classe. Si toutes les méthodes de la classe sont statiques, pensez à rendre la classe entière statique. Pour plus d'informations, consultez Classes statiques et Membres de classe statique.
class NLog
{
// Private Constructor:
private NLog() { }
public static double e = System.Math.E; //2.71828...
}
Voici un exemple de classe utilisant un constructeur privé.
public class Counter
{
private Counter() { }
public static int currentCount;
public static int IncrementCount()
{
return ++currentCount;
}
}
class TestCounter
{
static void Main()
{
// If you uncomment the following statement, it will generate
// an error because the constructor is inaccessible:
// Counter aCounter = new Counter(); // Error
Counter.currentCount = 100;
Counter.IncrementCount();
System.Console.WriteLine("New count: {0}", Counter.currentCount);
}
}
Je suis en retard dans le jeu, mais la lecture de toutes les autres réponses, je ne vois pas cet usage mentionné:
J'utilise les constructeurs privés dans des scénarios où j'ai plusieurs constructeurs (publics) , et ils ont tous du code en commun. Avec le chaînage du constructeur, le code devient vraiment net et SEC. Rappelez-vous, les variables readonly privées ne peuvent être définies que dans les constructeurs, donc je ne peux pas utiliser une méthode régulière.
Exemple:
public class MyClass
{
private readonly int _a;
private readonly int _b;
private readonly string _x;
public MyClass(int a, int b, string x)
: this(x)
{
_a = a;
_b = b;
}
public MyClass()
: this("(not set)")
{
// Nothing set here...
}
private MyClass(string x)
{
_x = x;
}
}
Fondamentalement, vous utilisez les constructeurs privés. Dans ce cas, vous avez défini une méthode statique dans la classe qui appelle le constructeur privé en interne. Pour créer l'instance de la classe pour la première fois, l'utilisateur appelle classname.static_method_name. Dans cette méthode, puisque l'objet de la classe n'existe pas encore, la méthode statique appelle en interne le constructeur privé et renvoie l'instance de la classe.
Si l'instance de la classe existe déjà, la méthode statique renvoie simplement l'instance à la méthode appelante.
- 1. Comment instancier un objet avec un constructeur privé en C#?
- 2. constructeur privé, sous-classe et scellé
- 3. Syntaxe du constructeur C++
- 4. Forme spécifique du constructeur en C#
- 5. En java, comment faire une classe avec un constructeur privé dont la superclasse a aussi un constructeur privé?
- 6. Comment rendre le constructeur de classe privé dans Ruby?
- 7. Le JDK du constructeur est-il important?
- 8. Spécialisation du constructeur en python
- 9. Règles d'accès du constructeur
- 10. C/C initialisation du tableau privé dans le fichier d'en-tête
- 11. Quel est le nom du motif?
- 12. Création automatique du constructeur, selon la classe parent constructeur (C++)
- 13. Quel est le code clé du signe%?
- 14. Quel est le problème avec l'utilisation de super() dans un constructeur en Java?
- 15. Initialisation d'un membre de données istream privé en C++
- 16. Quel est le meilleur moyen de faire throbber en C#?
- 17. Quel est le but de typedefing une classe en C++?
- 18. Différents arguments dans le constructeur d'une classe en C++
- 19. C++ Débutant question: Constructeur
- 20. Quel est l'équivalent de Thread.SetApartmentState en C++?
- 21. Quel est l'équivalent de TreeBidiMap en C#?
- 22. Quel est le truc avec c: \ programme?
- 23. NSMutableArray. Quel est le moyen le plus rapide pour le convertir en un tableau C simple?
- 24. Constructeur statique équivalent en Objective-C?
- 25. Quel est l'équivalent VB.NET du mot clé readonly C#?
- 26. C++ vide Constructeur de chaîne
- 27. Quel est le meilleur code pour convertir les paramètres BSTR en ANSI en C/C++?
- 28. Polymorphisme du constructeur Aide
- 29. Quel est l'équivalent de AbstractMap de Java en C#?
- 30. appel constructeur de base en C#
En fait, lorsque vous devez contrôler l'instanciation de classe, cela peut se faire via un modèle d'usine ou un modèle singleton. –
@ André: Et votre point est? Ce serait toujours une raison pour avoir des constructeurs privés. Sauf si votre classe d'usine est une classe différente, mais c'est un sujet différent. – Svish