ŚciągaCzęść NR.23Kurs dobiegł końca. Przyszedł czas na podsumowanie jego zawartości w pigułce. W sumie w tym kursie chciałem napisać jeszcze o innych rzeczach jak: indeksery , tworzenie własnych kolekcji od <T> czy jak efektywnie korzystać z innych słów kluczowych. Kurs jednak zrobił się za długi i nawet jego nazwa “obiektowość” nie jest do końca już trafna.

 

Na początku chciałem omówić podstawowe zagadnienia, jak interfejsy i klasy abstrakcyjne, ale w zapale pisania omówiłem również zagadnienia, które niekoniecznie pasują do obiektowości.

Postanowiłem też przeskanować wpisy z tego kursu, ponieważ piszę bloga od 4 miesięcy i błędy się zdarzają, choćby z braku doświadczenia. Szkoda ,że mimo iż wiele osób je czyta nikt mi tych małych błędów nie wykaże. No cóż, dla potrzeb lepszego bloga na razie zostawię nowe wpisy w spokoju. A tak serio to naprawdę chciałbym ruszyć do przodu, mam już trochę tego dosyć. Mam tyle projektów w tyle na tym blogu. Nikt jednak nie mówił ,że będzie to łatwe. Zapomniałem też o tym ,że zmieniłem trochę styl bloga ,więc muszę teraz sprawdzić każdym wpis na blogu. Jeśli przeczytałeś ten kurs od początku do końca to gratuluje ponieważ w 90% omówiłem tutaj najważniejsze zagadnienia języka C#. A i mnie się przyda to małe odświeżenie wiedzy. Rozumiem ,że może się wydawać ,że ta wiedza jest nieprzydatna. Znajomość tych zagadnień bardziej się opłaca niż wiedza o: WPF ,ASP.NET czy Silverlight-a. Tak jak powiedziałem wcześniej czas na wielkie podsumowanie.

Oto lista jak napisać “X” w C#".

01 : Klasy i obiekty

ZadanieWykonanie:
Deklarowanie klasyNapisz słowo kluczowe class, potem napisz nazwę klasy, a później nawiasy klamrowe. Wewnątrz nawiasów deklarujesz pola, właściwości i metody tej właśnie klasy.
class Kwadrat 
{
   
}
Deklarowanie konstruktoraNapisz metodę, której nazwa jest taka sama jak nazwa klasy. Metoda ta nic nie zwraca, nawet void.
class Kwadrat 
{
    public Kwadrat(int bokA)
    {
        //kod 
    }
}
Wywołanie konstruktoraUżywając słowa kluczowego “new” wywołujesz konstruktor wraz z odpowiednimi parametrami.
Kwadrat kw = new Kwadrat(200);

 

02 : Klasa statyczna i anonimowa

ZadanieWykonanie:
Deklarowanie statycznej klasyUżyj słowa ‘static’ przed słowem ‘class’. Klasa statyczna może mieć tylko pola i metody statyczne.
static class Obliczenia 
{

}
Deklarowanie statycznej metodyNapisz słowo ‘static’ przed deklaracją metody.
class Kwadrat 
{
   public static int KontKwadratu()
   {}
}
Wywołanie statycznej metodyNapisz nazwę klasy po czym postaw kropkę i napisz nazwę metody. Statyczna metoda nie potrzebuje zainicjowanego obiektu.
int a = Kwadrat.KontKwadratu();
Deklarowanie pola statycznegoPonowne użycie słowa ‘static’ przed deklaracją pola:
private static int Kont;
Deklarowanie stałych pólNapisz słowo kluczowe ‘const’ przed deklaracją pola. Nie trzeba pisać słowa ‘static’ ponieważ pole to już jest statyczne.
class Koło {
    public const double PI = 3.14;
}
Dostęp do stałych pólUżycie pola stałego wygląda identycznie jak użycia pola statecznego.
int promien = 3;
double pole = Koło.PI * promien * promien; 
Statyczny konstruktorStatyczny konstruktor wywołuje się w trakcie uruchomienia programu. Może on operować tylko na stałych polach. Rzadko się z niego korzysta.
class Osoba 
{
    static Osoba()
    {
        Name = "Stefan";
    }
    private static string Name; 
}
Tworzenie anonimowej klasyKlasy anonimowe spełniają cele w wyrażeniach LINQ. Nie mają one nazwy. Klasy anonimowe mogą posiadać tylko pola publiczne .Wszystkie te pola muszą być zainicjowane . Żadne pola nie mogą być statyczne. Nie mogą zawierać metod.
var AnonimowyObiekt = new { Name = "Zdzisław", age = "23" };

 

