Đ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
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.
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.
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.
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
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
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. –
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ó.
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.
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());
}
}
foo
và typeof(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.
- 1. Tại sao "typeof" không cần dấu ngoặc đơn?
- 2. Tại sao chức năng Matlab "feval" lại cần thiết?
- 3. Tại sao "annotatedClasses" lại cần thiết nếu có @Entity?
- 4. SwingUtilities.invokeLater() tại sao cần thiết?
- 5. Tại sao nút lưu cần thiết?
- 6. Tại sao cờ - nhánh mới cần thiết?
- 7. Tại sao session_ destroy() là cần thiết?
- 8. tại sao typeof (/./) == 'chức năng' được sử dụng trong gạch
- 9. Tại sao Assert.IsInstanceOfType (0.GetType(), typeof (int)) không thành công?
- 10. typeOf trên loại trả lại
- 11. Truyền tới nút là không cần thiết - Tại sao?
- 12. Tại sao UnderscoreJS sử dụng toString.call() thay vì typeof?
- 13. Chúng tôi có thể có nhiều NSAutoReleasePools không? Tại sao điều này lại cần thiết?
- 14. Tại sao linq-2-sql lại tạo thêm các đối tượng không cần thiết?
- 15. Tại sao time.sleep lại cần thiết để chạy một số goroutine?
- 16. Tại sao chú thích kiểu này trong Haskell cần thiết?
- 17. Tại sao các đối tượng ký tự HTML cần thiết?
- 18. Tại sao session_start là cần thiết khi sử dụng phiên?
- 19. Tại sao từ khóa mới không cần thiết cho Chuỗi
- 20. Phương thức jQuery 1.7 .on(), tại sao cần thiết?
- 21. Tại sao hàm tạo cơ sở() không cần thiết?
- 22. Tại sao RedirectStandardOutput không có mã ANSI cần thiết?
- 23. Tại sao biểu tượng của PHP lại cần setlocale?
- 24. Tại sao CruiseControl.NET cần được khởi động lại sau GetCcNetConfigFiles?
- 25. Tại sao System.Type.GetType ("Xyz") trả về null nếu typeof (Xyz) tồn tại?
- 26. Enum.GetValues (typeof (....)) không trả lại enum đúng giá trị
- 27. Tại sao đối tượng Enum.Parse() trả lại?
- 28. Tại sao JAXB lại cần một hàm tạo arg cho việc sắp xếp lại?
- 29. Làm cho Phần mềm sẵn sàng cho Màn hình Retina - Tại sao điều này lại cần thiết?
- 30. Tại sao deallocation lại chậm?
Có, nhưng câu hỏi là: tại sao? –
@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
Ah, tôi hiểu, đã bỏ lỡ phần đó của câu trả lời, d'oh! +1 –