thể trùng lặp:
Type Checking: typeof, GetType, or is?Sự khác biệt của việc nhập Kiểu bằng cách sử dụng GetType() và typeof() là gì?
Đó là một trong những cách ưa thích để nhận được các loại?
thể trùng lặp:
Type Checking: typeof, GetType, or is?Sự khác biệt của việc nhập Kiểu bằng cách sử dụng GetType() và typeof() là gì?
Đó là một trong những cách ưa thích để nhận được các loại?
Bạn chỉ có thể sử dụng typeof()
khi bạn biết loại đó tại thời gian biên dịch và bạn đang cố gắng lấy đối tượng Type
tương ứng. (Mặc dù loại có thể là thông số loại chung, ví dụ: typeof(T)
trong một lớp có thông số loại T
.) Không cần phải có bất kỳ trường hợp nào của loại đó có sẵn để sử dụng typeof
. Toán hạng cho typeof
luôn là tên của thông số loại hoặc loại. Nó không thể là một biến hay bất cứ thứ gì như thế.
Bây giờ, hãy so sánh điều đó với object.GetType()
. Điều đó sẽ nhận được loại thực tế của đối tượng mà nó được gọi. Điều này có nghĩa:
GetType
trên)một điểm lẻ: GetType
sẽ cung cấp cho bất ngờ câu trả lời về các loại giá trị vô hiệu do cách thức hoạt động của boxing. Cuộc gọi đến GetType
sẽ luôn liên quan đến quyền lợi bất kỳ loại giá trị nào, bao gồm loại giá trị có thể đặt giá trị và giá trị được đóng gói của loại giá trị không có giá trị là tham chiếu null hoặc tham chiếu đến một thể hiện của loại giá trị không thể null.
GetType() hoạt động trong thời gian chạy, typeof() là toán tử thời gian biên dịch.
Vì vậy,
// untested, schematic
void ShowType(Object x)
{
Write(x.GetType().Name); // depends on actual type
// typeof(x) won't actually compile
Write(typeof(x).Name); // always System.Object
}
ShowType("test");
Sẽ in System.String và System.Object.
Xem this question để có ví dụ tốt hơn.
GetType là một phương pháp ảo trên đối tượng - điều này có nghĩa là đưa ra một thể hiện của một lớp, bạn có thể truy xuất đối tượng Type tương ứng.
typeof là toán tử C# - được sử dụng để thực hiện tra cứu thời gian biên dịch tức là Cho biểu tượng đại diện cho tên Lớp, truy xuất đối tượng Kiểu cho nó.
if (typeof(String) == "test".GetType())
Không hoàn toàn giống nhau và sự cố xuất hiện khi bạn sử dụng thừa kế .
I.e.:
WebPage1
thừa hưởng từ Page
, và điều này cũng được thừa hưởng từ Object
, vì vậy nếu bạn kiểm tra cho (new WebPage1()).GetType() == typeof(object)
nó sẽ trả về false vì loại là khác nhau, nhưng khi bạn kiểm tra bằng cách sử dụng toán tử is
đó là sự thật.
((new WebPage1()) is object)
là đúng vì (new WebPage1())
là đối tượng thuộc loại WebPage1
và cũng là Page
và object
.
Các loại có thể khác nhau, nhưng is
kiểm tra xem bạn có thể truyền an toàn tới loại này không.
Thực ra, không thể sử dụng 'typeof' với một cá thể, vì vậy' typeof (x) 'sẽ không biên dịch. –
@Romain: Bạn nói đúng, đã thêm nhận xét. Bạn có thể chứng minh nó phần nào như thế này bằng cách sử dụng một phương pháp chung. –
typeof (ví dụ) sẽ không biên dịch phải không? – Gishu