03 : Typ referencyjny typ wartościowy i pamięć

ZadanieWykonanie:
Skopiowanie typu wartościowegoPrzyrównanie w typach wartościowych kopiuje wartość. Dwie zmienne wtedy będą miały kopię tej samej wartości.

image
Skopiowanie referencji pomiędzy zmiennymiZmienne poniżej są typami referencyjnymi co oznacza ,że w wyniku przyrównania dwie zmienne będą się referować do tego samego obiektu.
Kwadrat kwadrat = new Kwadrat(200);
Kwadrat refKwadrat = kwadrat;

 

04 : Wartości Null i typy Nullable

ZadanieWykonanie:
Deklarowanie zmiennej , która przetrzymuje również wartość nullZadeklaruj zmienną i dodaj modyfikator ‘?’ po typie bez spacji.
bool? logic = null;
Jak sprawdzić czy zmienna nullable ma jakąś wartość.
if (!logic.HasValue)
    logic = true;
if (logic != null)
    logic = true;

 

05 : REF OUT Przekazywanie parametrów dla metody

ZadanieWykonanie:
Przekaż argument jako parametr refPrzed argumentem użyj słowa ‘ref’. To sprawia ,że parametr jest traktowany jak alias do prawdziwego argumentu więc nie operuje na jego kopii. Metoda, jeśli zmieni ten parametr to zmiana dotyczy też faktycznego argumentu.
static void Main(string[] args)
{
    int argument = 121;
    Metoda(ref argument);
    Console.WriteLine(argument);
    Console.ReadKey();
}

static void Metoda(ref int parametr)
{
    parametr *= 10;
}
Przekaż argument jako parametr outPrzed argumentem użyj słowa‘out’. To sprawia ,że parametr jest tak jak w poprzednim przypadku traktowany, jak alias. Metoda musi przypisać parametrowi ‘out’ jakąś wartość. Argument nie może mieć przypisanej wartości przed umieszczeniem jej do metody.
static void Main(string[] args)
{
    int argument;
    Metoda(out argument);
    Console.WriteLine(argument);
    Console.ReadKey();
}

static void Metoda(out int parametr)
{
    parametr = 121;
}

 

06 : System.Object boxing i unboxing, rzutowanie

ZadanieWykonanie:
Pakowanie wartościZainicjuj albo przypis zmienną do typu object.
object obiekt = 121;
Wypakowywanie wartościWykonaj rzutowanie na referencji obiektu, która ma zapakowaną wartość danego typu.
int a = (int)obiekt;
Wykonaj bezpieczne rzutowanieDo wyboru są dwa słowa kluczowe ‘is’i‘as’. Operator ‘is’ sprawdza czy dany obiekt może być rzutowany na dany typ.

Operator ‘as’ wywołuje rzutowanie. Jeśli rzutowanie się nie powiodło rezultat jest pusty (null)
object obiekt = 121;
if (obiekt is int)
{
    int a = (int)obiekt;
}
object obiekt = 121;
int? a = obiekt as int?;

 

07 : Typ wyliczeniowy

ZadanieWykonanie:
Zadeklarowanie typu wyliczeniowegoNapisz słowo kluczowe ‘enum’ potem jego nazwę ,później w nawiasach klamrowych zadeklaruj listę wartości tego typu wyliczeniowego.
enum PoryRoku {
    Wiosna,Lato,Jesień,Zima
}
Zadeklarowanie zmiennej typu wyliczeniowegoTak jak z deklaracją innych zmiennych trzeba napisać typ przed nazwą zmiennej.
PoryRoku poryRoku;
Przypisanie wartośćNapisz nazwę typu wartościowego po czym po kropce wybierz wartość, którą chcesz przypisać.
PoryRoku poryRoku = PoryRoku.Lato;

 

08 : Struktura i Klasa różnice

ZadanieWykonanie:
Deklarowanie strukturyTutaj pojawia się słowo kluczowe ‘struct’ . Analogicznie do deklaracji klasy potem musisz napisać nazwę struktury ,a później jej ciało w nawiasach klamrowych.
struct CzasPracy {
    public CzasPracy(int g,int m)
    {}
    private int godzina, minuty;
}
Deklarowanie strukturyNapisz nazwę typu struktury po czym napis nazwę zmiennej.
CzasPracy czasPrac;
Inicjowanie zmiennej struktury i nadanie jej wartościWywołaj konstruktor struktury aby ją zainicjować. Chociaż struktura może być używana bez niego, ale nie jest to zalecane.
CzasPracy czasPrac = new CzasPracy(1, 40);

 

