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.
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!