Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære `Static`-nøgleordet | OOP-Grundprincipper
C# Ud Over Det Grundlæggende

book`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

index.cs

copy
1234567891011
using 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

index.cs

copy
12345678910111213141516171819202122232425262728
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); } }

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

index.cs

copy
12345678
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; }

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

index.cs

copy
123456789101112131415161718192021222324252627282930313233343536373839
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 } }

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

index.cs

copy
1234
static void Main() { // code }

1. Kan en klasse direkte gemme data?

2. Hvad er den korrekte syntaks for at ændre feltet value?

question mark

Kan en klasse direkte gemme data?

Select the correct answer

question mark

Hvad er den korrekte syntaks for at ændre feltet value?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 4. Kapitel 5

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

Suggested prompts:

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

book`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

index.cs

copy
1234567891011
using 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

index.cs

copy
12345678910111213141516171819202122232425262728
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); } }

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

index.cs

copy
12345678
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; }

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

index.cs

copy
123456789101112131415161718192021222324252627282930313233343536373839
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 } }

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

index.cs

copy
1234
static void Main() { // code }

1. Kan en klasse direkte gemme data?

2. Hvad er den korrekte syntaks for at ændre feltet value?

question mark

Kan en klasse direkte gemme data?

Select the correct answer

question mark

Hvad er den korrekte syntaks for at ændre feltet value?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 4. Kapitel 5
some-alt