Nø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
1234567891011using 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
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 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
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å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
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 } }
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
1234static void Main() { // code }
1. Kan en klasse lagre data direkte?
2. Hva er riktig syntaks for å endre feltet value
?
Takk for tilbakemeldingene dine!
Spør AI
Spør AI
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
Nø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
1234567891011using 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
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 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
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å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
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 } }
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
1234static void Main() { // code }
1. Kan en klasse lagre data direkte?
2. Hva er riktig syntaks for å endre feltet value
?
Takk for tilbakemeldingene dine!