Le mot-clé `static`
Un mot-clé important que vous avez probablement déjà rencontré à plusieurs reprises est le mot-clé static
. Dans le Cours de base C#, il a été mentionné que static
est utilisé lors de la définition de variables globales - des variables qui se trouvent en dehors de toute méthode spécifique :
index.cs
1234567891011using System; class ConsoleApp { static int val = 10; static void Main() { Console.WriteLine($"The value is {val}"); } }
C'était une manière pratique de décrire le mot-clé static
à ce moment-là, car il était supposé que le lecteur n'avait peut-être aucune connaissance des objets ou des classes à ce stade. Cependant, si vous regardez maintenant le code, vous pouvez réaliser que val
est en réalité un champ de la classe ConsoleApp
. Cependant, notez que la classe ConsoleApp
est légèrement différente des classes que vous créez habituellement. En effet, ConsoleApp
représente le programme lui-même, et il n'existe aucun objet de la classe ConsoleApp
. Vous reviendrez sur cette partie un peu plus tard.
Puisqu'une classe n'est qu'un plan, plutôt comme une coquille vide, elle ne contient normalement pas de données en elle-même ; à la place, vous créez des objets à partir de ce plan, puis vous stockez et accédez aux données à partir de ces objets - comme expliqué précédemment :
index.cs
12345678910111213141516171819202122232425262728using System; class Complex { public int real; public int img; public Complex(int real, int img) { this.real = real; this.img = img; } } class ConsoleApp { static int val = 10; static void Main() { Complex c = new Complex(5, 10); // We can use and update the field of 'c' which is an instance. Console.WriteLine(c.real); c.real = 7; Console.WriteLine(c.real); } }
Même à l'intérieur d'une classe, lorsque vous accédez à ces champs, vous y accédez via un objet. Par exemple, dans un constructeur, vous utilisez essentiellement les données transmises par l'objet qui a appelé la méthode du constructeur :
index.cs
12345678public Complex(int real, int img) { // 'int real' and 'int img' contain the data which was passed // 'this.real' refers to the 'real' field of the object which is calling this constructor // same is the case for 'this.img' this.real = real; this.img = img; }
De même, dans d'autres méthodes également, lorsque vous accédez à des champs, vous accédez en réalité aux champs des objets qui appellent ces méthodes, et non à ceux de la classe elle-même, car une classe ne contient normalement aucune donnée.
Cependant, il existe un moyen de stocker des données directement dans une classe et de rendre une propriété accessible sans avoir besoin de créer un objet. Il suffit pour cela de déclarer ce champ ou cette méthode comme static
:
index.cs
123456789101112131415161718192021222324252627282930313233343536373839using System; class Complex { public int real; public int img; // A static field can contain data // It is set to private because we don't want it to be manually modifiable from outside // This will track the total number of 'Complex' objects created private static int numbers = 0; public Complex(int real, int img) { this.real = real; this.img = img; numbers += 1; } // A static method // A static method or field can be accessed using the 'ClassName.PropertyName' syntax (see below) public static int getTotalComplexNumbers() { return numbers; } } class ConsoleApp { static void Main() { Console.WriteLine(Complex.getTotalComplexNumbers()); // 0 new Complex(1, 2); Console.WriteLine(Complex.getTotalComplexNumbers()); // 1 new Complex(2, 3); Console.WriteLine(Complex.getTotalComplexNumbers()); // 2 } }
Puisque la ConsoleApp
ou la classe principale de tout programme, qui représente le programme lui-même, ne peut pas avoir d'objets, il est nécessaire de rendre leurs méthodes et champs statiques. C'est pourquoi la méthode Main
est également static
:
index.cs
1234static void Main() { // code }
1. Une classe peut-elle stocker des données directement ?
2. Quelle est la syntaxe correcte pour modifier le champ value
?
Merci pour vos commentaires !
Demandez à l'IA
Demandez à l'IA
Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion
Can you explain more about the difference between static and non-static fields?
Why does the Main method have to be static in C#?
Can you give an example of when to use a static field or method?
Awesome!
Completion rate improved to 2.04
Le mot-clé `static`
Glissez pour afficher le menu
Un mot-clé important que vous avez probablement déjà rencontré à plusieurs reprises est le mot-clé static
. Dans le Cours de base C#, il a été mentionné que static
est utilisé lors de la définition de variables globales - des variables qui se trouvent en dehors de toute méthode spécifique :
index.cs
1234567891011using System; class ConsoleApp { static int val = 10; static void Main() { Console.WriteLine($"The value is {val}"); } }
C'était une manière pratique de décrire le mot-clé static
à ce moment-là, car il était supposé que le lecteur n'avait peut-être aucune connaissance des objets ou des classes à ce stade. Cependant, si vous regardez maintenant le code, vous pouvez réaliser que val
est en réalité un champ de la classe ConsoleApp
. Cependant, notez que la classe ConsoleApp
est légèrement différente des classes que vous créez habituellement. En effet, ConsoleApp
représente le programme lui-même, et il n'existe aucun objet de la classe ConsoleApp
. Vous reviendrez sur cette partie un peu plus tard.
Puisqu'une classe n'est qu'un plan, plutôt comme une coquille vide, elle ne contient normalement pas de données en elle-même ; à la place, vous créez des objets à partir de ce plan, puis vous stockez et accédez aux données à partir de ces objets - comme expliqué précédemment :
index.cs
12345678910111213141516171819202122232425262728using System; class Complex { public int real; public int img; public Complex(int real, int img) { this.real = real; this.img = img; } } class ConsoleApp { static int val = 10; static void Main() { Complex c = new Complex(5, 10); // We can use and update the field of 'c' which is an instance. Console.WriteLine(c.real); c.real = 7; Console.WriteLine(c.real); } }
Même à l'intérieur d'une classe, lorsque vous accédez à ces champs, vous y accédez via un objet. Par exemple, dans un constructeur, vous utilisez essentiellement les données transmises par l'objet qui a appelé la méthode du constructeur :
index.cs
12345678public Complex(int real, int img) { // 'int real' and 'int img' contain the data which was passed // 'this.real' refers to the 'real' field of the object which is calling this constructor // same is the case for 'this.img' this.real = real; this.img = img; }
De même, dans d'autres méthodes également, lorsque vous accédez à des champs, vous accédez en réalité aux champs des objets qui appellent ces méthodes, et non à ceux de la classe elle-même, car une classe ne contient normalement aucune donnée.
Cependant, il existe un moyen de stocker des données directement dans une classe et de rendre une propriété accessible sans avoir besoin de créer un objet. Il suffit pour cela de déclarer ce champ ou cette méthode comme static
:
index.cs
123456789101112131415161718192021222324252627282930313233343536373839using System; class Complex { public int real; public int img; // A static field can contain data // It is set to private because we don't want it to be manually modifiable from outside // This will track the total number of 'Complex' objects created private static int numbers = 0; public Complex(int real, int img) { this.real = real; this.img = img; numbers += 1; } // A static method // A static method or field can be accessed using the 'ClassName.PropertyName' syntax (see below) public static int getTotalComplexNumbers() { return numbers; } } class ConsoleApp { static void Main() { Console.WriteLine(Complex.getTotalComplexNumbers()); // 0 new Complex(1, 2); Console.WriteLine(Complex.getTotalComplexNumbers()); // 1 new Complex(2, 3); Console.WriteLine(Complex.getTotalComplexNumbers()); // 2 } }
Puisque la ConsoleApp
ou la classe principale de tout programme, qui représente le programme lui-même, ne peut pas avoir d'objets, il est nécessaire de rendre leurs méthodes et champs statiques. C'est pourquoi la méthode Main
est également static
:
index.cs
1234static void Main() { // code }
1. Une classe peut-elle stocker des données directement ?
2. Quelle est la syntaxe correcte pour modifier le champ value
?
Merci pour vos commentaires !