• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Czym się różnią typy danych w C# vs .NET?

VPS Starter Arubacloud
+1 głos
734 wizyt
pytanie zadane 4 stycznia 2020 w C# przez startCoding Obywatel (1,210 p.)

Witam serdecznie.

Zaczynam naukę C#, przychodząc z JavaScriptu, także tematy zakresu wielkości typu danych czy w ogóle statyczne typowanie nie jest dla mnie codziennością.

Próbuję zrozumieć relację pomiędzy typami w  C# i .NET i jako nadal zupełny laik rozumiem to w bardzo uproszczony sposób. 

Cały mój tok rozumowania od absolutnych podstaw jest następujący:

  • C# to język programowania
  • .NET to framework umożliwiający budowanie aplikacji głównie na system Windows (bez wchodzenia w szczegóły). Framework .NET można wykorzystać nie tylko pisząc w jeżyku C#, ale np. F#, C++ czy VB .NET

.NET składa się z:

  • CLR - dzięki temu narzędziu skompilowany kod C#, czyli IL Code, jest zamieniany na kod maszynowy za pomocą Just-in-time Compilation. Teoretycznie dzięki temu, jeśli dana maszyna (niezależnie od systemu operacyjnego) ma zainstalowane CLR to może uruchomić aplikację napisaną w języku "zintegrowanym" z frameworkiem .NET (np. napisaną w C#).
  • Biblioteka klas

Dochodzimy do owej biblioteki klas, omówionej między innymi w oficjalnej dokumentacji i widzimy tam sposób tworzenia danego typu danych w różnych jezykach i tego typu w języku .NET.

Czy to oznacza, że jeżeli ja pisząc następujący kod w C#:

int sampleVariable = 10;

skompiluję go, to w trakcie kompilacji powyższa zmienna jest mapowana (takie słowo znalazłem, ale nie wiem co ono oznacza w tym kontekście) z typu int na typ zrozumiały w .NET, czyli System.Int32?

Jeżeli dobrze to rozumiem to dlaczego i po co to się dzieje? Czy ta wiedza mi jest w ogóle potrzebna?

Ponadto doczytałem, że System.Int32 zawiera się w FCL - Framework Class Library. Jak się to ma do BCL, czyli Base Class Library  i tak prosto ujmując po co jest FCL i BCL oraz czym się różnią?

Dlaczego w moim kodzie jak wyżej ze zmienną typu int nie wykorzystam dyrektywy using System; (ogólnie nic nie zaimportuje do projektu) gdzie jak zakładam takie prymitywne typy jak int są zdefiniowane, to dlaczego to nadal działa? Czy to się jakoś wiąże z BCL?

Proszę o dokładne i spokojne wytłumaczenie. Proszę nie zakładać, że mam jakąkolwiek wiedzę, bo powyższe co napisałem, glównie wiem z suchej teorii i nie miałem okazji nigdzie grzebać w kodzie bibliotek i przekonać się jak to działa pod maską na własne oczy. Za możliwie jak najprostsze wytłumaczenie z całego serca dziękuję.

1 odpowiedź

+3 głosów
odpowiedź 4 stycznia 2020 przez adrian17 Ekspert (344,100 p.)
wybrane 7 stycznia 2020 przez startCoding
 
Najlepsza

i tak prosto ujmując po co jest FCL i BCL oraz czym się różnią?

Odpowiedź z SO: https://stackoverflow.com/a/807910/2468469

z typu int na typ zrozumiały w .NET, czyli System.Int32?

Tak. Odpowiedź z SO: https://stackoverflow.com/a/62738/2468469

Each of the predefined types is shorthand for a system-provided type. For example, the keyword int refers to the struct System.Int32

Dlaczego w moim kodzie jak wyżej ze zmienną typu int nie wykorzystam dyrektywy using System ; (ogólnie nic nie zaimportuje do projektu) 

`using` nic nie importuje; to cały czas jest dostępne. `using System.Collections.Generic` jest tylko po to, żeby zamiast `System.Collections.Generic.List` można było pisać samo `List`.

Jeżeli dobrze to rozumiem to dlaczego i po co to się dzieje?

Żeby z punktu widzenia frameworku wszystko było klasą lub "strukturą", a jednocześnie żeby dzięki kompilatorowi można było pisać kod "prosty" ze zwykłymi intami niemalże jak w C, bez przejmowania się jego strukturo-podobnością. Ogólnie, magia pozwalająca połączyć wygodę z jednolitością.

Czy ta wiedza mi jest w ogóle potrzebna?

Przez długi czas nauki nie będzie potrzebna.

komentarz 7 stycznia 2020 przez startCoding Obywatel (1,210 p.)

Bardzo Ci dziękuję za treściwą odpowiedź i przepraszam, że dopiero teraz miałem okazję odpisać.

Wytłumaczyłeś mi wiele spraw, niektóre nadal nie są 100% jasne, ale wynika to z tego, że jestem początkujący w tym języku i póki co kwestie implementacyjne w C# i to co się dzieje "pod maską" nie mogę oczekiwać, że dogłębnie zrozumiem.

Mimo wszystko dopytam Cię o część Twojej odpowiedzi:

