Podobnie jak w Javie i C/C++, w języku C# wszystkie zmienne muszą być przed użyciem zadeklarowane, a zatem jest to również język ze ścisłą kontrolą typu.
W C#, jak w Javie, zmienne wszystkich typów mają ustaloną reprezentację i nie ma tu, jak w C/C++, żadnych dowolności. W odróżnieniu jednak od Javy, liczbowe typy całkowite występują, tym razem właśnie jak w C++, w obu formach: ze znakiem i bez znaku. Zmienne liczbowe są wszystkie formalnie strukturami wywiedzionymi z klasy System.ValueType. Każdemu typowi C# odpowiada klasa z przestrzeni nazw System (odpowiadającej pakietowi java.lang z Javy). Nazywamy je strukturami a nie obiektami, gdyż w C# istnieją, prócz klas i obiektów właśnie struktury. Są one wzorowane na strukturach znanych z języka C, o których będziemy jeszcze mówić. Na razie zapamiętajmy, że klasa ValueType tak „opakowuje” struktury odpowiadające liczbom, aby ich użycie było zgodne z semantyką wartości, a nie odniesień (referencji). Zatem zmiennych liczbowych używamy w C# tak samo jak w Javie czy C/C++. Deklarując zmienne można używać zarówno nazw klas z przestrzeni System jak i ich synonimów bardziej przypominających nazwy znane nam z Javy czy C/C++. Tak więc np. deklaracja
System.Int32 k = 32;jest równoważna
int k = 32;W poniższej tabeli zamieszczone są podstawowe typy danych w C# wraz z ich synonimami z przestrzeni nazw System.
Podobnie jak w Javie, typ logiczny (bool, czyli System.Boolean) jest całkowicie samodzielnym typem i nie ma nic wspólnego z typami całkowitymi.
Znaki (zmienne typu char, czyli System.Char) są reprezentowane przez całkowite kody Unicode'u, jak w Javie.
Język C#, tak jak i Java, przejął też z języka C/C++ typ wyliczeniowy.
Wyliczenia i zmienne typów wyliczeniowych definiuje
się podobnie jak w C/C++, choć należy pamiętać o obiektowości
C#. Otóż wyliczenia stanowią osobny typ obiektowy (wszystkie są
wywiedzione z klasy
System.Enum) i wobec tego można je
definiować poza wszystkimi klasami (podobnie jest w Javie).
Do poszczególnych elementów trzeba wtedy oczywiście odnosić się
przez nazwy kwalifikowane nazwą typu, jak w poniższym przykładzie:
1. using System; 2. 3. enum Jezyk { Francja, Niemcy, Austria, Anglia } 4. 5. class DzienDobry { 6. public static string powiedz(Jezyk jez) { 7. switch (jez) { 8. case Jezyk.Francja: 9. return "Bonjour"; 10. case Jezyk.Niemcy: 11. case Jezyk.Austria: 12. return "Guten Tag"; 13. default: 14. return "Hi"; 15. } 16. } 17. } 18. 19. class Enumer { 20. public static void Main() { 21. Jezyk jezyk = Jezyk.Francja; 22. Console.WriteLine(DzienDobry.powiedz(jezyk)); 23. jezyk = Jezyk.Niemcy; 24. Console.WriteLine(DzienDobry.powiedz(jezyk)); 25. Console.WriteLine(DzienDobry.powiedz(Jezyk.Anglia)); 26. } 27. }
Bonjour Guten Tag Hi
Podobnie jak w Javie, w C# nie istnieje arytmetyka wskaźników. Ich rolę pełnią odniesienia, nazywane referenecjam, które jednak, tak jak w Javie, implementacyjnie i koncepcyjnie są bliższe wskaźnikom niż referencjom w C++.
T.R. Werner, 21 lutego 2016; 20:17