Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele `Static`-avainsana | OOP:n Perusteet
C# Perusteiden Jälkeen

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

index.cs

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

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

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

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

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

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

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

index.cs

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

1. Voiko luokka tallentaa tietoa suoraan?

2. Mikä on oikea syntaksi value-kentän muuttamiseen?

question mark

Voiko luokka tallentaa tietoa suoraan?

Select the correct answer

question mark

Mikä on oikea syntaksi value-kentän muuttamiseen?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 4. Luku 5

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Awesome!

Completion rate improved to 2.04

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

index.cs

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

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

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

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

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

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

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

index.cs

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

1. Voiko luokka tallentaa tietoa suoraan?

2. Mikä on oikea syntaksi value-kentän muuttamiseen?

question mark

Voiko luokka tallentaa tietoa suoraan?

Select the correct answer

question mark

Mikä on oikea syntaksi value-kentän muuttamiseen?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 4. Luku 5
some-alt