C#-perusteet jatkuvat - luento 2
- Luentotaltiointi
- ref, out ja params
- Properties
- Indeksoija
- enum
- Struct vs Class / arvotyypit vs referenssityypit
- Poikkeukset
- Debuggaus
- Avustus
- Lisätietoa
Jatketaan C#-perusteiden parissa ja ehkä tehdään ensimmäinen silmäys graafisiin käyttöliittymiin.
using System;
namespace hello
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
// Alternative syntax
int[] array3 = { 1, 2, 3, 4, 5, 6 };
foreach (int apu in array3) {
Console.WriteLine(apu);
}
Henkilo tommi = new Henkilo("Tommi", "Lahtonen");
tommi.Tulosta();
Duunari antti = new Duunari("Antti", "Ekonoja", "yliopistonopettaja");
antti.Tulosta();
Henkilo[] taulukko = { tommi, antti };
foreach (Henkilo p in taulukko)
{
p.Tulosta();
}
antti.ika = -5;
antti.Tulosta();
antti.ika = 25;
antti.Tulosta();
Console.ReadKey();
}
}
}
public class Henkilo
{
protected string etunimi;
protected string sukunimi;
// entä private?
// private string etunimi;
// private string sukunimi;
public Henkilo()
{
etunimi = "Matti";
sukunimi = "Meikäläinen";
}
public Henkilo(string etu, string suku)
{
etunimi = etu;
sukunimi = suku;
}
// entäs virtual?
// public virtual void Tulosta()
// entäs static?
public void Tulosta()
{
Console.WriteLine(this.etunimi);
Console.WriteLine(this.sukunimi);
}
~Henkilo()
{
Console.WriteLine(this.etunimi + " " + this.sukunimi + " dies");
}
}
public class Duunari : Henkilo
{
private string tehtava;
public Duunari(string etu, string suku, string tehtava)
// public Duunari(string etu, string suku, string tehtava)
// : base(etu, suku)
{
this.etunimi = etu;
this.sukunimi = suku;
this.tehtava = tehtava;
}
// mitäs jos new korvataan sanalla override?
// public override void Tulosta()
public new void Tulosta()
{
base.Tulosta();
Console.WriteLine(this.tehtava);
Console.WriteLine(ika);
}
// properties... setters ja getters
private int m_ika = 20;
public int ika
{
get
{
return m_ika;
}
set
{
if (value> 0) m_ika = value;
}
}
}
ref, out ja params
using System;
class Testi
{
public static void Main()
{
string nimi = "Tommi Lahtonen";
Console.WriteLine(nimi);
VaihdaNimiEiToimi(nimi);
Console.WriteLine(nimi);
VaihdaNimi(ref nimi);
Console.WriteLine(nimi);
string vesa;
AnnaNimi(out vesa);
Console.WriteLine(vesa);
TulostaNimet(nimi, vesa);
Console.ReadKey();
}
public static void VaihdaNimiEiToimi(string n)
{
n = "Lammi Tohtonen"; // tämä ei toimi
}
public static void VaihdaNimi(ref string n)
{
n = "Lammi Tohtonen";
}
public static void AnnaNimi(out string n)
{
// Console.WriteLine(n); // ei toimi!
n = "Vesa Lappalainen";
}
public static void TulostaNimet(params string[] nimet)
{
foreach (string n in nimet)
{
Console.WriteLine("Nimi: {0}", n);
}
}
Properties
Käyttämällä propertyja on helppo hoitaa tiedon kapselointi:
private int m_ika = 20;
public int ika
{
get
{
return m_ika;
}
set
{
if (value> 0) m_ika = value;
}
Indeksoija
Indeksoija (indexer) on taulukkovastine propertyille
class taulukko
{
private string[] data;
public taulukko(int koko)
{
data = new string[koko];
for (int i=0; i < koko; i++)
{
data[i] = "-";
}
}
public string this[int i]
{
get
{
return data[i];
}
set
{
data[i] = value;
}
}
static void Main()
{
int koko = 10;
taulukko taul = new taulukko(koko);
taul[1] = "Eka";
taul[2] = "Toka";
taul[3] = "Kolmas";
for (int i=0; i < koko; i++)
{
Console.WriteLine("taul[{0}]: {1}", i, taul[i]);
}
}
}
enum
public enum VIIKKO {
Maanantai, // saa arvon 0
Tiistai, // saa arvon 1
Keskiviikko, // jne.
Torstai,
Perjantai,
Lauantai,
Sunnuntai
}
// voidaan tehdä myös näin:
public enum VIIKKO {
Maanantai = 1,
Tiistai = 2,
Keskiviikko = 3,
Torstai = 4,
Perjantai = 5,
Lauantai = 6,
Sunnuntai = 7
}
VIIKKO paiva = Tiistai;
if ( paiva == VIIKKO.Torstai ) ...
Struct vs Class / arvotyypit vs referenssityypit
What are the differences between a class and a structure in C# language?
using System;
/// <summary>
/// esimerkki kloonattu C# Station-sivustolta
/// </summary>
class Employee
{
private string m_name;
public string Name
{
get { return m_name; }
set { m_name = value; }
}
}
struct Duunari
{
private string m_name;
public string Name
{
get { return m_name; }
set { m_name = value; }
}
}
class Program
{
static void Main()
{
Employee joe = new Employee();
joe.Name = "Joe";
Employee bob = new Employee();
bob.Name = "Bob";
Console.WriteLine("Original Employee Values:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
// kopioidaan bobiin referenssi joen tietoihin
bob = joe;
Console.WriteLine();
Console.WriteLine("Values After Reference Assignment:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
joe.Name = "Bobbi Jo";
Console.WriteLine();
Console.WriteLine("Values After Changing One Instance:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
Console.ReadKey();
Duunari joe2 = new Duunari();
joe2.Name = "Joe";
Duunari bob2 = new Duunari();
bob2.Name = "Bob";
Console.WriteLine("Original Duunari Values:");
Console.WriteLine("joe = " + joe2.Name);
Console.WriteLine("bob = " + bob2.Name);
// Kopioidaan joen tiedot bobiin
bob2 = joe2;
Console.WriteLine();
Console.WriteLine("Values After Value Assignment:");
Console.WriteLine("joe = " + joe2.Name);
Console.WriteLine("bob = " + bob2.Name);
joe2.Name = "Bobbi Jo";
Console.WriteLine();
Console.WriteLine("Values After Changing One Instance:");
Console.WriteLine("joe = " + joe2.Name);
Console.WriteLine("bob = " + bob2.Name);
Console.ReadKey();
}
}
Copying, Cloning, and Marshalling in .NET
Poikkeukset
using System;
using System.IO;
namespace testi
{
class Poikkeukset
{
public static void Main()
{
try
{
using (StreamReader sr = new StreamReader("Testi.txt"))
{
string line;
while ((line = sr.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
}
catch (Exception e) // napataan kiinni kaikki virhetilanteet
{
Console.WriteLine("Tiedostoa ei saada avattua:");
Console.WriteLine(e.Message);
}
try
{
int luku1 = 5;
int luku2 = 0;
int tulos = luku1 / luku2;
throw new System.Exception("foobar"); // aiheutetaan itse virhe
}
catch (System.DivideByZeroException e)
{
Console.WriteLine("Yritettiin jakaa nollalla");
}
catch (Exception e) // napataan kiinni kaikki virhetilanteet
{
Console.WriteLine(e.Message);
}
finally // suoritetaan aina
{
Console.ReadKey();
}
}
}
}
Design Guidelines for Exceptions
Debuggaus
Breakpointin voi asettaa hiirellä kontekstivalikosta tai suoraan napauttamalla koodi-ikkunan vasenta laitaa.
Debug-valikosta löytyvät tarpeelliset toiminnot.
Avustus
.NET-kirjastojen avustus löytyy parhaiten MSDN-sivuilta. Esim:
Sama pätee C#-ohjeisiin. Esim:
Reading From a Text File (Visual C#)

Käyttäjien kommentit