Vous trouverez ci-dessous deux manières différentes d'initialiser des champs statiques en lecture seule. Y a-t-il une différence entre les deux approches? Si oui, quand doit-on être préféré à l'autre?Initialisation de champ en lecture seule statique par rapport à l'initialisation de constructeur statique
Répondre
Il existe une différence subtile entre ces deux, qui peut être vu dans le code IL - mettre un constructeur statique explicite dit au compilateur C# de ne pas marquer le type beforefieldinit. Le beforefieldinit affecte quand l'initialiseur de type est exécuté et savoir à ce sujet est utile lors de l'écriture lazy singletons in C#, par exemple.
En bref la différence est la suivante:
.class private auto ansi beforefieldinit A
.class private auto ansi B
Dans tous les autres aspects, ils sont les mêmes. Sortie du réflecteur:
Classe A:
.class private auto ansi beforefieldinit A
extends [mscorlib]System.Object
{
.method private hidebysig specialname rtspecialname static void .cctor() cil managed
{
.maxstack 8
L_0000: ldsfld class [mscorlib]System.Collections.Generic.Dictionary`2<string, class Connection> WebConfigurationManager::ConnectionStrings
L_0005: ldstr "SomeConnection"
L_000a: callvirt instance !1 [mscorlib]System.Collections.Generic.Dictionary`2<string, class Connection>::get_Item(!0)
L_000f: ldfld string Connection::ConnectionString
L_0014: stsfld string A::connectionString
L_0019: ret
}
.method public hidebysig specialname rtspecialname instance void .ctor() cil managed
{
.maxstack 8
L_0000: ldarg.0
L_0001: call instance void [mscorlib]System.Object::.ctor()
L_0006: ret
}
.field private static initonly string connectionString
}
Classe B:
.class private auto ansi B
extends [mscorlib]System.Object
{
.method private hidebysig specialname rtspecialname static void .cctor() cil managed
{
.maxstack 8
L_0000: nop
L_0001: ldsfld class [mscorlib]System.Collections.Generic.Dictionary`2<string, class Connection> WebConfigurationManager::ConnectionStrings
L_0006: ldstr "SomeConnection"
L_000b: callvirt instance !1 [mscorlib]System.Collections.Generic.Dictionary`2<string, class Connection>::get_Item(!0)
L_0010: ldfld string Connection::ConnectionString
L_0015: stsfld string B::connectionString
L_001a: ret
}
.method public hidebysig specialname rtspecialname instance void .ctor() cil managed
{
.maxstack 8
L_0000: ldarg.0
L_0001: call instance void [mscorlib]System.Object::.ctor()
L_0006: ret
}
.field private static initonly string connectionString
}
Ils sont essentiellement les mêmes, mais si vous arrive d'avoir à la fois une affectation en lecture seule à un champ statique et un constructeur de type statique, l'affectation de lecture seule se produit d'abord.
Le beforefieldinit attribut indique comment l'initialisation se produit.
Dans le cas d'une initialisation de constructeur statique explicite, l'initialisation du membre statique se produit au moment où le type est accédé. Dans l'exemple donné en cas de classe A, l'initialisation se fera uniquement lorsque connectionString est référencée en premier, alors qu'en cas d'initialisation de classe B, la première classe de type B sera référencée, sans nécessairement accéder à connectionString. Seul C# (.NET 4.0) nous permet de contrôler la façon dont les membres statiques peuvent être initialisés.
Avec VB.NET seule la méthode non beforefieldinit est possible alors qu'avec C++/CLI seul le mécanisme beforefieldinit est possible.
- 1. Initialisation de variable locale statique et d'objet local statique
- 2. initialisation statique en C
- 3. Objet Javascript - 'Initialisation statique'
- 4. Constructeur statique et par défaut
- 5. initialisation de variable statique java
- 6. C# problème de constructeur statique
- 7. Initialisation statique d'un haricot
- 8. Java équivalent du code C# en lecture seule statique suivant?
- 9. ASP.NET État de l'application par rapport à un objet statique
- 10. Constructeur statique dans VB.NET
- 11. XamlParseException initialisation d'une classe statique
- 12. Constructeur statique pour l'ensemble
- 13. Arrêter le constructeur statique
- 14. C++ modèle initialisation pointeur à membre statique
- 15. asp.net mvc - constructeur statique
- 16. variable statique par rapport au membre
- 17. lecture variable statique d'un
- 18. C# ASP.NET fil statique Safe champ de lecture
- 19. contrôleur Asp.Net Mvc constructeur statique
- 20. destructeur statique
- 21. valeur Get de champ statique
- 22. Verrouillage de champ statique C#
- 23. Constructeur statique équivalent en Objective-C?
- 24. Affectation au champ de lecture statique de la classe de base
- 25. Initialisation d'un tableau const statique tridimensionnel
- 26. Classe DataService statique par rapport à IRepository <T>?
- 27. (initialisation statique/instanciation de modèle) problèmes avec motif d'usine
- 28. Allocation statique par rapport à l'allocation dynamique par rapport à l'allocation automatique
- 29. Déclaration et initialisation d'un int statique dans un en-tête
- 30. Objectif C: initialisation d'une variable statique avec appel de méthode statique