2010-12-27 32 views

Trả lời

23

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:

  • Bạn không cần phải biết loại tại thời gian biên dịch (và thường bạn không)
  • Bạn làm cần có được một thể hiện của kiểu (vì nếu không bạn có không có gì để gọi GetType trên)
  • loại thực tế không cần phải được tiếp cận với mã của bạn - ví dụ, nó có thể là một loại nội bộ trong một hội đồng khác nhau

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.

7

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.

+4

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. –

+0

@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. –

+0

typeof (ví dụ) sẽ không biên dịch phải không? – Gishu

2

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()) 
0

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à Pageobject.

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.

Các vấn đề liên quan