C# - Typy Referecyjne i typy wartościowe i wiele innych rzeczy

Preview:

DESCRIPTION

 

Citation preview

MaxymalnaWiedza

Jak poznałem waszą matkę

Dzieci zanim poznałem waszą matkę musiałem rozwinąć swoją kariere jako programista w C#.

Dzisaj w 2030 roku mamy notesy które wyglądają jak smartphony.

Każdy znas ma implaty które wyświetlają statusy Facebook i Google+

...trój wymiarowe monitory

Mamy też elektryczne kupki które wyświetlają efektowne informacje...które nikomu nie są potrzebne

2011

Ale dzieci w 2011 roku tych rzeczy nie było. Chociaż dla was zapewne to codzienność i jedny stały obraz rzeczywistości.

2011

2011 roku nie programowałem kupków ani elektronicznych notesów. W 2011 rozpoczynałem programowanie w Windows Phone 7 dla mojej firmy.

2011

Była to moja życiowa szansa ponieważ w Białej Podlaskiej nie mogłem się rozwinąć. W Warszawie miałem prace, przyjaciół i szkołe. Wszystko to ułożyło się w przeciągu 2 miesięcy...to było moje przeznaczenie.

2011

Z drugiej strony było to ogromne wyzwanie. Wcześniej nudziłem się jak cholera. Teraz nie miałem czasu na nic. Jednak to i tak była nie wielka cena za tą życiową szanse.

2011

W listopadzie 2011 roku prowadziłem wykład na grupie PJWSTK i ten wykład miał wielki wypływ na dalszą część mojego życia.

Max Payne

Nie było żadnych błędów. Klient nie narzekał...i jeszcze sprawiło mi to przyjemność...

Ten ostatni kod był jak wykrzyknik podsumuwjący wszysto to co doporwadziło mnie aż tutaj. Puściłem klawiaturę i było już po wszystkim.

Jednak aby moja historia miała jakikolwiek sens musze się cofnąc o trzy lata. Kiedy to przyszychodziłem na wykłady o C#.

Wtedy programowałem w Javie. Ale nie byłem naiwny. Platforma nie miała dla mnie znaczenia liczyło się tylko kto i ile dla mnie zapłaci.

Programista tak naprawdę jest twórcą funkcjonalności biznesowy. Dla tych z wyższej warstwy rezultat był najważniejszy ,a nie technologia czy platforma.

Każdy kto myślał innaczej był frajerem. W tej braży istnieje zbyt duży podział pomiędzy klientem ,a programistą. Kasa płynie rurami ,a informacje przeciekają. Wszyscy są wkurzeni i wszyscy wszytkich obwiniają.

Nie miałem złudzej programowanie nie miało nic wspólnego z dobrą zabawą.

Jednak przyszedłem na wykład o C# prowadzonego przez Cezarego Walenciuk-a.

Koleś był dziwny. Prowadził bloga ,ale nie wyglądał na kolejnego ciasnego w garniturze. Nie widziałem jeszcze takiego typa.

Miał on dziwny styl prezentowania.

Zamiast odrazu monotonym głosem wytłumaczać co jak pokazywał on dziwne pochrzanione obrazki.

Te pozytywne przeczucie uderzyło mnie jak kod SQL-INJECTION prosto w twarz. Coś tu było fajnego chociaż jeszcze nie pojawił się ani jeden fragment kodu.

Programistyczny sen

Wkońcu skończył on pokazywać dziwne obrazki i opowiadać o sobie.

Chciałem zobaczyć czy ten dzieciak umie przekazać troche wiedzy.

Klasa

Klasa

Różnica pomiędzy klasą a obiektem jest taka ,że obiekt jest instancją danej klasy. Czyli różnica pomiędzy nimi jest niczym jak kategoria kot ,a konkretny kot. Nie można się bawić z “pojęciem kot” tylko z jego konkretnym egzemplarzem.

Demo

Utworzenie klasy Kot

Omówienie konstruktora

Statyczne klasy

Klasy anonimowe

Modyfikator dostępu

Java

class Kobieta {     

private Piersi Cycki;     

public  Piersi PokazCyckiWybranemu(Facet facet)     {         

return Cycki;     }

}

C#

DEMO

Typ referecyjny

,a typ wartościowy

Typy wartościowe

Typy takie jak int,float ,double ,char są typami wartościowymi.

