`Static`-nøgleordet
Et vigtigt nøgleord, som du måske allerede er stødt på mange gange, er nøgleordet static
. I C# Grundlæggende Kursus blev det nævnt, at static
bruges ved definition af globale variabler – variabler, der er uden for en specifik metode:
index.cs
1234567891011using System; class ConsoleApp { static int val = 10; static void Main() { Console.WriteLine($"The value is {val}"); } }
Det var en bekvem måde at beskrive nøgleordet static
på dengang, fordi det blev forventet, at læseren måske ikke havde nogen viden om objekter eller klasser på det tidspunkt. Men nu, hvis du ser på koden, vil du måske indse, at val
grundlæggende er et felt i klassen ConsoleApp
. Bemærk dog, at klassen ConsoleApp
adskiller sig en smule fra de klasser, du normalt opretter. Det skyldes, at ConsoleApp
repræsenterer selve programmet, og der findes ikke noget objekt af ConsoleApp
. Du vender tilbage til denne del om lidt.
Da en klasse kun er en skabelon, mere som en hul skal, indeholder den normalt ikke data i sig selv. I stedet opretter du objekter ud fra denne skabelon og gemmer samt tilgår data fra disse objekter – som tidligere forklaret:
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); } }
Selv inde i en klasse, når du tilgår disse felter, gør du det gennem et objekt. For eksempel i en konstruktør bruger du grundlæggende de data, der blev videregivet af det objekt, som kaldte konstruktørmetoden:
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; }
På samme måde gælder det i andre metoder, at når du tilgår felter, tilgår du i bund og grund felterne for de objekter, der kalder disse metoder, og ikke for selve klassen, da en klasse normalt ikke indeholder nogen data.
Der er dog en måde at gemme data direkte i en klasse og gøre en egenskab tilgængelig uden at skulle oprette et objekt. Dette kan gøres ved blot at gøre feltet eller metoden 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 } }
Da ConsoleApp
eller hovedklassen i et program, som repræsenterer selve programmet, ikke kan have nogen objekter, skal deres metoder og felter være statiske. Det er derfor, Main
-metoden også er static
:
index.cs
1234static void Main() { // code }
1. Kan en klasse direkte gemme data?
2. Hvad er den korrekte syntaks for at ændre feltet value
?
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat
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
`Static`-nøgleordet
Stryg for at vise menuen
Et vigtigt nøgleord, som du måske allerede er stødt på mange gange, er nøgleordet static
. I C# Grundlæggende Kursus blev det nævnt, at static
bruges ved definition af globale variabler – variabler, der er uden for en specifik metode:
index.cs
1234567891011using System; class ConsoleApp { static int val = 10; static void Main() { Console.WriteLine($"The value is {val}"); } }
Det var en bekvem måde at beskrive nøgleordet static
på dengang, fordi det blev forventet, at læseren måske ikke havde nogen viden om objekter eller klasser på det tidspunkt. Men nu, hvis du ser på koden, vil du måske indse, at val
grundlæggende er et felt i klassen ConsoleApp
. Bemærk dog, at klassen ConsoleApp
adskiller sig en smule fra de klasser, du normalt opretter. Det skyldes, at ConsoleApp
repræsenterer selve programmet, og der findes ikke noget objekt af ConsoleApp
. Du vender tilbage til denne del om lidt.
Da en klasse kun er en skabelon, mere som en hul skal, indeholder den normalt ikke data i sig selv. I stedet opretter du objekter ud fra denne skabelon og gemmer samt tilgår data fra disse objekter – som tidligere forklaret:
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); } }
Selv inde i en klasse, når du tilgår disse felter, gør du det gennem et objekt. For eksempel i en konstruktør bruger du grundlæggende de data, der blev videregivet af det objekt, som kaldte konstruktørmetoden:
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; }
På samme måde gælder det i andre metoder, at når du tilgår felter, tilgår du i bund og grund felterne for de objekter, der kalder disse metoder, og ikke for selve klassen, da en klasse normalt ikke indeholder nogen data.
Der er dog en måde at gemme data direkte i en klasse og gøre en egenskab tilgængelig uden at skulle oprette et objekt. Dette kan gøres ved blot at gøre feltet eller metoden 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 } }
Da ConsoleApp
eller hovedklassen i et program, som repræsenterer selve programmet, ikke kan have nogen objekter, skal deres metoder og felter være statiske. Det er derfor, Main
-metoden også er static
:
index.cs
1234static void Main() { // code }
1. Kan en klasse direkte gemme data?
2. Hvad er den korrekte syntaks for at ændre feltet value
?
Tak for dine kommentarer!