09 : Tablice

ZadanieWykonanie:
Deklarowanie zmiennej tablicyNapisz nazwę typu po czym bez spacji dodaj do tego typu nawiasy kwadratowe. Teraz standardowo napisz nazwę swojej zmiennej.
int[] liczby;
Tworzenie instancji tablicyNapisz słowo kluczowe "new", potem typ tablicy ,a później określ jej rozmiar w nawiasach kwadratowych.
int[] liczby = new int[5] ;
Tworzenie instancji tablicy z gotowymi wartościamiAby zadeklarować listę gotowych wartości w tablicy wystarczy użyć nawiasu klamrowego w ten sposób.
int[] liczby =  {1,2,3,4,5};
Znaleźć liczbę elementów w tablicyDo określenia liczby elementów w tablicy używaj właściwości Length .
int elementy = liczby.Length;
Uzyskaj dostęp do pojedynczego elementu w tablicy.Napisz nazwę tablicy po czym w nawiasach kwadratowych napisz liczbę całkowitą, która reprezentuje indeks elementu w tablicy. W C# tablice zaczynają się od zera nie od jedynki.
int elementy = liczby[0];
int b = liczby[2];
Wykonaj iteracje przez wszystkie elementy w tablicyDo wyboru jest pętla for albo pętla foreach.
int[] liczby =  {1,2,3,4,5};

for (int i = 0; i < liczby.Length; i++)
{
    Console.WriteLine(liczby[i]);
}
foreach (var item in liczby)
{
    Console.WriteLine(item);
}
Zadeklaruj i użyj tablicy wielowymiarowej
int[,] elementy = new int[10, 8];

elementy[0, 0] = 121;
elementy[9, 7] = 999;
elementy[5, 5] = elementy[0, 0];
elementy[5, 6]++;
elementy[5, 7] = elementy[9, 7]++;
elementy[5, 7] -= 199;

for (int i = 0; i < 10; i++)
{
    for (int j = 0; j < 8; j++)
    {
        elementy[i, j] = elementy[5, 7]+ 
            elementy[0,0] + elementy[9,7] 
            - elementy[5,6] - elementy[5,5];
    }
}

 

10 : Kolekcje klas System.Collections

ZadanieWykonanie:
Zadeklaruj klasę z System.Collection i dodaj do niej jeden element.
ArrayList al = new ArrayList();
al.Add("Napis");

Hashtable ht = new Hashtable();
ht.Add("Mortal Kombat",1992);

SortedList sl = new SortedList();
sl.Add("Defender of Crown", 1988);

 

11 : Dziedziczenie

ZadanieWykonanie:
Stwórz klasę pochodną, która dziedziczy po klasie bazowejW czasie deklaracji klasy dziedziczącej po jej nazwie użyj dwukropka i nazwy klasy bazowej.
class KlasaPochodna : KlasaBazowa {
}
class KlasaBazowa {}
Wywołaj konstruktor z klasy bazowej jako część konstruktora klasy dziedziczącejUżywając słowa kluczowego 'base' jesteś w stanie wywołać konstruktor klasy pochodnej.
class KlasaPochodna : KlasaBazowa {
    public KlasaPochodna(int x) : base(x)
    {}
}
class KlasaBazowa {
    public KlasaBazowa(int x)
    {}
    public KlasaBazowa()
    {}
}

W tym przypadku najpierw wykona się konstruktor klasy bazowej ,a potem klasy pochodnej.

 

12 : Metody i dziedziczenie

