2011-01-18 39 views
12

Bản sao có thể xảy ra:
Is everything in .NET an object?
How do ValueTypes derive from Object (ReferenceType) and still be ValueTypes?Các loại giá trị kế thừa từ System.Object ... tại sao?

Hi, Tôi chỉ không nhận được nó. System.Object là (tôi nghĩ) kiểu tham chiếu nhưng tất cả các kiểu dữ liệu trong .NET kế thừa từ nó. Ngoài ra các loại giá trị cũng vậy. Tôi không hiểu nó - loại giá trị có giá trị của nó trên stack nhưng nó được thừa kế từ Object? Hy vọng bất kỳ ai cũng có thể giúp tôi hiểu được

+1

Possi ble duplicate .... http: //stackoverflow.com/questions/436211/is-everything-in-net-an-object/436246 –

+6

Tất cả các loại của bạn thuộc về chúng tôi! –

Trả lời

5

Tự hỏi tại sao bạn cho rằng một loại thường được phân bổ trên ngăn xếp sẽ kế thừa từ System.Object và tôi nghĩ bạn sẽ không thể xây dựng một lý do chính đáng.

Nếu bạn cho rằng đó là do đối tượng loại xác định vị trí được phân bổ, bạn nhầm. Thành viên nào của ValueType có trách nhiệm xác định cơ chế phân bổ của nó? (? Có gì thành viên của System.Object, cho rằng vấn đề)

Loại thừa kế trong .NET có nghĩa vụ phải bao gồm "là một" các mối quan hệ: a stringlà mộtobject, ví dụ. Tất cả mọi thứ trong thế giới NET một object, vì vậy một int là một object, một double là một object vv

Bạn có thể nghĩ về điều này trong điều khoản của Liskov substitution principle: nếu tôi viết mã mà hy vọng an object, tôi phải có khả năng giao dịch với bất kỳ loại nào an object —tất cả mọi thứ. Mã của tôi nên không kém phần thoải mái với một string, một int, một List<int> vv

Cũng lưu ý rằng object đảm bảo chắc chắn rằng các thành viên tất cả các loại có như một hệ quả của việc này: GetType, ToString, và GetHashCode.

+1

-1 nó là câu trả lời đáng kể xấu. nó không giải thích bất cứ điều gì. Ngoài ra, mối quan hệ "is-a" KHÔNG có nghĩa là nó phải xuất phát từ cùng một lớp. Tương tự như vậy, một "đối tượng" không có nghĩa là nó phải lấy được từ lớp 'System.Object'. Nó có thể không xuất phát từ bất cứ thứ gì, nhưng vẫn có thể là một vật thể.Câu hỏi tại sao 'ValueType' xuất phát từ' Object' về cơ bản là một câu hỏi về * ngữ nghĩa *, hoặc loại thể loại: kiểu giá trị so với kiểu tham chiếu. – Nawaz

+0

@Nawaz Không đúng. Con trỏ không lấy được từ Object, vì vậy chúng không phải là đối tượng. – IllidanS4

+0

Nó là một huyền thoại C# nổi tiếng rằng các loại giá trị thường được phân bổ trên stack. – RBT

6

Bạn đang đúng khi cho rằng, trong khi đối tượng là một loại tài liệu tham khảo, các loại giá trị làm kế thừa từ nó ngầm, như đã nêu trên tham khảo MSDN cho Value Types (theo tài liệu tham khảo, họ về mặt kỹ thuật kế thừa từ lớp ValueType, mà lần lượt Thừa kế từ đối tượng

C# đã tạo ra một trường hợp đặc biệt cho loại giá trị này vì vậy có thể hưởng lợi từ các phương thức của Object (như ToString) và các thuộc tính. từ việc cắm vào một số int bên trong một mảng của Object s.

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