Ada masalah penting dan halus yang tidak satupun dari mereka tangani secara langsung. Ada dua cara untuk mempertimbangkan tipe dalam C #: tipe statis dan tipe run-time .
Jenis statis adalah jenis variabel di kode sumber Anda. Oleh karena itu, ini adalah konsep waktu kompilasi. Ini adalah jenis yang Anda lihat di tooltip saat Anda mengarahkan kursor ke atas variabel atau properti di lingkungan pengembangan Anda.
Anda bisa mendapatkan tipe statis dengan menulis metode generik helper agar inferensi tipe mengurusnya untuk Anda:
Type GetStaticType<T>(T x) { return typeof(T); }
Jenis run-time adalah jenis objek dalam memori. Oleh karena itu, ini adalah konsep run-time. Ini adalah tipe yang dikembalikan oleh GetType()metode.
Jenis waktu proses suatu objek sering kali berbeda dari jenis statis variabel, properti, atau metode yang menampung atau mengembalikannya. Misalnya, Anda dapat memiliki kode seperti ini:
object o = "Some string";
Jenis statis variabel adalah object, tetapi pada waktu proses, jenis referensi variabel adalah string. Oleh karena itu, baris berikutnya akan mencetak "System.String" ke konsol:
Console.WriteLine(o.GetType());
Namun, jika Anda mengarahkan kursor ke variabel odi lingkungan pengembangan, Anda akan melihat jenisnya System.Object(atau objectkata kunci yang setara ). Anda juga melihat hal yang sama menggunakan fungsi helper kami dari atas:
Console.WriteLine(GetStaticType(o));
Untuk variabel nilai-jenis, seperti int, double, System.Guid, Anda tahu bahwa jenis run-time akan selalu sama dengan jenis statis, karena jenis nilai tidak dapat berfungsi sebagai kelas dasar untuk jenis lain; jenis nilai dijamin menjadi jenis yang paling banyak diturunkan dalam rantai warisannya. Ini juga berlaku untuk tipe referensi tersegel: jika tipe statis adalah tipe referensi tersegel, nilai run-time harus berupa turunan dari tipe tersebut atau null.
Sebaliknya, jika tipe statis dari variabel tersebut adalah tipe abstrak, maka dijamin tipe statis dan tipe runtime akan berbeda.
Untuk menggambarkannya dalam kode:
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