`using` nic nie importuje; to cały czas jest dostępne. `using System.Collections.Generic` jest tylko po to, żeby zamiast `System.Collections.Generic.List` można było pisać samo `List`.

Oznacza to, że using nie dodaje mi danej przestrzeni nazw do projektu np. System, bo jest ona dostępna cały czas (bo jest w plikach projektu jak zakładam). Oznacza to, że dzięki using System; zamiast pisać System.Console.WriteLine() mogę po prostu napisać Console.WriteLine() 

Jak to jednak wygląda, kiedy chcę zadeklarować stringa wykorzystując klasę pisząc np. String firstName = "John";  - mimo iż dodam w moim projekcie using System; to i tak kompilator zgłasza błąd CS0118 który mówi, że "Element String to element przestrzeni nazw, ale jest używany jako typ". Co powoduje, że muszę mimo using System; pisać System.String w deklaracji stringa (tak przy okazji - using System; jest wyszarzony, co oznacza, że jest nieużywany?!). Mógłbyś mi to wyjaśnić?

komentarz 7 stycznia 2020 przez adrian17 Ekspert (344,100 p.)

bo jest ona dostępna cały czas (bo jest w plikach projektu jak zakładam)

Konkretniej, masz w projekcie nawiązania do zewnętrznych komponentów (.DLLek). Widać je w projekcie tutaj: https://puu.sh/EXqcZ/523e7b0f52.png https://puu.sh/EXqdS/775e64a5a3.png

to i tak kompilator zgłasza błąd CS0118

Trudno mi powiedziec, bo u mnie działa: https://puu.sh/EXqfV/6d9633b581.png

Dla formalności tylko zaznaczę, że w C# "zwykłym" zapisem stringa jest `string`, tak samo jak `int` zamiast `Int32`. Patrz: https://puu.sh/EXqhN/eb3b7e8ea7.mp4

komentarz 8 stycznia 2020 przez startCoding Obywatel (1,210 p.)

Bardzo Ci dziękuję za poświęcony czas, jak się okazało występował konflikt nazw z przestrzenią nazw której nazwa została odziedziczona po nazwie projektu - jako, że bawiłem się z typem string, to nie trudno się domyśleć, że przestrzeń nazw miała nazwę String... Brawo ja :)

To co mnie intryguje jeszcze, to fakt, że w momencie kiedy wykorzystuję bezpośrednio nazwę klasy np. String czy nazwę strukturę Int32 to przy tworzeniu instancji tej klasy nie muszę alokować pamięci za pomocą słowa kluczowego new. Wiem, że jest to powiązane ze stosem i ze stertą, ale z tego co wiem typy prymitywne lądują na stosie i on jest zarządzany (w uproszczeniu) automatycznie, stąd brak jawnej alokacji pamięci. Natomiast typy referencyjne lądują na stercie więc w przypadku string nie powinno to wyglądać String firstName = new "John"; ?

komentarz 8 stycznia 2020 przez adrian17 Ekspert (344,100 p.)

z tego co wiem typy prymitywne lądują na stosie i on jest zarządzany (w uproszczeniu) automatycznie, stąd brak jawnej alokacji pamięci

Nie tylko typy prymitywne, tylko "value types". Do tego zbioru wliczają się typy proste (int, char etc), struktury, enumy etc. Nie lądują obowiązkowo na stosie, tylko tam gdzie zostały zadeklarowane. (jak w funkcji to na stos, ale jeśli są polem klasy, to oczywiście razem z resztą zawartości klasy trafiają na stertę)

nie muszę alokować pamięci za pomocą słowa kluczowego new

`new` sam z siebie bezpośrednio nie alokuje pamięci. Cytując:

The `new` operator implies creation of an instance of a type, but does not necessarily imply dynamic allocation of memory. In particular, instances of value types require no additional memory beyond the variables in which they reside, and no dynamic allocations occur when new is used to create instances of value types.

więc w przypadku string nie powinno to wyglądać String firstName = new "John"; ?

Literały to po prostu magiczna składnia dająca Ci gotowy obiekt. 5 albo "asdf" to obiekt typu int/string który "już istnieje" - nie musisz go ręcznie tworzyć.

komentarz 9 stycznia 2020 przez startCoding Obywatel (1,210 p.)
Dziękuję za odpowiedzi Adrian - jeśli 17 w Twoim nicku odnosi się do Twojego wieku to chapeau bas, choć konto założyłeś prawie 5 lat temu, więc istnieje szansa, że masz 22 lata, ale i tak wiedza świetna jak na ten wiek.

Bardzo mi pomogłeś.
komentarz 9 stycznia 2020 przez adrian17 Ekspert (344,100 p.)
Nie odnosi się do wieku ;)

Podobne pytania

+3 głosów
1 odpowiedź 214 wizyt
pytanie zadane 7 lutego 2023 w SQL, bazy danych przez zbiku25 Bywalec (2,940 p.)
0 głosów
4 odpowiedzi 4,805 wizyt
pytanie zadane 8 lipca 2015 w C i C++ przez k222 Nałogowiec (30,150 p.)
0 głosów
1 odpowiedź 678 wizyt
pytanie zadane 10 sierpnia 2020 w C i C++ przez Sevence Początkujący (280 p.)

92,455 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...