Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Luokkien Konstruktorit | Johdatus Olio-Ohjelmointiin (OOP)
C# Perusteiden Jälkeen

bookLuokkien Konstruktorit

Luokan konstruktori on sama kuin rakennekonstruktori. Se on metodi, joka suoritetaan, kun olio luodaan.

Konstruktori luodaan seuraavalla syntaksilla:

index.cs

index.cs

copy
1234567
class className { // ... other class code public className() { // code } }

Esimerkiksi:

index.cs

index.cs

copy
1234567891011121314151617
using System; class Player { public Player() { Console.WriteLine("A new player is created"); } } public class HelloWorld { public static void Main(string[] args) { Player p1 = new Player(); Player p2 = new Player(); Player p3 = new Player(); } }

Tulosteesta näet, että Console.WriteLine-lause, joka sijaitsee Player-konstruktorissa, suoritetaan aina, kun uusi olio luodaan.

Note
Huomio

C# 9:ssä ja vanhemmissa C#-versioissa on joitakin eroja rakenteiden (struct) ja luokkien (class) konstruktorien välillä. Esimerkiksi vanhemmissa versioissa ei voi luoda parametrittomia konstruktoreita rakenteille, mutta C# 10:ssä ja uudemmissa tämä on tuettu. On suositeltavaa käyttää uusinta C#-kääntäjää, sillä muuten saatat kohdata virheitä koodia käännettäessä.

Seuraava on esimerkkikoodi Rakenne-konstruktorit -luvusta. Termiä static selitetään kommenteissa, koska se on tässä yhteydessä olennaisempi, mutta sitä ei tarvitse ymmärtää täysin, sillä tätä käsitettä käsitellään tarkemmin myöhemmissä osioissa.

Note
Huomio

Toisin kuin tavalliset kentät, static-kenttä voi säilyttää tietoa, vaikka luokan olioita ei olisi olemassa. Staattisilla kentillä on sama arvo kaikille olioille, joten staattisen kentän arvon muuttaminen yhdessä oliossa muuttaa sen kaikissa olioissa. Program-luokka edustaa itse ohjelmaa, joten jos staattinen kenttä on 'Program'-luokan jäsen, se toimii kuin globaali muuttuja.

index.cs

index.cs

copy
1234567891011121314151617181920212223
using System; struct Program { public static int totalPlayers = 0; struct Player { public int id; public Player() { id = totalPlayers++; Console.WriteLine($"New Player Object Created With ID {id}"); } } static void Main(string[] args) { Player player1 = new Player(); Player player2 = new Player(); Player player3 = new Player(); } }

Muuntaaksesi Player-rakenteen luokaksi, sinun tarvitsee vain vaihtaa sana struct sanaan class:

index.cs

index.cs

copy
12345678910111213141516171819202122232425262728
using System; class Program { // Unlike normal fields, a 'static' field can hold data even if there's no object. // Static fields have the same value for all objects. // Changing the value of a static field from one object changes it for all objects. // In this case the static field is part of the 'Program' class which represents the program itself // Therefore this field is essentially a global variable public static int totalPlayers = 0; struct Player { public int id; public Player() { id = totalPlayers++; Console.WriteLine($"New Player Object Created With ID {id}"); } } static void Main(string[] args) { Player player1 = new Player(); Player player2 = new Player(); Player player3 = new Player(); } }

Vastaavasti voit määrittää rakentajia, joilla on myös argumentteja. Tätä menetelmää käytetään yleensä helpottamaan luokan kenttien alustamista:

index.cs

index.cs

copy
12345678910111213141516171819202122232425262728
using System; class Point { public double x; public double y; public Point(double x, double y) { // 'this' keyword is also used in classes just like how its used in structs this.x = x; this.y = y; } public void showCoordinates() { Console.WriteLine($"({x}, {y})"); } } class Program { static void Main(string[] args) { Point p1 = new Point(50, 70); Point p2 = new Point(70, 90); p1.showCoordinates(); p2.showCoordinates(); } }

Tässä vaiheessa olet käynyt läpi suurimman osan luokkien peruskäsitteistä Classes, ja syntaksin sekä käyttäytymisen perusteella Classes vaikuttavat olevan täsmälleen samanlaisia kuin Structs, mutta näin ei kuitenkaan ole. Kuten tämän osion ensimmäisessä luvussa todettiin, rakenteet ovat rajoitettu versio luokista, jotka tarjoavat vain perustoiminnallisuudet, kun taas luokkien ominaisuudet ovat huomattavasti monipuolisemmat ja laajemmat. Tässä osiossa olet käynyt läpi kaikki ominaisuudet, jotka ovat yhteisiä sekä Classes että Structs. Seuraavissa kahdessa osiossa opit kaikki luokkien ja olio-ohjelmoinnin yksityiskohdat.

1. Milloin konstruktori-metodia kutsutaan?

2. Mikä on konstruktorimetodin nimi luokassa nimeltä "Animal"?

3. Mikä avainsana käytetään konstruktorin nimen edessä?

question mark

Milloin konstruktori-metodia kutsutaan?

Select the correct answer

question mark

Mikä on konstruktorimetodin nimi luokassa nimeltä "Animal"?

Select the correct answer

question mark

Mikä avainsana käytetään konstruktorin nimen edessä?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 3. Luku 9

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

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

Suggested prompts:

Can you explain the main differences between classes and structs?

What are some advanced features of classes that structs don't have?

Can you give examples of when to use a class instead of a struct?

Awesome!

Completion rate improved to 2.04

bookLuokkien Konstruktorit

Pyyhkäise näyttääksesi valikon

Luokan konstruktori on sama kuin rakennekonstruktori. Se on metodi, joka suoritetaan, kun olio luodaan.

Konstruktori luodaan seuraavalla syntaksilla:

index.cs

index.cs

copy
1234567
class className { // ... other class code public className() { // code } }

Esimerkiksi:

index.cs

index.cs

copy
1234567891011121314151617
using System; class Player { public Player() { Console.WriteLine("A new player is created"); } } public class HelloWorld { public static void Main(string[] args) { Player p1 = new Player(); Player p2 = new Player(); Player p3 = new Player(); } }

Tulosteesta näet, että Console.WriteLine-lause, joka sijaitsee Player-konstruktorissa, suoritetaan aina, kun uusi olio luodaan.

Note
Huomio

C# 9:ssä ja vanhemmissa C#-versioissa on joitakin eroja rakenteiden (struct) ja luokkien (class) konstruktorien välillä. Esimerkiksi vanhemmissa versioissa ei voi luoda parametrittomia konstruktoreita rakenteille, mutta C# 10:ssä ja uudemmissa tämä on tuettu. On suositeltavaa käyttää uusinta C#-kääntäjää, sillä muuten saatat kohdata virheitä koodia käännettäessä.

Seuraava on esimerkkikoodi Rakenne-konstruktorit -luvusta. Termiä static selitetään kommenteissa, koska se on tässä yhteydessä olennaisempi, mutta sitä ei tarvitse ymmärtää täysin, sillä tätä käsitettä käsitellään tarkemmin myöhemmissä osioissa.

Note
Huomio

Toisin kuin tavalliset kentät, static-kenttä voi säilyttää tietoa, vaikka luokan olioita ei olisi olemassa. Staattisilla kentillä on sama arvo kaikille olioille, joten staattisen kentän arvon muuttaminen yhdessä oliossa muuttaa sen kaikissa olioissa. Program-luokka edustaa itse ohjelmaa, joten jos staattinen kenttä on 'Program'-luokan jäsen, se toimii kuin globaali muuttuja.

index.cs

index.cs

copy
1234567891011121314151617181920212223
using System; struct Program { public static int totalPlayers = 0; struct Player { public int id; public Player() { id = totalPlayers++; Console.WriteLine($"New Player Object Created With ID {id}"); } } static void Main(string[] args) { Player player1 = new Player(); Player player2 = new Player(); Player player3 = new Player(); } }

Muuntaaksesi Player-rakenteen luokaksi, sinun tarvitsee vain vaihtaa sana struct sanaan class:

index.cs

index.cs

copy
12345678910111213141516171819202122232425262728
using System; class Program { // Unlike normal fields, a 'static' field can hold data even if there's no object. // Static fields have the same value for all objects. // Changing the value of a static field from one object changes it for all objects. // In this case the static field is part of the 'Program' class which represents the program itself // Therefore this field is essentially a global variable public static int totalPlayers = 0; struct Player { public int id; public Player() { id = totalPlayers++; Console.WriteLine($"New Player Object Created With ID {id}"); } } static void Main(string[] args) { Player player1 = new Player(); Player player2 = new Player(); Player player3 = new Player(); } }

Vastaavasti voit määrittää rakentajia, joilla on myös argumentteja. Tätä menetelmää käytetään yleensä helpottamaan luokan kenttien alustamista:

index.cs

index.cs

copy
12345678910111213141516171819202122232425262728
using System; class Point { public double x; public double y; public Point(double x, double y) { // 'this' keyword is also used in classes just like how its used in structs this.x = x; this.y = y; } public void showCoordinates() { Console.WriteLine($"({x}, {y})"); } } class Program { static void Main(string[] args) { Point p1 = new Point(50, 70); Point p2 = new Point(70, 90); p1.showCoordinates(); p2.showCoordinates(); } }

Tässä vaiheessa olet käynyt läpi suurimman osan luokkien peruskäsitteistä Classes, ja syntaksin sekä käyttäytymisen perusteella Classes vaikuttavat olevan täsmälleen samanlaisia kuin Structs, mutta näin ei kuitenkaan ole. Kuten tämän osion ensimmäisessä luvussa todettiin, rakenteet ovat rajoitettu versio luokista, jotka tarjoavat vain perustoiminnallisuudet, kun taas luokkien ominaisuudet ovat huomattavasti monipuolisemmat ja laajemmat. Tässä osiossa olet käynyt läpi kaikki ominaisuudet, jotka ovat yhteisiä sekä Classes että Structs. Seuraavissa kahdessa osiossa opit kaikki luokkien ja olio-ohjelmoinnin yksityiskohdat.

1. Milloin konstruktori-metodia kutsutaan?

2. Mikä on konstruktorimetodin nimi luokassa nimeltä "Animal"?

3. Mikä avainsana käytetään konstruktorin nimen edessä?

question mark

Milloin konstruktori-metodia kutsutaan?

Select the correct answer

question mark

Mikä on konstruktorimetodin nimi luokassa nimeltä "Animal"?

Select the correct answer

question mark

Mikä avainsana käytetään konstruktorin nimen edessä?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 3. Luku 9
some-alt