มีประเด็นสำคัญและละเอียดอ่อนที่ไม่มีประเด็นใดกล่าวถึงโดยตรง มีสองวิธีในการพิจารณาประเภทใน C #: ประเภทคงที่และประเภทเวลาทำงาน
ประเภทคงที่คือประเภทของตัวแปรในซอร์สโค้ดของคุณ ดังนั้นจึงเป็นแนวคิดเวลาคอมไพล์ นี่คือประเภทที่คุณเห็นในคำแนะนำเครื่องมือเมื่อคุณวางเมาส์เหนือตัวแปรหรือคุณสมบัติในสภาพแวดล้อมการพัฒนาของคุณ
คุณสามารถรับประเภทคงที่ได้โดยการเขียนวิธีการทั่วไปของผู้ช่วยเพื่อให้การอนุมานประเภทดูแลคุณ:
Type GetStaticType<T>(T x) { return typeof(T); }
ประเภทรันไทม์คือประเภทของวัตถุในหน่วยความจำ จึงเป็นแนวคิดรันไทม์ นี่คือประเภทที่ส่งคืนโดยGetType()วิธีการ
ประเภทรันไทม์ของออบเจ็กต์มักจะแตกต่างจากประเภทคงที่ของตัวแปรคุณสมบัติหรือวิธีการที่เก็บหรือส่งคืน ตัวอย่างเช่นคุณสามารถมีรหัสดังนี้:
object o = "Some string";
ประเภทคงที่ของตัวแปรobjectแต่ในเวลาทำงานประเภทของตัวแปรที่อ้างอิงstringเป็น ดังนั้นบรรทัดถัดไปจะพิมพ์ "System.String" ไปที่คอนโซล:
Console.WriteLine(o.GetType());
แต่ถ้าคุณวางเมาส์เหนือตัวแปรoในสภาพแวดล้อมการพัฒนาของคุณคุณจะเห็นประเภทSystem.Object(หรือobjectคำหลักที่เทียบเท่า) คุณจะเห็นสิ่งเดียวกันโดยใช้ฟังก์ชันตัวช่วยของเราจากด้านบน:
Console.WriteLine(GetStaticType(o));
สำหรับตัวแปรค่าชนิดเช่นint, double, System.Guidคุณรู้ว่าชนิดเวลาทำงานจะเป็นเช่นเดียวกับประเภทคงเพราะค่าชนิดไม่สามารถทำหน้าที่เป็นชั้นฐานสำหรับประเภทอื่น ประเภทค่าได้รับการรับรองว่าเป็นประเภทที่ได้รับมากที่สุดในสายการสืบทอด นี้ยังเป็นจริงชนิดปิดผนึกอ้างอิง: nullถ้าประเภทคงเป็นชนิดปิดผนึกอ้างอิงค่าเวลาทำงานอย่างใดอย่างหนึ่งจะต้องเป็นตัวอย่างของประเภทนั้นหรือ
ในทางกลับกันหากประเภทคงที่ของตัวแปรเป็นประเภทนามธรรมก็รับประกันได้ว่าประเภทคงที่และประเภทรันไทม์จะแตกต่างกัน
เพื่อแสดงให้เห็นว่าในรหัส:
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