ZadanieWykonanie:
Deklarowanie metody wirtualnejUżyj słowa ‘virtual’do deklaracji tej metody.
class Ssak {
    public virtual void SenRem()
    {
        //ciało }
}
Zadeklaruj metodę, która z klasy pochodnej nadpisuje odziedziczoną metodę virutualnąUżyj słowa ‘override’ aby napisać metodę z klasy bazowej.
class Kot : Ssak {
    public override void SenRem()
    {
         //inne ciało }
}
Wywołaj metodę z klasy bazowej w klasie pochodnej.
public override void SenRem()
{
    base.SenRem();
}

Użyj słowa kluczowego base.

 

13 : Interfejsy Explicite vs Implicit

ZadanieWykonanie:
Deklarowanie interfejsuUżyj słowa kluczowego ‘interface’.
interface IZucieTrway {
    void ZucieTrawy();
}

 

14 : Klasa abstrakcyjna, Metoda abstrakcyjna, Zamknięta klasa

ZadanieWykonanie:
Stwórz klasę abstrakcyjną, która może być użyta jako klasa bazowa. Zawiera ona też metody abstrakcyjne.Zadeklaruj klasę ze słowem kluczowym ‘abstract’. Metoda abstrakcyjna nie posiada ciała można powiedzieć ,że spełnia ona taki sam cel jak metoda w interfejsie.
abstract class Pojazd {
    public abstract void Jechać();
}
Stwórz klasę zamkniętą, która nie może być użyta jako klasa bazowa.Zadeklaruj klasę ze słowem kluczowym ‘sealed’.
sealed class JaguarX220 {}
Napisz zamkniętą metodę i wykaż kolejność działań słów kluczowych w metodach.
interface IZucieTrway {
    void ZucieTrawy();
}
abstract class Ssak {
    public abstract void SenRem();
}

abstract class SsakZujacyTrawe : Ssak, IZucieTrway {
    virtual public void ZucieTrawy() { }

    public sealed override void SenRem(){}
}

class Krowa : SsakZujacyTrawe {
    sealed override public void ZucieTrawy() { }
}
class KrowaAfrykańska : Krowa {

}

 

15 : Właściwości

ZadanieWykonanie:
Zadeklaruj właściwość do odczytu i zapisu dla struktury bądź klasy.Deklarując właściwość określ jej nazwę (zgodnie z dokumentacją musi być ona z dużej litery) potem napisz bloki kodu GET i SET.
struct Punkt4D {
    private int x;

    public int X
    {
        get { return x; }
        set { x = value; }
    }
}
Zadeklaruj właściwość tylko do odczytu.Właściwość taka ma tylko blok GET.
struct Punkt4D {
    private int x;

    public int X
    {
        get { return x; }
    }
}
Zadeklaruj właściwość tylko do zapisuZadeklaruj właściwość, która ma tylko blok SET.
struct Punkt4D {
    private int x;

    public int X
    {
        set { x = value; }
    }
}
Zadeklaruj właściwość w interfejsieW interfejsie właściwości nie mają ciała.
interface IPunkt4D {
    int X { get; set; } 
    int Y { get; set; } 
    int Z { get; set; } 
    int O { get; set; } 
}
Zaimplementuj właściwości z interfejsu w strukturze bądź klasieStruktura bądź klasa implementująca interfejs musi zawierać wszystkie opisane właściwości wraz z jej blokami GET i SET.
struct Punkt4D : IPunkt4D {
    public int X
    {
        get{ }
        set{ }
    }

    public int Y
    {
        get{ }
        set{ }
    }

    public int Z
    {
        get{ }
        set{ }
    }

    public int O
    {
        get{ }
        set{ }
    }
}
Stworzenie automatycznej właściwościZdefiniuj właściwość z pustymi blokami kodu GET i SET.
class Wielokąt {
    public int LiczbaKątów { get; set; }
}
Użyj właściwości w czasie inicjacji obiektuOkreśl wartość właściwości wewnątrz listy w nawiasach klamrowych po deklaracji obiektu.
Punkt4D p4 = new Punkt4D() { X = 1, Y = 2, Z = 3, O = 12 };

 

16 : Przeciążanie operatorów

ZadanieWykonanie:
Jaka jest składnia do przeciążania operatorów + i –.Metoda musisz być statyczna i zawierać słowo kluczowe'operator'po typie zwracanym oraz znak operatora przeciążanego.
public static Minuty operator +(Minuty lhs, Minuty rhs)
{
    return new Minuty(lhs.value + rhs.value);
}
Jaka jest składnia do przeciążania operatorów ++ i --Jak wyżej.
public static Minuty operator ++(Minuty arg)
{
    arg.value++;
    return arg;
}
Jaka jest składnia do przeciążania operatorów =! i ==Jak wyżej.
public static bool operator ==(Minuty lhs, Minuty rhs)
{
    return lhs.value == rhs.value;
}

public static bool operator !=(Minuty lhs, Minuty rhs)
{
    return lhs.value != rhs.value;
}

 

17 : Własna konwersja jawna i niejawna

ZadanieWykonanie:
Jak napisać własną konwersje niejawnąMetoda ta nie posiada swojej nazwy natomiast w miejscu gdzie powinna być nazwa metody trzeba użyć dwóch słów kluczowych 'implicit' i'operator'.
public static implicit operator int(Minuty z)
{
    return z.value;
}
Jak napisać własną konwersje jawnąMetoda ta nie posiada swojej nazwy natomiast w miejscu gdzie powinna być nazwa metody trzeba użyć dwóch słów kluczowych 'explicit'i'operator'.
public static explicit operator int(Minuty z)
{
    return z.value;
}

 

18 : Delegaty

ZadanieWykonanie:
Zadeklarowanie delegatyNapisz słowo kluczowe ‘delegate’ ,a potem typ, który ma być zwracany ,a później nazwę delegaty ,a na końcu w nawiasach parametry, które mają być przyjmowane.
delegate void ToJestDelegata();
Stworzenie instancji delegaty z jedną metodąSkładnia jest podobna jak w strukturze i w klasie. Napisz słowo ‘new’ ,a potem nazwę typu delegaty. W nawiasie można podać jedną metodę, która będzie wywoływana wraz z delegatą.
class Test {
    delegate void ToJestDelegata();

