• 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?

Aruba Cloud - Virtual Private Server VPS
+1 głos
907 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 Mentor (352,580 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 Mentor (352,580 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 Mentor (352,580 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 Mentor (352,580 p.)
Nie odnosi się do wieku ;)

Podobne pytania

+3 głosów
1 odpowiedź 516 wizyt
pytanie zadane 7 lutego 2023 w SQL, bazy danych przez zbiku25 Gaduła (3,000 p.)
0 głosów
4 odpowiedzi 5,337 wizyt
pytanie zadane 8 lipca 2015 w C i C++ przez k222 Nałogowiec (30,150 p.)
0 głosów
1 odpowiedź 1,031 wizyt
pytanie zadane 10 sierpnia 2020 w C i C++ przez Sevence Początkujący (280 p.)

93,335 zapytań

142,331 odpowiedzi

322,415 komentarzy

62,670 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...