Udostępnij za pośrednictwem


Typy (Podręcznik programowania C#)

Typy, zmienne i wartości

C# jest jednoznacznie określony język.Każdej zmiennej i stałej ma typ, podobnie jak każdy wyrażenie, którego wynikiem jest wartość.Każdy podpis metody określa typ dla każdego parametru wejściowego, jak i dla wartości zwracanej..NET Framework class library definiuje zestaw wbudowanych typów liczbowych, jak również bardziej złożonych typów, które reprezentują szeroką gamę konstrukcje logiczne, takie jak system plików, połączenia sieciowe, zbiory i tablicami obiektów i daty.Typowy program C# używa typów z biblioteki klas, jak również typy zdefiniowane przez użytkownika, które modelu pojęcia, które są specyficzne dla domeny problem tego programu.

Informacje przechowywane w typu mogą być następujące:

  • Miejsce magazynowania, które wymaga zmiennej typu.

  • Wartości maksymalne i minimalne, które może reprezentować.

  • Elementy członkowskie (metod, pól, zdarzenia i tak dalej), które on zawiera.

  • Typ podstawowy, który dziedziczy ona.

  • Miejsce, gdzie pamięci dla zmiennych będą przyznawane w czasie wykonywania.

  • Rodzaje operacji, które są dozwolone.

Kompilator używa typu informacji, aby upewnić się, że wszystkie operacje, które są wykonywane w kodzie są typu bezpiecznej.Na przykład zadeklarować zmienną typu int, kompilator umożliwia dodatkowo użyć zmiennej i działania odejmowania.Jeśli próby wykonania tych operacji na zmienną typu bool, kompilator generuje błąd, jak pokazano w następującym przykładzie:

int a = 5;             
int b = a + 2; //OK

bool test = true;

// Error. Operator '+' cannot be applied to operands of type 'int' and 'bool'.
int c = a + test;

[!UWAGA]

Programiści c i C++, Zauważ, że w C# bool nie jest konwertowany na int.

Kompilator osadza informacje o typie do pliku wykonywalnego w metadanych.Common language runtime (CLR) używa tego metadanych w czasie wykonywania dalszych zagwarantowanie bezpieczeństwa typu przydziela i ta pamięci podczas.

ms173104.collapse_all(pl-pl,VS.110).gifOkreślanie typów w deklaracji zmiennej

Kiedy Zadeklaruj zmienną lub stałą w programie, należy określić jego typ albo użyć var. słowa kluczowego, aby umożliwić kompilator rozpoznać typ.Niektóre deklaracje zmiennych, które zarówno wbudowane typy liczbowe i złożone typy zdefiniowane przez użytkownika można znaleźć w poniższym przykładzie:

// Declaration only:
float temperature;
string name;
MyClass myClass;

// Declaration with initializers (four examples):
char firstLetter = 'C';
var limit = 3;
int[] source = { 0, 1, 2, 3, 4, 5 };
var query = from item in source
            where item <= limit
            select item;

Typy parametrów metody i wartości zwracane są określone w podpisie metody.Następujący podpis zawiera metodę, która wymaga int jako argument wejściowy i zwróci ciąg:

public string GetName(int ID)
{
    if (ID < names.Length)
        return names[ID];
    else
        return String.Empty;
}
private string[] names = { "Spencer", "Sally", "Doug" };

Po zadeklarowaniu zmiennej nie może być re-declared z nowym typem i nie można przypisać wartość, która nie jest zgodna z jej deklarowanego typu.Na przykład, nie można zadeklarować int , a następnie przypisać jej wartość Boolean true.Jednakże do innych typów, na przykład, gdy są one przypisane do nowych zmiennych lub przekazywane jako argumenty tej metody można konwertować wartości.A konwersji typu tego czy nie przyczynę utraty danych jest wykonywane automatycznie przez kompilator.Wymaga konwersji, która może spowodować utratę danych oddanych w kodzie źródłowym.

Aby uzyskać więcej informacji, zobacz Rzutowanie i konwersje typów (Podręcznik programowania C#).

Typy wbudowane

C# zawiera standardowy zestaw wbudowanych typów liczbowych do reprezentowania liczb całkowitych, pływające wartości punktu, wyrażeń logicznych, znaki tekstowe, wartości dziesiętnych i innych typów danych.Istnieją również wbudowane string i object typów.Są one dostępne w dowolnym programie C#.Aby uzyskać więcej informacji o typach wbudowane, zobacz Tabele odwołań dla typów (C# odwołanie).

Typy niestandardowe

Za pomocą struct, klasy, interfejsu, i enum konstrukcji, aby utworzyć własne niestandardowe typy..NET Framework sam jest zbiór niestandardowych typów dostarczony przez firmę Microsoft, którego można używać we własnych aplikacjach.Domyślnie najczęściej używane typy w bibliotece klasy są dostępne w dowolnym programie C#.Inne stają się dostępne tylko wtedy, gdy wyraźnie Dodaj odwołanie projektu do zestawu, w którym są zdefiniowane.Po otrzymaniu kompilator odwołanie do zestawu, można zadeklarować zmiennych (i stałych) typów zadeklarowany w tym Zgromadzeniu w kodzie źródłowym.Aby uzyskać więcej informacji, zobacz .NET Framework Class Library.

Wspólny System typu

Jest ważne, aby zrozumieć dwa punkty podstawowe informacje o systemie typu w .NET Framework:

  • Obsługuje on zasady dziedziczenia.Typy mogą pochodzić od innych typów, o nazwie typów podstawowych.Typ pochodny dziedziczy (z pewnymi ograniczeniami), metody, właściwości i innych członków typu podstawowego.Typ podstawowy można z kolei pochodzi od innego typu, w którym przypadku typu pochodnego dziedziczy członków obu typów podstawowych w swojej hierarchii dziedziczenia.Wszystkich typów, w tym wbudowane typy liczbowe, takie jak System.Int32 (C# słowo kluczowe: int), wynikają ostatecznie z jednego typu podstawowego, który jest System.Object (słowa kluczowego języka C#: obiektu).Nosi nazwę tej hierarchii zunifikowany typu Wspólny System typu (CTS).Aby uzyskać więcej informacji na temat dziedziczenia w C#, zobacz Dziedziczenie (Podręcznik programowania C#).

  • Każdego typu w CTS jest zdefiniowana jako wartości typu lub Typ odwołania.Obejmuje to wszystkie typy niestandardowe w.NET Framework class library i również własne typy zdefiniowane przez użytkownika.Typów zdefiniowanych przez użytkownika za pomocą struct słowa kluczowego są typy wartości; wszystkie wbudowane typy liczbowe są structs.Typów zdefiniowanych przez użytkownika za pomocą klasy słowa kluczowego są odniesienia typów.Typy odwołań i typów wartości mają różne reguły w czasie kompilacji i różne zachowanie w czasie wykonywania.

Następujące ilustracja pokazuje relację między typami wartości i typy odwołań, w przypadku modelu CTS.

Wartość typów i odniesienia typów w CTS

Typy wartości i typy referencyjne

[!UWAGA]

Można zobaczyć, że najczęściej używane typy są wszystkie zorganizowane w System obszaru nazw.Jednakże obszaru nazw, w którym znajduje się typ nie ma związku jest wartością typu lub typ odwołania.

ms173104.collapse_all(pl-pl,VS.110).gifTypy wartości

Typy wartości pochodzić od System.ValueType, co wynika z System.Object.Typy, które wynikają z System.ValueType mają szczególne zachowanie środowiska CLR.Zmienne typu wartości zawierają bezpośrednio ich wartości, co oznacza, że pamięć jest przydzielona wbudowanej w kontekście, niezależnie od zmiennej jest zadeklarowany jako.Istnieje alokację sterty oddzielnych lub narzutów kolekcji garbage w przypadku zmiennych typu wartości.

Istnieją dwie kategorie typów wartości: struct i enum.

Wbudowane typy liczbowe są struktur i posiadają właściwości i metody, których można uzyskiwać dostęp:

// Static method on type Byte.
byte b = Byte.MaxValue;

Ale deklaruje i przypisać wartości do nich tak, jakby były one proste typy do agregacji:

byte num = 0xA;
int i = 5;
char c = 'Z';

Typy wartości są zamkniętych, co oznacza, na przykład, że nie może pochodzić od typu System.Int32, i nie można definiować struct do dziedziczą z klasy zdefiniowanej przez użytkownika lub struct ponieważ struktury mogą dziedziczyć tylko System.ValueType.Jednakże struct można zaimplementować jeden lub więcej interfejsów.Można rzutować typu struct do typu interfejsu; Powoduje to, że boksie operacji, aby otoczyć struct wewnątrz obiektu typu odwołanie na zarządzanego stosu.Operacje boksie wystąpić podczas typ wartości są przekazywane do metody, która przyjmuje System.Object jako parametr wejściowy.Aby uzyskać więcej informacji, zobacz Boks i pakowania (C# Programming Guide).

Za pomocą struct słowo kluczowe, aby utworzyć własne typy niestandardowe wartości.Zazwyczaj struct służy jako kontener dla małego zbioru powiązanych zmiennych, jak pokazano w następującym przykładzie:

public struct CoOrds
{
    public int x, y;

    public CoOrds(int p1, int p2)
    {
        x = p1;
        y = p2;
    }
}

Aby uzyskać więcej informacji na temat struktur, zobacz Strukturach (Podręcznik programowania C#).Aby uzyskać więcej informacji na temat typów wartości w .NET Framework, zobacz Wspólny System typu.

Kategorii typów wartości jest enum.Wyliczenia definiuje zestaw nazwanego integralną stałych.Na przykład System.IO.FileMode wyliczenie w.NET Framework class library zawiera zestaw nazwany stałej liczb całkowitych, które określają, jak otworzyć plik.Jest ona zdefiniowana, jak pokazano w następującym przykładzie:

public enum FileMode
{
    CreateNew = 1,
    Create = 2,
    Open = 3,
    OpenOrCreate = 4,
    Truncate = 5,
    Append = 6,
}

System.IO.FileMode.Create Stała ma wartość 2.Jednakże nazwa jest znacznie bardziej zrozumiały dla ludzi, czytanie kodu źródłowego i z tego powodu jest on lepiej jest używać wyliczenia zamiast stałej liczby literału.Aby uzyskać więcej informacji, zobacz System.IO.FileMode.

Wszystkie teksty stałe dziedziczą z System.Enum, która dziedziczy z System.ValueType.Wszystkie zasady, które stosuje się do struktur stosuje się również do wyliczenia.Aby uzyskać więcej informacji na temat teksty stałe, zobacz Wyliczanie typów (Podręcznik programowania C#).

ms173104.collapse_all(pl-pl,VS.110).gifTypy odwołań

Typ, który jest zdefiniowany jako klasy, delegować, tablica, lub interfejsu jest Typ odwołania.W czasie wykonywania, gdy zadeklarować zmienną typu odwołania, zmienna zawiera wartość null aż jawnie tworzone jest wystąpienie obiektu za pomocą nowych operator, lub przypisać mu obiektu gdzie indziej zostały utworzone za pomocąnew, as shown in the following example:

MyClass mc = new MyClass();
MyClass mc2 = mc;

Interfejs musi być zainicjowany wraz z obiektu klasy, która implementuje go.Jeśli MyClass implementuje IMyInterface, można utworzyć wystąpienia IMyInterface jak pokazano w następującym przykładzie:

IMyInterface iface = new MyClass();

Podczas tworzenia obiektu na zarządzanego stosu jest alokowana pamięć i zmiennej przechowuje tylko odwołanie do lokalizacji obiektu.Typy na stercie zarządzane wymagają narzutów, zarówno gdy są one przydzielane i gdy odzyskane przez funkcje zarządzania pamięci automatyczne CLR, co jest znane jako kolekcji garbage.Również bardzo dobrze optymalizowana jest wyrzucania elementów bezużytecznych i w większości scenariuszy nie tworzy problemu z wydajnością.Aby uzyskać więcej informacji na temat wyrzucania elementów bezużytecznych, zobacz Automatyczne zarządzanie pamięcią.

Wszystkie tablice są typy odwołań, nawet jeśli ich elementy są typami wartości.Tablice niejawnie pochodzić od System.Array klasy, ale deklaruje i należy je uproszczone składnię, dostarczonego przez C#, jak pokazano w następującym przykładzie:

// Declare and initialize an array of integers.
int[] nums = { 1, 2, 3, 4, 5 };

// Access an instance property of System.Array.
int len = nums.Length;

Typy odwołań w pełni obsługuje dziedziczenia.Podczas tworzenia klasy może dziedziczyć po interfejsu lub klasa, która nie jest zdefiniowana jako zamkniętych, i innych klas można dziedziczyć po klasie i zastąpić swoje metod wirtualnych.Aby uzyskać więcej informacji na temat tworzenia własnych klas, zobacz Klasy i strukturach (Podręcznik programowania C#).Aby uzyskać więcej informacji na temat dziedziczenia i metod wirtualnych, zobacz Dziedziczenie (Podręcznik programowania C#).

Wartości literałów

W języku C# wartości literału otrzymywać typu z kompilatora.Można określić, w jaki sposób literałem numerycznym powinien być wpisywany przez dołączenie list do końca liczby.Na przykład, aby określić, że wartość 4.56 powinny być traktowane jako pływaka, Dołącz "f" lub "F" po numerze: 4.56f.Jeśli brak litery są dołączane, kompilator ustali typ dla literału.Aby uzyskać więcej informacji o tym, które można określić typy przy użyciu listu sufiksów, można znaleźć na stronach referencyjne dla poszczególnych typów w Typy wartości (C# odniesienia).

Ponieważ wpisywane są literały i wszystkie typy pochodzić ostatecznie z System.Object, można pisać i kompilować kod, takie jak następujące:

string s = "The answer is " + 5.ToString();
// Outputs: "The answer is 5"
Console.WriteLine(s);

Type type = 12345.GetType();
// Outputs: "System.Int32"
Console.WriteLine(type);

Typy rodzajowe

Typ może być zadeklarowana z jednym lub więcej Parametry typu , służyć jako symbolem zastępczym dla rzeczywistego typu ( konkretny typ) kod klienta zapewni podczas tworzenia wystąpienia typu.Takie typy są nazywane Typy rodzajowe.Na przykład.NET Framework typu System.Collections.Generic.List<T> ma jeden parametr typu, który przez Konwencję została nadana nazwa t.Podczas tworzenia wystąpienia typu należy określić typ obiektów, które lista będzie zawierać na przykład ciąg:

List<string> strings = new List<string>();

Użycie parametru typu umożliwia ponowne użycie tej samej klasy do przytrzymaj dowolny typ elementu, bez konieczności konwertowania każdego elementu do obiektu.Klasy rodzajowej kolekcji są nazywane jednoznacznie określone typy kolekcji ponieważ kompilator zna określonego typu elementy kolekcji i można podnieść błąd w czasie kompilacji, jeśli, na przykład próby dodania do typu integer strings obiekt w poprzednim przykładzie.Aby uzyskać więcej informacji, zobacz Generyczne (Podręcznik programowania C#).

Niejawne typów, typy anonimowe i typy Nullable

Jak wspomniano wcześniej, można niejawnie wpisać zmienna lokalna (ale nie elementy klas) za pomocą var. słowa kluczowego.Zmienna nadal odbiera typu w czasie kompilacji, ale typ jest dostarczana przez kompilator.Aby uzyskać więcej informacji, zobacz Wpisane niejawnie zmiennych lokalnych (C# Programming Guide).

W niektórych przypadkach jest niewygodne utworzyć typ nazwany dla prostych zestawów powiązanych wartości, które nie zamierzają przechowywania lub przekazać poza granice metody.Można utworzyć anonimowych typów do tego celu.Aby uzyskać więcej informacji, zobacz Typy anonimowe (Podręcznik programowania C#).

Typy wartości zwykłych nie może mieć wartość null.Jednakże, można utworzyć typy wartości NULL przez umieszczenie ? po typu.Na przykład int? jest int typu, który może również mieć wartość null.W CTS, nullable typy są instancjami typu rodzajowego struct System.Nullable<T>.Typy Nullable są szczególnie przydatne są przekazywanie danych do i z baz danych, w których wartości liczbowych, może być null.Aby uzyskać więcej informacji, zobacz Typy Nullable (Podręcznik programowania C#).

Sekcje pokrewne

Aby uzyskać więcej informacji zobacz następujące tematy:

Specyfikacja języka C#

Aby uzyskać więcej informacji, zobacz Specyfikacja języka C#. Specyfikacja języka to najlepsze źródło informacji dotyczących składni i zastosowania języka C#.

Zobacz też

Informacje

Typy danych w porównaniu w różnych językach

Tabela typów integralną (C# odniesienia)

Koncepcje

Podręcznik programowania C#

Conversion of XML Data Types

Inne zasoby

C# odniesienia