    private void Metoda(){}

    public Test()
    {
        ToJestDelegata inDel = new ToJestDelegata(Metoda);
    }
}
Wywołaj delegatęSkładnia jest identyczna jak w wypadku wywołania metody.
ToJestDelegata inDel = new ToJestDelegata(Metoda);
inDel();
Uwaga przed wywołaniem delegaty warto sprawdzić czy zawiera ona jakieś przypisane metody.

 

19 : Wyrażenia lambda delegaty

 

ZadanieWykonanie:
Pokaż przykład stosujący wyrażenie lambda.
delegate void MojaDelgata();
delegate int PotengaDelegat(int x);

static void Main(string[] args)
{
    MojaDelgata md = null;
    md += () => {Console.WriteLine("Test");};

    PotengaDelegat cd = null;
    cd += (x) => { return x * x; }; 

 

20 : Piszemy zdarzenia

ZadanieWykonanie:
Zadeklarowanie zdarzeniaNapis słowo ‘event’ potem nazwę typu delegaty ,a później nazwę zdarzenia. Nie zapomnij też o modyfikatorze dostępu na początku.
public delegate void ToJestDelegata();

public event ToJestDelegata ZdarzenieTestowe;
Subskrybuj zdarzenieStwórz instancje delegaty (tego samego typu co zdarzenie) i dołącz ją do zdarzenia za pomocą operatora +=.
class Test {
    delegate void ToJestDelegata();

    public event ToJestDelegata ZdarzenieTestowe;
}

class KlasaWywolującaZdarzenie {
    private Test test = new Test();

    public void Wywołanie()
    {
        test.ZdarzenieTestowe += 
            new Test.ToJestDelegata(test_ZdarzenieTestowe);
    }

    void test_ZdarzenieTestowe()
    {
       
    }
}

Możesz też użyć operatora“+=” bez słowa ‘new’ wtedy kompilator za ciebie stworzy nową instancje delegaty. Używając tego operatora w ten sposób możesz przypisać więcej delegat do danego zdarzenia.
public void Wywołanie()
{
    test.ZdarzenieTestowe += this.test_ZdarzenieTestowe;
}

 

21 : Klasy generyczne

ZadanieWykonanie:
Stwórz obiekt kolekcji Generics. Dodaj do niego jeden elementOkreśl odpowiedni typ w wewnątrz <T>.
List<int> lista = new List<int>();
lista.Add(121);

Dictionary<int, string> slownik = new Dictionary<int, string>();
slownik.Add(9812, "Adam Zdzisławski");

Queue<string> kolejkaZakupowa = new Queue<string>();
kolejkaZakupowa.Enqueue("Starsza pani");

List<char> lis = new List<char>() { '@' };

 

22 : Destruktor i Garbage Collection

ZadanieWykonanie:
Napisz destruktorNapisz metodę, która ma taką samą nazwę jak klasa i która zaczyna się od znaku tyldy ~. Metoda ta nie może mieć modyfikatora dostępu i nie może zwracać żadnego parametru, jak i ich przyjmować.
class Test {
    ~Test()
    {
        //destruktor 
    }
}
Wywołaj destruktorNie możesz wywołać destruktora. Tylko Garbage Collector może go wywołać.
Wymuś działanie Garbage CollectorNie zalecane.
System.GC.Collect();

 

Spis treści kursu

Spis treści kursu: