Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Nøkkelordet `static` | OOP-Grunnprinsipper
C# Utover Det Grunnleggende

bookNøkkelordet `static`

Et viktig nøkkelord som du kanskje allerede har støtt på mange ganger, er static-nøkkelordet. I C# Grunnkurs ble det nevnt at static brukes når man definerer globale variabler – variabler som er utenfor en spesifikk metode:

index.cs

index.cs

copy
1234567891011
using System; class ConsoleApp { static int val = 10; static void Main() { Console.WriteLine($"The value is {val}"); } }

Dette var en praktisk måte å beskrive static-nøkkelordet på den tiden, fordi det var forventet at leseren kanskje ikke hadde noen kunnskap om objekter eller klasser på det tidspunktet. Men nå, hvis du ser på koden, vil du kanskje innse at val egentlig er et felt i ConsoleApp-klassen. Merk imidlertid at ConsoleApp-klassen er litt annerledes enn klassene du vanligvis lager. Dette er fordi ConsoleApp representerer selve programmet, og det finnes ikke noe objekt av ConsoleApp. Du kommer tilbake til denne delen om litt.

Siden en klasse kun er en blåkopi, mer som et tomt skall, inneholder den vanligvis ikke data i seg selv. I stedet oppretter du objekter ved hjelp av denne blåkopien og lagrer og får tilgang til data fra disse objektene – som tidligere forklart:

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 inne i en klasse, når du får tilgang til disse feltene, gjør du det gjennom et objekt. For eksempel i en konstruktør bruker du i hovedsak dataene som ble sendt inn av objektet som kalte 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åte, i andre metoder også, når du får tilgang til felt, får du egentlig tilgang til feltene til objektene som kaller disse metodene, og ikke til selve klassen fordi en klasse vanligvis ikke inneholder noen data.

Det finnes imidlertid en måte å lagre data direkte i en klasse og gjøre en egenskap tilgjengelig uten å måtte opprette et objekt. Du kan gjøre dette ved ganske enkelt å gjøre det feltet eller den 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 } }

Siden ConsoleApp eller hovedklassen til et hvilket som helst program som representerer selve programmet ikke kan ha noen objekter, må du gjøre metodene og feltene deres statiske. Dette er grunnen til at Main-metoden også er static:

index.cs

index.cs

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

1. Kan en klasse lagre data direkte?

2. Hva er riktig syntaks for å endre feltet value?

question mark

Kan en klasse lagre data direkte?

Select the correct answer

question mark

Hva er riktig syntaks for å endre feltet value?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 4. Kapittel 5

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

Awesome!

Completion rate improved to 2.04

bookNøkkelordet `static`

Sveip for å vise menyen

Et viktig nøkkelord som du kanskje allerede har støtt på mange ganger, er static-nøkkelordet. I C# Grunnkurs ble det nevnt at static brukes når man definerer globale variabler – variabler som er utenfor en spesifikk metode:

index.cs

index.cs

copy
1234567891011
using System; class ConsoleApp { static int val = 10; static void Main() { Console.WriteLine($"The value is {val}"); } }

Dette var en praktisk måte å beskrive static-nøkkelordet på den tiden, fordi det var forventet at leseren kanskje ikke hadde noen kunnskap om objekter eller klasser på det tidspunktet. Men nå, hvis du ser på koden, vil du kanskje innse at val egentlig er et felt i ConsoleApp-klassen. Merk imidlertid at ConsoleApp-klassen er litt annerledes enn klassene du vanligvis lager. Dette er fordi ConsoleApp representerer selve programmet, og det finnes ikke noe objekt av ConsoleApp. Du kommer tilbake til denne delen om litt.

Siden en klasse kun er en blåkopi, mer som et tomt skall, inneholder den vanligvis ikke data i seg selv. I stedet oppretter du objekter ved hjelp av denne blåkopien og lagrer og får tilgang til data fra disse objektene – som tidligere forklart:

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 inne i en klasse, når du får tilgang til disse feltene, gjør du det gjennom et objekt. For eksempel i en konstruktør bruker du i hovedsak dataene som ble sendt inn av objektet som kalte 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åte, i andre metoder også, når du får tilgang til felt, får du egentlig tilgang til feltene til objektene som kaller disse metodene, og ikke til selve klassen fordi en klasse vanligvis ikke inneholder noen data.

Det finnes imidlertid en måte å lagre data direkte i en klasse og gjøre en egenskap tilgjengelig uten å måtte opprette et objekt. Du kan gjøre dette ved ganske enkelt å gjøre det feltet eller den 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 } }

Siden ConsoleApp eller hovedklassen til et hvilket som helst program som representerer selve programmet ikke kan ha noen objekter, må du gjøre metodene og feltene deres statiske. Dette er grunnen til at Main-metoden også er static:

index.cs

index.cs

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

1. Kan en klasse lagre data direkte?

2. Hva er riktig syntaks for å endre feltet value?

question mark

Kan en klasse lagre data direkte?

Select the correct answer

question mark

Hva er riktig syntaks for å endre feltet value?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 4. Kapittel 5
some-alt