Het `static` Sleutelwoord
Een belangrijk sleutelwoord dat je waarschijnlijk al vaak bent tegengekomen, is het sleutelwoord static
. In de C# Basis Cursus werd vermeld dat static
wordt gebruikt bij het definiëren van globale variabelen - variabelen die buiten een specifieke methode staan:
index.cs
1234567891011using System; class ConsoleApp { static int val = 10; static void Main() { Console.WriteLine($"The value is {val}"); } }
Het was destijds een handige manier om het sleutelwoord static
te beschrijven, omdat verwacht werd dat de lezer mogelijk nog geen kennis had van objecten of klassen. Als je nu echter naar de code kijkt, zul je beseffen dat val
in feite een veld is van de klasse ConsoleApp
. Merk echter op dat de klasse ConsoleApp
enigszins verschilt van de klassen die je normaal aanmaakt. Dit komt doordat ConsoleApp
het programma zelf vertegenwoordigt en er geen object van ConsoleApp
bestaat. Hier kom je later op terug.
Aangezien een klasse slechts een blauwdruk is, meer een lege huls, bevat deze normaal gesproken zelf geen gegevens. In plaats daarvan maak je objecten met behulp van die blauwdruk en sla je gegevens op en krijg je toegang tot gegevens via die objecten - zoals eerder uitgelegd:
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); } }
Zelfs binnen een klasse, wanneer je toegang krijgt tot deze velden, doe je dit via een object. Bijvoorbeeld in een constructor maak je in feite gebruik van de gegevens die zijn doorgegeven door het object dat de constructormethode heeft aangeroepen:
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; }
Op dezelfde manier, ook in andere methoden, wanneer je velden benadert, benader je in feite de velden van objecten die die methoden aanroepen, en niet van de klasse zelf, omdat een klasse normaal gesproken geen gegevens bevat.
Er is echter een manier om gegevens direct in een klasse op te slaan en een eigenschap toegankelijk te maken zonder een object te hoeven aanmaken. Dit kan door dat veld of die methode eenvoudigweg static
te maken:
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 } }
Aangezien de ConsoleApp
of de hoofdklasse van elk programma, die het programma zelf vertegenwoordigt, geen objecten kan hebben, moeten hun methoden en velden statisch zijn. Daarom is de Main
-methode ook static
:
index.cs
1234static void Main() { // code }
1. Kan een klasse direct gegevens opslaan?
2. Wat is de juiste syntaxis om het veld value
te wijzigen?
Bedankt voor je feedback!
Vraag AI
Vraag AI
Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.
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
Het `static` Sleutelwoord
Veeg om het menu te tonen
Een belangrijk sleutelwoord dat je waarschijnlijk al vaak bent tegengekomen, is het sleutelwoord static
. In de C# Basis Cursus werd vermeld dat static
wordt gebruikt bij het definiëren van globale variabelen - variabelen die buiten een specifieke methode staan:
index.cs
1234567891011using System; class ConsoleApp { static int val = 10; static void Main() { Console.WriteLine($"The value is {val}"); } }
Het was destijds een handige manier om het sleutelwoord static
te beschrijven, omdat verwacht werd dat de lezer mogelijk nog geen kennis had van objecten of klassen. Als je nu echter naar de code kijkt, zul je beseffen dat val
in feite een veld is van de klasse ConsoleApp
. Merk echter op dat de klasse ConsoleApp
enigszins verschilt van de klassen die je normaal aanmaakt. Dit komt doordat ConsoleApp
het programma zelf vertegenwoordigt en er geen object van ConsoleApp
bestaat. Hier kom je later op terug.
Aangezien een klasse slechts een blauwdruk is, meer een lege huls, bevat deze normaal gesproken zelf geen gegevens. In plaats daarvan maak je objecten met behulp van die blauwdruk en sla je gegevens op en krijg je toegang tot gegevens via die objecten - zoals eerder uitgelegd:
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); } }
Zelfs binnen een klasse, wanneer je toegang krijgt tot deze velden, doe je dit via een object. Bijvoorbeeld in een constructor maak je in feite gebruik van de gegevens die zijn doorgegeven door het object dat de constructormethode heeft aangeroepen:
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; }
Op dezelfde manier, ook in andere methoden, wanneer je velden benadert, benader je in feite de velden van objecten die die methoden aanroepen, en niet van de klasse zelf, omdat een klasse normaal gesproken geen gegevens bevat.
Er is echter een manier om gegevens direct in een klasse op te slaan en een eigenschap toegankelijk te maken zonder een object te hoeven aanmaken. Dit kan door dat veld of die methode eenvoudigweg static
te maken:
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 } }
Aangezien de ConsoleApp
of de hoofdklasse van elk programma, die het programma zelf vertegenwoordigt, geen objecten kan hebben, moeten hun methoden en velden statisch zijn. Daarom is de Main
-methode ook static
:
index.cs
1234static void Main() { // code }
1. Kan een klasse direct gegevens opslaan?
2. Wat is de juiste syntaxis om het veld value
te wijzigen?
Bedankt voor je feedback!