2017-07-13 14 views
5

Vì vậy, tôi không có kiến ​​thức chuyên sâu về cách dữ liệu được lưu trữ trong Khuôn khổ .NET về loại tùy chỉnh, nhưng tôi đang tìm kiếm giải thích về cách hệ thống truyền đang hoạt động.Nguyên nhân đúc Các GetTypes khác nhau

Ví dụ, nếu ai đó làm một diễn viên rõ ràng từ một Struct ValueType như Char vào Byte như sau:

char C = '#'; 
byte B = (byte)C; 
Console.WriteLine(B.GetType()); // Outputs "Byte" 

tôi sẽ được cho biết rằng B là một Byte, mà làm cho cảm giác hoàn hảo.

Bây giờ nói tôi đúc từ một Custom Class Flower để Nhà máy cơ sở lớp của nó, tại sao sản lượng tiết lộ lớp được thừa kế không phụ thuộc vào dàn diễn viên như sau:

class Plant{} 
class Flower:Plant{} 

.

Flower Rose = new Flower(); 
Plant RoseBush = (Plant)Rose; 
Console.WriteLine(RoseBush.GetType()); //Outputs Flower 

Plant Rose = new Flower(); 
Plant RoseBush = (Plant)Rose; 
Console.WriteLine(RoseBush.GetType()); //Outputs Flower as well 

Tôi đoán câu hỏi của tôi là, tại sao loại không hiển thị loại tùy chỉnh hiện tại, đó là Nhà máy và tại sao điều này khác với Loại giá trị ngay từ đầu?

Ngoài ra, tại sao hai ví dụ với hoa và thực vật, mặc dù được viết khác trên dòng đầu tiên, cũng xuất ra cùng một thứ?

Trả lời

8

Kết quả của lần truyền đầu tiên là giá trị khác nhau. Hiện tại, nó là byte không phải là char.

Diễn viên thứ hai là chuyển đổi tham chiếu . Kết quả là cùng một tập hợp các bit - một tham chiếu đến cùng một đối tượng - chỉ với một kiểu thời gian biên dịch khác. GetType() trả lại thực tế loại thời gian thực hiện của đối tượng, giống nhau trong cả hai trường hợp (vì nó là cùng một đối tượng).

Bạn có thể quan sát này trong ví dụ của bạn:

// Variable names modified to follow normal conventions 
Flower rose = new Flower(); 
Plant roseBush = (Plant) rose; 
Console.WriteLine(ReferenceEquals(rose, roseBush)); // True 

Casts với nhiều loại tài liệu tham khảo thể kết quả trong các giá trị khác nhau, tâm trí bạn, nếu họ đang chuyển đổi tùy chỉnh - nhưng những người không phải là "chuyển đổi tài liệu tham khảo" trong thuật ngữ đặc tả ngôn ngữ. Ví dụ:

XElement element = new XElement("name", "value"); 
string value = (string) element; 

Đây value thực sự không phải là một tham chiếu đến cùng một đối tượng như element - đó là một tham chiếu đến một đối tượng string thay vì một đối tượng XElement, thông qua việc chuyển đổi rõ ràng để string xác định bởi XElement.

2

Cú pháp đúc C# thực hiện những việc khác nhau trong các trường hợp khác nhau. Khi bạn nói về một lớp và lớp cơ sở/lớp con/giao diện, nó là một tham chiếu giữ lại phân đoạn - tất cả những gì bạn thực sự đang làm là kiểm tra kiểu (và thậm chí chỉ trong trường hợp trình biên dịch không thực hiện) t biết rằng nó phải công việc - nó bị bỏ qua khi truyền một loại phụ sang loại cơ sở, ví dụ). Trong trường hợp này, chỉ điều mà thay đổi là loại trình biên dịch/JIT đang nghĩ đến.

Tuy nhiên, có cũng loại chuyển đổi.Đó có thể là inbuilt (như trường hợp nguyên thủy như byte/char) hoặc chúng có thể được cung cấp dưới dạng toán tử chuyển đổi tùy chỉnh (thông qua các từ khóa nhà điều hành implicit hoặc explicit). Trong rằng trường hợp, đó là vào mã những gì xảy ra (nó có thể là bất cứ điều gì).

Vì vậy: sự khác biệt ở đây là sự khác biệt là chuyển đổi nguyên thủy sẵn có và một là kiểm tra loại bảo toàn tham chiếu.

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