Kiedy deklarujesz zmienną jako typ wartościowy kompilator alokuje kod w wystarczająco dużym bloku pamięci.

Czyli dla typu int kompilator rezerwuje 32 bitów pamięci  ponieważ typ ten składa się z 4 bajtów. 

int a = 121;

Typy referecyjne

Sprawa wygląda zupełnie inaczej z klasami. Kiedy deklarujesz obiekt klasy kompilator nie generuje kodu, który zarezerwowałby odpowiedni obszaru pamięci dla danego obiektu.

Kompilator w pamięci przechowuje  adres (referencje) do innego bloku pamięci,  gdzie jest przechowywana klasa. Pamięć ta dla klasy jest lokalizowana wtedy, gdy tworzymy nowy obiekt za pomocą słowa kluczowego new.

Kopiowanie

wartości

Czyszczenie

obiektów

Stos i Sterta

Stos jest zorganizowany niczym jak pudełka, które są ułożone pionowo jedne pod drugim. Kiedy metoda jest wywoływana  każdy parametr jest wkładany do pudełka i układany pionowo jedno pod drugim. Każda zmienna jest powiązana z zawartością tego pudełka i one są umieszczane pod pudełkiem na stosie. Po skończonej metodzie wszystkie pudełka zostają usunięte.

Sterta wygląda jak kilka  poziomo ułożonych pudełek ustawionych oddzielnie od siebie. Każde z tych pudełek ma na sobie napis czy jest wciąż używane. Gdy tworzymy nową instancje obiektu program wyszukuje puste nie używane pudełko  i umieszcza w nim obiekt. Kiedy ostatnia referencja znika w którymś momencie Garbage Collector opróżni pudełko i ustawi je do ponownego użycia.

static void UtworzeObiekt(int h,int b) {

int a = 6; Cuboid cu; cu = new Cuboid(a, b, h);

}

Null - demo

Nie ma pustych obiektów

Facet tenkoles = null;

Typy wartościowe

bool? b = null; int? bb = null; float? bbb = null;

Ref Out

Cuboid cuboid = new Cuboid(1, 2, 3);string napis = "Ala ma kota";             int liczba = 121;             NieZmienie(cuboid, liczba, napis);

static void NieZmienie(Cuboid cuboid, int liczba, string napis)     {             

cuboid = new Cuboid(44, 555, 666);             liczba--;             napis = "1234567890qwertyuiopasdfghj";         

}

Cuboid cuboid = new Cuboid(1, 2, 3);string napis = "Ala ma kota";             int liczba = 121;             Zmienie(ref cuboid, ref liczba, ref napis);

static void Zmienie(ref Cuboid cuboid, ref int liczba, ref string napis){             

cuboid = new Cuboid(44, 555, 666);             liczba--;             napis = "1234567890qwertyuiopasdfghj";         

}

Object boxing and

unboxing

System.Object obj2; object obj;

Boxing - pakowanie

int a = 121; object ob = a;

Jak właśnie widać zmienne object mogą referować się do jakiekolwiek obiektu referencyjnego. Mogą też przechowywać typy wartościowe.

Jednak to proste wyrażenie wymaga wyjaśnienia. Zmienne typu wartościowego żyją na stosie , a zmienna object żyje na stercie, czyli ona jest typu referencyjnego .

W wyniku tej operacji wartość ze stosu zmiennej “a” zostanie skopiowana na stertę i referencyjnie powiązana z zmienną typu object. Ta operacja nazywa się boxing – po polsku pakowaniem , a nie boksowaniem

UnBoxing - wypakowywanie

int a = 121; object ob = a;int b = (int)ob;

IS – AS

DEMO

Struktura i Klasa

Tablice

int[] numery; object[] obiekty;

int[] numery; numery = new int[3]; object[] obiekty = new object[2];

Wartości tablic

int[] tab = new int[5];             for (int i = 0; i < 5; i++)     {                 

tab[i] = i;             }

int[] dawaj = new int[3] { 1, 2, 3}; int[] dawaj2 = new int[] { 1, 2, 3, 4, 6, 7, 8, 9 };

Iteracja wobec tablic

Kopiowanie tablic

Tablice wielowymiarowe

Koniec

Prezentacja była ciekawa.A to dopiero początek Maxymalenj wiedzy.Wiedziałem ,że jutro czeka mnie jeszcze więcej zabawy.

Recommended