Ściąga Część NR.23 Kurs 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

Zadanie Wykonanie:
Deklarowanie klasy Napisz 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 konstruktora Napisz 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 konstruktora Używając słowa kluczowego “new” wywołujesz konstruktor wraz z odpowiednimi parametrami.
Kwadrat kw = new Kwadrat(200);

 

02 : Klasa statyczna i anonimowa

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

}
Deklarowanie statycznej metody Napisz słowo ‘static’ przed deklaracją metody.
class Kwadrat 
{
   public static int KontKwadratu()
   {}
}
Wywołanie statycznej metody Napisz nazwę klasy po czym postaw kropkę i napisz nazwę metody. Statyczna metoda nie potrzebuje zainicjowanego obiektu.
int a = Kwadrat.KontKwadratu();
Deklarowanie pola statycznego Ponowne użycie słowa ‘static’ przed deklaracją pola:
private static int Kont;
Deklarowanie stałych pól Napisz 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ól Użycie pola stałego wygląda identycznie jak użycia pola statecznego.
int promien = 3;
double pole = Koło.PI * promien * promien; 
Statyczny konstruktor Statyczny 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 klasy Klasy 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ęć

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

image
Skopiowanie referencji pomiędzy zmiennymi Zmienne 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

Zadanie Wykonanie:
Deklarowanie zmiennej , która przetrzymuje również wartość null Zadeklaruj 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

Zadanie Wykonanie:
Przekaż argument jako parametr ref Przed 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 out Przed 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

Zadanie Wykonanie:
Pakowanie wartości Zainicjuj albo przypis zmienną do typu object.
object obiekt = 121;
Wypakowywanie wartości Wykonaj rzutowanie na referencji obiektu, która ma zapakowaną wartość danego typu.
int a = (int)obiekt;
Wykonaj bezpieczne rzutowanie Do 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

Zadanie Wykonanie:
Zadeklarowanie typu wyliczeniowego Napisz 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 wyliczeniowego Tak 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

Zadanie Wykonanie:
Deklarowanie struktury Tutaj 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 struktury Napisz nazwę typu struktury po czym napis nazwę zmiennej.
CzasPracy czasPrac;
Inicjowanie zmiennej struktury i nadanie jej wartości Wywoł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

Zadanie Wykonanie:
Deklarowanie zmiennej tablicy Napisz nazwę typu po czym bez spacji dodaj do tego typu nawiasy kwadratowe. Teraz standardowo napisz nazwę swojej zmiennej.
int[] liczby;
Tworzenie instancji tablicy Napisz 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ściami Aby 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 tablicy Do 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 tablicy Do 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

Zadanie Wykonanie:
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

Zadanie Wykonanie:
Stwórz klasę pochodną, która dziedziczy po klasie bazowej W 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ącej Uż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

Zadanie Wykonanie:
Deklarowanie metody wirtualnej Uż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

Zadanie Wykonanie:
Deklarowanie interfejsu Użyj słowa kluczowego ‘interface’.
interface IZucieTrway {
    void ZucieTrawy();
}

 

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

Zadanie Wykonanie:
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

Zadanie Wykonanie:
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 zapisu Zadeklaruj 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 interfejsie W 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ź klasie Struktura 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ści Zdefiniuj 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 obiektu Okreś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

Zadanie Wykonanie:
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

Zadanie Wykonanie:
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

Zadanie Wykonanie:
Zadeklarowanie delegaty Napisz 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

 

Zadanie Wykonanie:
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

Zadanie Wykonanie:
Zadeklarowanie zdarzenia Napis 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 zdarzenie Stwó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

Zadanie Wykonanie:
Stwórz obiekt kolekcji Generics. Dodaj do niego jeden element Okreś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

Zadanie Wykonanie:
Napisz destruktor Napisz 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 destruktor Nie możesz wywołać destruktora. Tylko Garbage Collector może go wywołać.
Wymuś działanie Garbage Collector Nie zalecane.
System.GC.Collect();

 

Spis treści kursu

Spis treści kursu: