J’essaie d’utiliser un constructeur statique comme celui-ci:
public static DataManager() { LastInfoID = 1; }
et obtenir cette erreur:
les modificateurs d’access ne sont pas autorisés sur les constructeurs statiques
Je voudrais savoir quel est mon problème.
Le constructeur statique n’a pas de modificateur d’access: c’est juste:
static DataManager() // note no "public" { LastInfoID = 1; }
En effet, il n’est jamais appelé explicitement (sauf peut-être par reflection) – mais il est appelé par le moteur d’exécution; un niveau d’access n’aurait aucun sens.
Le problème est que le champ ou la propriété LastInfoID
n’est pas déclaré comme statique dans votre classe et que vous pouvez accéder uniquement aux membres statiques à partir d’un constructeur statique. Supprimez également le mot-clé public
de la déclaration:
static DataManager() { LastInfoID = 1; }
Retirez le public
. La syntaxe d’un constructeur statique est la suivante:
class MyClass { static MyClass() { // Static constructor } }
Pour donner à quelqu’un ici une réponse plus claire, sans exemple, réfléchissez à la raison pour laquelle vous devriez accéder à un constructeur statique de l’extérieur? Les classes statiques sont créées en mémoire lors de l’exécution de l’application, c’est pourquoi elles sont statiques. En d’autres termes, vous n’auriez JAMAIS besoin d’en appeler explicitement et, si vous le faites, par reflection (ce que je ne sais pas si cela vous laissera), alors vous faites quelque chose de mal.
Lorsque vous créez une nouvelle instance d’une classe, le constructeur existe pour initialiser toutes les variables internes et effectuer tout type de traitement nécessaire pour que la classe fonctionne comme prévu. Notez que si vous ne spécifiez pas de constructeur, le compilateur en créera un pour vous. Pour cette raison, vous devez toujours créer une classe avec un “()” comme ça
new MyClass();
car vous appelez le constructeur par défaut (à condition que vous n’ayez pas de paramètre sans paramètre). En d’autres termes, la raison pour laquelle un constructeur non statique doit être défini comme public est que vous devez l’appeler explicitement. Si la mémoire me sert bien, C # ne comstackra pas sur du code qui tente d’appeler un constructeur (via malloc) qui n’est pas défini comme public.
Les constructeurs d’une classe statique existent pour les besoins de la “configuration”. Par exemple, je peux avoir une classe statique qui est censée être le pont entre mon code et un fichier que je sauvegarde et lis en permanence. Je peux définir un constructeur qui, lors de la création de l’object, s’assurera que le fichier existe et, si ce n’est pas le cas, en crée un par défaut (très utile dans les systèmes Web portés sur d’autres serveurs).
using System; public class Something { // private static DateTime _saticConstructorTime; private DateTime _instanceConstructorTime; // public static DateTime SaticConstructorTime { set { _saticConstructorTime = value; } get { return _saticConstructorTime ; } } public DateTime InstanceConstructorTime { set { _instanceConstructorTime = value; } get { return _instanceConstructorTime; } } //Set value to static propriety static Something() { SaticConstructorTime = DateTime.Now; Console.WriteLine("Static constructor has been executed at: {0}", SaticConstructorTime.ToLongTimeSsortingng()); } //The second constructor started alone at the next instances public Something(ssortingng s) { InstanceConstructorTime = DateTime.Now; Console.WriteLine("New instances: "+ s +"\n"); } public void TimeDisplay(ssortingng s) { Console.WriteLine("Instance \""+ s + "\" has been created at: " + InstanceConstructorTime.ToLongTimeSsortingng()); Console.WriteLine("Static constructor has been created at: " + SaticConstructorTime.ToLongTimeSsortingng() + "\n"); } } // class Client { static void Main() { Something somethingA = new Something("somethingA"); System.Threading.Thread.Sleep(2000); Something somethingB = new Something("somethingB"); somethingA.TimeDisplay("somethingA"); somethingB.TimeDisplay("somethingB"); System.Console.ReadKey(); } } /* output : Static constructor has been executed at: 17:31:28 New instances: somethingA New instances: somethingB Instance "somethingA" has been created at: 17:31:28 Static constructor has been created at: 17:31:28 Instance "somethingB" has been created at: 17:31:30 Static constructor has been created at: 17:31:28 */