Contenu du cours
C# au-delà des Bases
C# au-delà des Bases
Le Mot-clé `static`
index
using System; class ConsoleApp { static int val = 10; static void Main() { Console.WriteLine($"The value is {val}"); } }
C'était un moyen pratique de décrire le mot-clé static
à ce moment-là car il était attendu que le lecteur n'ait peut-être aucune connaissance des objets ou des classes à ce stade, cependant maintenant si vous regardez le code, vous pourriez réaliser que val
est essentiellement un champ de la classe ConsoleApp
. Cependant, notez que la classe ConsoleApp
est légèrement différente des classes que nous créons normalement. C'est parce que ConsoleApp
représente le programme lui-même, et il n'y a pas d'objet de ConsoleApp
. Nous reviendrons sur cette partie dans un instant.
Puisqu'une classe n'est qu'un plan, plus comme une coquille vide, elle ne contient normalement pas de données par elle-même, au lieu de cela, nous créons des objets en utilisant ce plan et ensuite nous stockons et accédons aux données de ces objets - comme expliqué précédemment :
index
using 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 nous accédons à ces champs, nous y accédons via un objet. Par exemple, dans un constructeur, nous utilisons essentiellement les données qui ont été transmises par l'objet qui a appelé la méthode du constructeur :
index
public 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 nous accédons à des champs, nous accédons essentiellement aux champs des objets qui appellent ces méthodes, et non à ceux de la classe elle-même car la 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. Nous pouvons le faire en rendant simplement ce champ ou cette méthode static
:
index
using 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 le ConsoleApp
ou la classe principale de tout programme qui représente le programme lui-même ne peut pas avoir d'objets, nous devons rendre leurs méthodes et champs statiques. C'est pourquoi la méthode Main
est également static
:
index
static void Main() { // code }
1. Une classe peut-elle stocker directement des données ?
2. Quelle est la syntaxe correcte pour modifier le champ value
?
Merci pour vos commentaires !