La Parola Chiave `static`
Una parola chiave importante che potresti aver già incontrato molte volte è la parola chiave static
. Nel Corso di Base su C#, è stato menzionato che static
viene utilizzato quando si definiscono variabili globali - variabili che si trovano al di fuori di qualsiasi metodo specifico:
index.cs
1234567891011using System; class ConsoleApp { static int val = 10; static void Main() { Console.WriteLine($"The value is {val}"); } }
All'epoca era un modo conveniente per descrivere la parola chiave static
perché si presumeva che il lettore potesse non avere alcuna conoscenza di oggetti o classi, tuttavia ora, se osservi il codice, potresti renderti conto che val
è fondamentalmente un campo della classe ConsoleApp
. Tuttavia, nota che la classe ConsoleApp
è leggermente diversa dalle classi che normalmente crei. Questo perché ConsoleApp
rappresenta il programma stesso e non esiste alcun oggetto di ConsoleApp
. Tornerai su questo aspetto tra poco.
Poiché una classe è solo un modello, più simile a un guscio vuoto, normalmente non contiene dati di per sé; invece, crei oggetti utilizzando quel modello e poi memorizzi e accedi ai dati da quegli oggetti - come spiegato in precedenza:
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); } }
Anche all'interno di una classe, quando si accede a questi campi, lo si fa tramite un oggetto. Ad esempio, in un costruttore, si utilizzano fondamentalmente i dati passati dall'oggetto che ha invocato il metodo costruttore:
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; }
Allo stesso modo, anche in altri metodi, quando si accede ai campi, si stanno essenzialmente accedendo ai campi degli oggetti che chiamano quei metodi, e non della classe stessa, poiché normalmente una classe non contiene dati.
Tuttavia, esiste un modo per memorizzare dati direttamente in una classe e rendere una proprietà accessibile senza la necessità di creare un oggetto. È possibile farlo semplicemente rendendo quel campo o metodo 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 } }
Poiché la ConsoleApp
o la classe principale di qualsiasi programma che rappresenta il programma stesso non può avere oggetti, è necessario rendere i loro metodi e campi statici. Questo è il motivo per cui anche il metodo Main
è static
:
index.cs
1234static void Main() { // code }
1. Una classe può memorizzare dati direttamente?
2. Qual è la sintassi corretta per modificare il campo value
?
Grazie per i tuoi commenti!
Chieda ad AI
Chieda ad AI
Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione
Awesome!
Completion rate improved to 2.04
La Parola Chiave `static`
Scorri per mostrare il menu
Una parola chiave importante che potresti aver già incontrato molte volte è la parola chiave static
. Nel Corso di Base su C#, è stato menzionato che static
viene utilizzato quando si definiscono variabili globali - variabili che si trovano al di fuori di qualsiasi metodo specifico:
index.cs
1234567891011using System; class ConsoleApp { static int val = 10; static void Main() { Console.WriteLine($"The value is {val}"); } }
All'epoca era un modo conveniente per descrivere la parola chiave static
perché si presumeva che il lettore potesse non avere alcuna conoscenza di oggetti o classi, tuttavia ora, se osservi il codice, potresti renderti conto che val
è fondamentalmente un campo della classe ConsoleApp
. Tuttavia, nota che la classe ConsoleApp
è leggermente diversa dalle classi che normalmente crei. Questo perché ConsoleApp
rappresenta il programma stesso e non esiste alcun oggetto di ConsoleApp
. Tornerai su questo aspetto tra poco.
Poiché una classe è solo un modello, più simile a un guscio vuoto, normalmente non contiene dati di per sé; invece, crei oggetti utilizzando quel modello e poi memorizzi e accedi ai dati da quegli oggetti - come spiegato in precedenza:
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); } }
Anche all'interno di una classe, quando si accede a questi campi, lo si fa tramite un oggetto. Ad esempio, in un costruttore, si utilizzano fondamentalmente i dati passati dall'oggetto che ha invocato il metodo costruttore:
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; }
Allo stesso modo, anche in altri metodi, quando si accede ai campi, si stanno essenzialmente accedendo ai campi degli oggetti che chiamano quei metodi, e non della classe stessa, poiché normalmente una classe non contiene dati.
Tuttavia, esiste un modo per memorizzare dati direttamente in una classe e rendere una proprietà accessibile senza la necessità di creare un oggetto. È possibile farlo semplicemente rendendo quel campo o metodo 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 } }
Poiché la ConsoleApp
o la classe principale di qualsiasi programma che rappresenta il programma stesso non può avere oggetti, è necessario rendere i loro metodi e campi statici. Questo è il motivo per cui anche il metodo Main
è static
:
index.cs
1234static void Main() { // code }
1. Una classe può memorizzare dati direttamente?
2. Qual è la sintassi corretta per modificare il campo value
?
Grazie per i tuoi commenti!