C#-perusteet jatkuvat - luento 2

Luentotaltiointi

Ääni valitettavasti puuttuu videosta

Ongelmia videon katselussa?

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

    }
}

Topics on C# Type

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:

Console Members

StreamReader Class

Sama pätee C#-ohjeisiin. Esim:

Reading From a Text File (Visual C#)

Lisätietoa

Käyttäjien kommentit

Kommentoi tätä sivua Lisää uusi kommentti
Kurssimateriaalien käyttäminen kaupallisiin tarkoituksiin tai opetusmateriaalina ilman lupaa on ehdottomasti kielletty!
http://appro.mit.jyu.fi/gko/luennot/luento2/
© Antti Ekonoja (antti.j.ekonoja@jyu.fi) <http://users.jyu.fi/~anjoekon/>
Tommi Lahtonen (tommi.j.lahtonen@jyu.fi) <http://hazor.iki.fi/>
Jukka Mäntylä (jmantyla@iki.fi) <http://www.iki.fi/jmantyla/>
2010-10-04 16:03:55
Informaatioteknologia - Jyväskylän yliopiston informaatioteknologian tiedekunta