T1
Syötteen tarkistus
TryParse tarkistaa, voidaanko käyttäjän syöte muuntaa kokonaisluvuksi ennen kuin ohjelma käyttää arvoa. Sama periaate auttaa käsittelemään virheellisiä syötteitä hallitusti.
if (int.TryParse(input, out int score))
{
Console.WriteLine($"Pisteet: {score}");
}
else
{
Console.WriteLine("Anna kelvollinen numero.");
}
T6
Luokka ja ominaisuudet
Saunan kiukaan harjoituksessa mallinnetaan laitteen tilaa ominaisuuksilla ja metodilla. Käyttöliittymän tulostukset kannattaa pitää erillään luokan toiminnasta, jotta luokkaa voi käyttää uudelleen.
public class SaunaHeater
{
public bool IsOn { get; set; }
public int Temperature { get; set; }
public int Humidity { get; set; }
public string GetStatus()
{
return $"On: {IsOn}, " +
$"temperature: {Temperature}";
}
}
T9
Konstruktori ja ToString
Vehicle-luokka kokoaa ajoneuvon tiedot yhteen. Konstruktori alustaa olion, ja ToString-ylikirjoitus määrittelee, miten olio esitetään tekstinä.
public class Vehicle
{
public string Brand { get; set; }
public string Model { get; set; }
public int Speed { get; set; }
public Vehicle(string brand, string model)
{
Brand = brand;
Model = model;
}
public override string ToString() =>
$"{Brand} {Model}, {Speed} km/h";
}
T10
Oliot kokoelmassa
Student-tehtävässä luodaan opiskelijaolioita, lisätään ne List-kokoelmaan ja käsitellään niitä silmukalla. Esimerkki näyttää, miten samantyyppisiä olioita voidaan hallita yhdessä.
var students = new List<Student>
{
new Student("Alex", 102),
new Student("Robin", 205),
new Student("Sam", 118)
};
students.Sort((a, b) =>
a.StudentNumber.CompareTo(b.StudentNumber));
foreach (Student student in students)
{
Console.WriteLine(student.ShowInfo());
}
T13
Ehtojen tarkistus luokassa
Hissi-esimerkissä GoTo-metodi tarkistaa kerrosnumeron ennen tilan muuttamista. Metodi palauttaa onnistumisen ja viestin, joten kutsuva ohjelma voi reagoida tulokseen.
public bool GoTo(int floor, out string message)
{
if (floor < 1 || floor > 5)
{
message = "Kerros ei ole sallittu.";
return false;
}
CurrentFloor = floor;
message = $"Hissi on kerroksessa {floor}.";
return true;
}
T15
Perintä ja uudelleenkäyttö
Boss perii Employee-luokan yhteiset ominaisuudet ja kutsuu kantaluokan konstruktoria base-avainsanalla. Näin yhteistä koodia ei tarvitse kirjoittaa uudelleen.
public class Employee
{
public string Name { get; set; }
public double Salary { get; set; }
public Employee(string name, double salary)
{
Name = name;
Salary = salary;
}
}
public class Boss : Employee
{
public double Bonus { get; set; }
public Boss(string name, double salary, double bonus)
: base(name, salary)
{
Bonus = bonus;
}
}
T20
Abstrakti luokka ja ylikirjoitus
Mammal-tehtävässä abstrakti kantaluokka määrittelee yhteisen Move-metodin sopimuksen. Johdetut luokat toteuttavat toiminnan eri tavoin override-avainsanalla.
public abstract class Mammal
{
public int Age { get; set; }
public abstract string Move();
}
public class Human : Mammal
{
public override string Move() => "Walking";
}
public class Baby : Human
{
public override string Move() => "Crawling";
}
T23
Rajapinta ja jono
CheckoutQueue toteuttaa ICheckoutQueue-rajapinnan ja kapseloi jonon käsittelyn. Rajapinta määrittelee, mitä toimintoja jonon käyttäjä voi kutsua.
public interface ICheckoutQueue
{
void Join(string customer);
string? Leave();
int Length { get; }
}
public class CheckoutQueue : ICheckoutQueue
{
private readonly Queue<string> queue = new();
public int Length => queue.Count;
public void Join(string customer) => queue.Enqueue(customer);
public string? Leave() =>
queue.Count > 0 ? queue.Dequeue() : null;
}
T24
Olioiden koostaminen
Vehicle sisältää Tire-olioita listassa. Koostaminen kuvaa, miten isompi kokonaisuus rakentuu erillisistä olioista ja miten niiden tietoja voidaan käsitellä yhdessä.
public class Tire
{
public string Manufacturer { get; set; } = "";
public string Model { get; set; } = "";
}
public class Vehicle
{
public string Name { get; set; }
public List<Tire> Tires { get; } = new();
public Vehicle(string name) => Name = name;
}
// Add a tyre to a vehicle:
vehicle.Tires.Add(tire);
T29–T30
Rajapinta ja eri toteutukset
ITransaction määrittelee yhteisen toiminnan maksutavoille. Käteis- ja korttimaksu voivat toteuttaa saman rajapinnan omalla logiikallaan. Sama ajatus näkyy ICourse-rajapinnan ja Course-luokan harjoituksessa.
public interface ITransaction
{
string ShowTransaction();
decimal Amount { get; }
}
public class CardPayment : ITransaction
{
public decimal Amount { get; }
public CardPayment(decimal amount) => Amount = amount;
public string ShowTransaction() =>
$"Card payment: {Amount:0.00}";
}