2010-06-30 45 views
7

Điều mà tôi từng nghĩ đến: Tại sao toán tử typeof cần trong C#? Không trình biên dịch biết rằng public class Animal là một loại chỉ bởi định nghĩa rất? Tại sao tôi cần phải chỉ định SomeMethod(typeof(Animal)) khi tôi cần tham chiếu một loại?Tại sao typeof lại cần thiết?

Trả lời

4

typeof(Class) là cách duy nhất để thể hiện Loại dưới dạng chữ. Khi bạn viết Class.SomeField, bạn có nghĩa là trường tĩnh. Khi bạn viết typeof(Class).SomeField bạn tham chiếu trường của đối tượng của lớp Type đại diện cho lớp của bạn.

+1

Có, nhưng câu hỏi là: tại sao? –

+0

@Daniel Earwicker tại sao? để phân biệt các thành viên tĩnh và các thành viên của nhóm. – Andrey

+0

Ah, tôi hiểu, đã bỏ lỡ phần đó của câu trả lời, d'oh! +1 –

1

Phản ánh cho người mới bắt đầu. Nhiều khả năng trở nên có sẵn khi bạn có thể kiểm tra chính loại đó, thay vì chỉ cần biết những gì nó lộ ra, hoặc nó tồn tại chút nào.

6

Animal chỉ đơn giản là tên của loại, typeof(Animal) trả về đối tượng loại thực tế (System.Type ví dụ). Chắc chắn, nó có thể chỉ có tên kiểu trả về đối tượng kiểu trong mã, nhưng nó làm cho công việc trở nên khó khăn hơn nhiều đối với trình biên dịch/phân tích cú pháp (nhận ra khi một tên kiểu có nghĩa là typeof hay cái gì đó khác) - do đó sự tồn tại của từ khóa typeof. Nó cũng cho là làm cho mã rõ ràng hơn để đọc.

+2

Bạn cũng có thể đặt tên các thuộc tính như loại (thông dụng cho những thứ như 'Màu' hoặc hơn) có thể gây nhầm lẫn hơn nữa, sau đó. – Joey

+0

Thật vậy ... nó yêu cầu trình biên dịch thực sự thông minh, với mục đích rút ngắn mã một cách nhẹ nhàng. – Noldorin

+0

tôi tin rằng từ chúng ta đang tìm kiếm là 'mơ hồ'. có những trường hợp trong đó 'someVariable.GetType() == Animal' có thể không rõ ràng. là 'Động vật' trong đoạn trích trước một định nghĩa lớp hoặc thành viên? nếu 'typeof' không được sử dụng thì' Animal' * phải * là một thành viên. nếu 'typeof' được sử dụng thì' Animal' * phải * là định nghĩa lớp. –

0

typeof() cho phép tôi lấy một thể hiện của đối tượng Kiểu mà không cần phải có một cá thể của đối tượng đích trong tay. Điều này lần lượt cho phép tôi đặt câu hỏi về lớp học mà không có một ví dụ của nó.

0

Vâng, làm thế nào để bạn có được System.Type của một lớp mà không instantiating lớp đầu tiên, nếu bạn không sử dụng typeof operatore? Đơn giản, bạn không thể: D

Vì bạn có thể thực hiện rất nhiều công cụ phản chiếu chỉ với một System.Type, toán tử này rất tiện dụng.

3

Không có typeof không gây ra sự mơ hồ:

class foo 
{ 
    public static string ToString() 
    { 
     return "Static"; 
    } 
} 
public class Program 
{ 
    private static void Main(string[] args) 
    { 
     Console.WriteLine(foo.ToString()); 
     Console.WriteLine(typeof(foo).ToString()); 
    } 
} 

footypeof(foo) không đề cập đến những điều tương tự, và buộc các trình biên dịch để giả vờ họ là một ý tưởng tồi, thậm chí nếu chúng ta bỏ qua sự nhập nhằng này.

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