Jest ważna i subtelna kwestia, której żaden z nich nie dotyczy bezpośrednio. Istnieją dwa sposoby rozważania typu w C #: typ statyczny i typ czasu wykonywania .
Typ statyczny to typ zmiennej w kodzie źródłowym. Jest to zatem koncepcja czasu kompilacji. Jest to typ, który widzisz w podpowiedzi po najechaniu kursorem na zmienną lub właściwość w środowisku programistycznym.
Możesz uzyskać typ statyczny, pisząc pomocniczą metodę ogólną, aby umożliwić wnioskowanie o typie za Ciebie:
Type GetStaticType<T>(T x) { return typeof(T); }
Typ czasu wykonywania to typ obiektu w pamięci. Jest to zatem koncepcja czasu wykonywania. To jest typ zwracany przez GetType()metodę.
Typ czasu wykonywania obiektu często różni się od statycznego typu zmiennej, właściwości lub metody, która go przechowuje lub zwraca. Na przykład możesz mieć taki kod:
object o = "Some string";
Typ statyczny zmiennej to object, ale w czasie wykonywania typem referencji zmiennej jest string. Dlatego w następnej linii na konsoli zostanie wyświetlony tekst „System.String”:
Console.WriteLine(o.GetType());
Ale jeśli najedziesz kursorem na zmienną ow środowisku programistycznym, zobaczysz typ System.Object(lub równoważne objectsłowo kluczowe). Możesz zobaczyć to samo, korzystając z naszej funkcji pomocniczej z góry:
Console.WriteLine(GetStaticType(o));
Wartość zmiennych typu, takich jak int, double, System.Guid, wiesz, że typ run-time zawsze będzie taki sam jak typ statyczny, ponieważ typy wartości nie mogą służyć jako klasa bazowa dla innego typu; typ wartości jest typem najbardziej pochodnym w łańcuchu dziedziczenia. Dotyczy to również zapieczętowanych typów odwołań: jeśli typ statyczny jest zapieczętowanym typem odwołania, wartość czasu wykonywania musi być instancją tego typu lub null.
I odwrotnie, jeśli typ statyczny zmiennej jest typem abstrakcyjnym, gwarantuje się, że typ statyczny i typ środowiska wykonawczego będą różne.
Aby zilustrować to w kodzie:
int i = 0;
Console.WriteLine(i.GetType() == typeof(int));
string s = "Foo";
Console.WriteLine(s == null || s.GetType() == typeof(string));
object o = new FileInfo("C:\\f.txt");
Console.WriteLine(o == null || o.GetType() == typeof(object));
FileSystemInfo fsi = new DirectoryInfo("C:\\");
Console.WriteLine(fsi == null || fsi.GetType() == typeof(FileSystemInfo));
int