4.8 C#

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.
Tabela 4.3: Typy danych w C#
Typ w C# Klasa z  SystemOpis
sbyte SByte całk., 1 bajt, ze znakiem
byte Byte całk., 1 bajt, bez znaku
char Char całk., 2 bajty, bez znaku (kod Unicode)
short Int16 całk., 2 bajty, ze znakiem
ushort UInt16 całk., 2 bajty, bez znaku
int Int32 całk., 4 bajty, ze znakiem
uint UInt32 całk., 4 bajty, bez znaku
long Int64 całk., 8 bajtów, ze znakiem
ulong UInt64 całk., 8 bajtów, bez znaku
decimal Decimal całk., 12 bajtów, ze znakiem
float Single zmiennopozyc., 4 bajty
double Double zmiennopozyc., 8 bajtów
bool Boolean logiczna: true, false
string String napis (Unicode)
object Object dowolny obiekt

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:


P20: Enumer.cs     Wyliczenia w C#

      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.  }

którego uruchomienie dały:
    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