Question

Voici donc ce que je pense ...

public class MyClass
{
    public const string MyConstant = "MyConstantValue";

    private static MyClass DefaultInstance;

    static MyClass()
    {
         DefaultInstance = new MyClass();
    }
}

...

NotificationService.RegisterForNotification(MyClass.MyConstant, Callback);

Est-ce que ce travail ou dois-je utiliser quelque chose comme un static readonly propriété terrain pour déclencher le constructeur statique?

Était-ce utile?

La solution

L'utilisation d'une constante ne se traduit pas nécessairement dans un accès membre qui provoquerait le constructeur statique à appeler. Le compilateur est autorisé à (encouragé, même) substituer à la compilation de la valeur de la constante.

Votre solution proposée de static readonly devrait être ok, bien que readonly suggère un champ, pas une propriété. Les propriétés sont en lecture seule quand ils ont pas setter, le mot-clé readonly ne participe pas.

Un exemple simple:

class HasSConstructor
{
    internal const int Answer = 42;
    static HasSConstructor()
    {
        System.Console.WriteLine("static constructor running");
    }
}

public class Program
{
    public static void Main()
    {
        System.Console.WriteLine("The answer is " + HasSConstructor.Answer.ToString());
    }
}

Sortie sous .NET 4.0:

La réponse est 42

Le constructeur statique ne fonctionne jamais!

Autres conseils

constructeur statique est appelé automatiquement avant la première instance est créée ou les membres statiques sont référencés. Voir ici: MSDN: statique Constructors

Par ailleurs, les champs constants sont par nature statique, mais comme le souligne qu'ils (et sera probablement) être remplacée par la valeur elle-même.

Le constructeur statique ne sera pas appelé si vous êtes juste accès à des constantes publiques. Par exemple, considérons cette classe:

class Testo
{
    public const string MyValue = "Hello, world";
    public static readonly int xyzzy;

    static Testo()
    {
        Console.WriteLine("In static constructor");
        xyzzy = 27;
    }
}

Maintenant, dans une autre classe, exécutez:

Console.WriteLine(Testo.MyValue);
Console.WriteLine(Testo.xyzzy);

Votre sortie sera:

Hello, world
In static constructor
27

Constantes sont hissés de la classe au moment de la compilation. Ainsi, la valeur de Testo.MyValue ne fait pas référence à la classe Testo lors de l'exécution. Le constructeur statique n'est pas appelé jusqu'à ce que vous appelez quelque chose qui nécessite une initialisation.

Alors, oui, vous avez besoin de quelque chose comme un accès static readonly si vous voulez vous assurer que le constructeur est appelé.

Non, vous n'avez pas besoin d'un tel. constructeur statique est appelée lorsque la classe est chargée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top