Consultez le code suivant:Existe-t-il un moyen de forcer l'initialisation des champs statiques en C#?
class Program
{
static Program() {
Program.program1.Value = 5;
}
static List<Program> values = new List<Program>();
int value;
int Value
{
get { return value; }
set {
this.value = value;
Program.values.Add(this);
}
}
static Program program1 = new Program { value = 1 };
static Program program2 = new Program { value = 2 };
static Program program3 = new Program { value = 3 };
static void Main(string[] args)
{
if (Program.values.Count == 0) Console.WriteLine("Empty");
foreach (var value in Program.values)
Console.WriteLine(value.Value);
Console.ReadKey();
}
}
Il imprime seulement le numéro 5, et si supprimé le code dans le constructeur statique, il imprime « vide ».
Existe-t-il un moyen de forcer l'initialisation des champs statiques même s'ils ne sont pas encore utilisés?
J'ai besoin d'une propriété statique nommée Valeurs avec toutes les occurrences du type référencé.
J'ai essayé quelques variantes de ce code et certaines fonctionnent pour certains types mais pas pour d'autres.
EDIT: L'EXEMPLE CI-DESSUS BROKEN, FAITES L'ESSAI UN:
class Subclass<T> {
static Subclass()
{
Values = new List<Subclass<T>>();
}
public Subclass()
{
if (!Values.Any(i => i.Value.Equals(this.Value)))
{
Values.Add(this);
}
}
public T Value { get; set; }
public static List<Subclass<T>> Values { get; private set; }
}
class Superclass : Subclass<int>
{
public static Superclass SuperclassA1 = new Superclass { Value = 1 };
public static Superclass SuperclassA2 = new Superclass { Value = 2 };
public static Superclass SuperclassA3 = new Superclass { Value = 3 };
public static Superclass SuperclassA4 = new Superclass { Value = 4 };
}
class Program
{
static void Main(string[] args)
{
//Console.WriteLine(Superclass.SuperclassA1); //UNCOMMENT THIS LINE AND IT WORKS
foreach (var value in Superclass.Values)
{
Console.WriteLine(value.Value);
}
Console.ReadKey();
}
}
Ouais! J'ai lu ceci dans la spécification aussi. Mais j'espérais qu'il y avait un autre moyen, pas officiel, de le faire. Merci! –
S'il y a un moyen non officiel, j'aimerais en entendre parler! Mais peut-être devrait-on éviter de telles techniques. 'Unofficial.Equals (Hack)'? –
@ChristofferLette Pour le cas de Rafael, il existe en fait une autre manière qui apparaît dans MSDN et qui revient à .Net 1.1, 'System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor (..)'. Voir ma réponse pour une variation de travail de l'exemple de Rafael. –