web-dev-qa-db-fra.com

Comment passer un paramètre à un constructeur de classe statique?

J'ai une classe statique avec un constructeur statique. J'ai besoin de passer un paramètre d'une manière ou d'une autre à cette classe statique mais je ne suis pas sûr de savoir comment le meilleur moyen est . Que recommanderiez vous?

public static class MyClass {

    static MyClass() {
        DoStuff("HardCodedParameter")
    }
}
19
MrProgram

N'utilisez pas de constructeur statique, mais une méthode d'initialisation statique:

public class A
{
    private static string ParamA { get; set; }

    public static void Init(string paramA)
    {
        ParamA = paramA;
    }
}

En C #, les constructeurs statiques sont sans paramètre, et peu d’approches permettent de surmonter cette limitation. L'une est ce que je vous ai suggéré ci-dessus.

28
Matías Fidemraizer

Selon MSDN, Un constructeur statique est appelé automatiquement pour initialiser la classe avant la création de la première instance . Par conséquent, vous ne pouvez pas lui envoyer de paramètres.

CLR doit appeler un constructeur statique. Comment saura-t-il quels paramètres lui transmettre?

Alors n'utilisez pas un constructeur statique.

Voici la solution pour votre besoin.

public class StaticClass 
{ 
  private int bar; 
  private static StaticClass _foo;

  private StaticClass() {}

  static StaticClass Create(int initialBar) 
  { 
    _foo = new StaticClass();
    _foo.bar = initialBar; 
    return _foo;
  } 
}

Les constructeurs statiques ont les propriétés suivantes: 

  • Un constructeur statique ne prend pas de modificateurs d'accès ni de paramètres. Un constructeur statique est appelé automatiquement à initialiser la classe avant la création de la première instance ou de tout les membres statiques sont référencés.
  • Un constructeur statique ne peut pas être appelé directement.
  • L'utilisateur n'a aucun contrôle sur lorsque le constructeur statique est exécuté dans le programme.
  • Une utilisation typique des constructeurs statiques est lorsque la classe utilise un fichier journal et que le constructeur est utilisé pour écrire des entrées dans ce fichier.
  • Les constructeurs statiques sont également utiles lors de la création de classes wrapper pour le code non managé, lorsque le constructeur peut appeler LoadLibrary méthode.
  • Si un constructeur statique lève une exception, le moteur d'exécution ne l'invoquera pas une seconde fois et le type restera non initialisé pour la durée de vie du domaine d'application dans lequel votre programme est fonctionnement.
3
Rahul Nikate

Si par "HardCodedParameter" vous voulez vraiment dire codé en dur, vous pouvez utiliser des constantes.

public static class YoursClass
{ 
    public const string AnotherHardCodedParam = "Foo";
}

public static class MyClass
{
    private const string HardCodedParam = "FooBar";

    static MyClass()
    {
        DoStuff(MyClass.HardCodedParam);
        DoStuff(YoursClass.AnotherHardCodedParam);
    }
}

Vous pouvez également utiliser des propriétés statiques en lecture seule.

0
Mateusz Myślak