`Static`-avainsana
Tärkeä avainsana, johon olet saattanut törmätä jo useita kertoja, on static
-avainsana. C# Basics Course -kurssilla mainittiin, että static
-avainsanaa käytetään määriteltäessä globaalimuuttujia – muuttujia, jotka ovat minkä tahansa tietyn metodin ulkopuolella:
index.cs
1234567891011using System; class ConsoleApp { static int val = 10; static void Main() { Console.WriteLine($"The value is {val}"); } }
Tämä oli tuolloin kätevä tapa kuvata static
-avainsanaa, koska oletettiin, ettei lukijalla vielä ollut tietoa olioista tai luokista. Nyt kun tarkastelet koodia, saatat kuitenkin huomata, että val
on pohjimmiltaan kenttä ConsoleApp
-luokassa. Huomaa kuitenkin, että ConsoleApp
-luokka eroaa hieman tavanomaisesti luomistasi luokista. Tämä johtuu siitä, että ConsoleApp
edustaa itse ohjelmaa, eikä siitä ole olemassa oliota ConsoleApp
. Palaat tähän kohtaan myöhemmin.
Koska luokka on vain suunnitelma, eräänlainen tyhjä kuori, se ei normaalisti sisällä tietoa itsessään, vaan luot olioita tämän suunnitelman avulla ja tallennat sekä käsittelet tietoa näiden olioiden kautta – kuten aiemmin on selitetty:
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); } }
Jopa luokan sisällä, kun käytät näitä kenttiä, käytät niitä olion kautta. Esimerkiksi konstruktorissa käytät pohjimmiltaan tietoja, jotka välitti olio, joka kutsui konstruktorimetodia:
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; }
Samoin myös muissa metodeissa, kun käytät kenttiä, käytät käytännössä niiden olioiden kenttiä, jotka kutsuvat näitä metodeja, etkä itse luokan kenttiä, koska luokalla ei normaalisti ole omaa dataa.
On kuitenkin olemassa tapa tallentaa tietoa suoraan luokkaan ja tehdä ominaisuus saataville ilman, että tarvitsee luoda oliota. Tämä onnistuu tekemällä kentästä tai metodista 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 } }
Koska ConsoleApp
tai minkä tahansa ohjelman pääluokka, joka edustaa itse ohjelmaa, ei voi sisältää olioita, niiden metodit ja kentät täytyy määritellä staattisiksi. Tästä syystä myös Main
-metodi on static
:
index.cs
1234static void Main() { // code }
1. Voiko luokka tallentaa tietoa suoraan?
2. Mikä on oikea syntaksi value
-kentän muuttamiseen?
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
Awesome!
Completion rate improved to 2.04
`Static`-avainsana
Pyyhkäise näyttääksesi valikon
Tärkeä avainsana, johon olet saattanut törmätä jo useita kertoja, on static
-avainsana. C# Basics Course -kurssilla mainittiin, että static
-avainsanaa käytetään määriteltäessä globaalimuuttujia – muuttujia, jotka ovat minkä tahansa tietyn metodin ulkopuolella:
index.cs
1234567891011using System; class ConsoleApp { static int val = 10; static void Main() { Console.WriteLine($"The value is {val}"); } }
Tämä oli tuolloin kätevä tapa kuvata static
-avainsanaa, koska oletettiin, ettei lukijalla vielä ollut tietoa olioista tai luokista. Nyt kun tarkastelet koodia, saatat kuitenkin huomata, että val
on pohjimmiltaan kenttä ConsoleApp
-luokassa. Huomaa kuitenkin, että ConsoleApp
-luokka eroaa hieman tavanomaisesti luomistasi luokista. Tämä johtuu siitä, että ConsoleApp
edustaa itse ohjelmaa, eikä siitä ole olemassa oliota ConsoleApp
. Palaat tähän kohtaan myöhemmin.
Koska luokka on vain suunnitelma, eräänlainen tyhjä kuori, se ei normaalisti sisällä tietoa itsessään, vaan luot olioita tämän suunnitelman avulla ja tallennat sekä käsittelet tietoa näiden olioiden kautta – kuten aiemmin on selitetty:
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); } }
Jopa luokan sisällä, kun käytät näitä kenttiä, käytät niitä olion kautta. Esimerkiksi konstruktorissa käytät pohjimmiltaan tietoja, jotka välitti olio, joka kutsui konstruktorimetodia:
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; }
Samoin myös muissa metodeissa, kun käytät kenttiä, käytät käytännössä niiden olioiden kenttiä, jotka kutsuvat näitä metodeja, etkä itse luokan kenttiä, koska luokalla ei normaalisti ole omaa dataa.
On kuitenkin olemassa tapa tallentaa tietoa suoraan luokkaan ja tehdä ominaisuus saataville ilman, että tarvitsee luoda oliota. Tämä onnistuu tekemällä kentästä tai metodista 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 } }
Koska ConsoleApp
tai minkä tahansa ohjelman pääluokka, joka edustaa itse ohjelmaa, ei voi sisältää olioita, niiden metodit ja kentät täytyy määritellä staattisiksi. Tästä syystä myös Main
-metodi on static
:
index.cs
1234static void Main() { // code }
1. Voiko luokka tallentaa tietoa suoraan?
2. Mikä on oikea syntaksi value
-kentän muuttamiseen?
Kiitos palautteestasi!