Cần giải thích phần trong đặc tả C #


11

Tôi đang đọc thông số kỹ thuật C # . Tôi có thể sử dụng làm rõ trên một phân khúc:

C # có một hệ thống loại thống nhất. Tất cả các loại C #, bao gồm các loại nguyên thủy như int và double, kế thừa từ một loại đối tượng gốc duy nhất. Do đó, tất cả các loại chia sẻ một tập hợp các hoạt động chung và các giá trị của bất kỳ loại nào cũng có thể được lưu trữ, vận chuyển và vận hành theo cách thức nhất quán. Hơn nữa, C # hỗ trợ cả loại tham chiếu và loại giá trị do người dùng định nghĩa, cho phép phân bổ động các đối tượng cũng như lưu trữ nội tuyến của các cấu trúc nhẹ.

Việc lưu trữ nội tuyến của các cấu trúc nhẹ có nghĩa là gì trong bối cảnh này?

Câu trả lời:


11

Câu trả lời của Svick là tốt nhưng tôi nghĩ tôi sẽ thêm một vài điểm.

Trước hết, đoạn văn là thiếu sót. Các loại con trỏ không kế thừa từ đối tượng. Các giá trị tại thời điểm biên dịch được biết là các loại giao diện hoặc các loại tham số loại, trong thời gian chạy, sẽ là các tham chiếu không hợp lệ hoặc các trường hợp thực sự của một cái gì đó thừa hưởng từ đối tượng, nhưng nó luôn cấu trúc tôi là kỳ quặc để nói rằng các loại này " kế thừa "từ đối tượng; thừa kế là tài sản mà các thành viên của tổ tiên là thành viên của hậu duệ, nhưng bạn thường không nghĩ "ToString" là một thành viên của IEnumerable. Bạn nghĩ về nó như là một thành viên của điều thực hiện IEnumerable .

Đoạn văn cũng rất thiếu sót vì đây là nơi duy nhất "kiểu nguyên thủy" xuất hiện trong thông số kỹ thuật và nó xuất hiện mà không có định nghĩa. Do đó, nó là không cần thiết và khó hiểu và nên được loại bỏ.

Tôi đã muốn đoạn này được sửa trong một thời gian. Lần sau tôi thấy Mads tôi sẽ nhắc anh ấy.

Để giải quyết câu hỏi cụ thể của bạn: tất nhiên là đúng, nhưng thật hữu ích khi xem một ví dụ cụ thể. Khi bạn nói:

struct ColorfulInt
{
    int value;
    Color color;
    ...
}

và bạn tạo một mảng:

ColorfulInt[] x = new ColorFulInt[100];

Sau đó, bộ lưu trữ cho 100 ints và 100 Colors sẽ nằm trong mảng đó . Nếu ColourInt thay vào đó là một lớp thì mảng sẽ chứa 100 tham chiếu đến ColourInt, mỗi tham số sẽ phải được phân bổ riêng lẻ. Việc phân bổ riêng lẻ hàng trăm phần tử đó sẽ kém hiệu quả hơn cả về thời gian và không gian so với việc phân bổ lưu trữ ngay trong chính mảng.


Vì vậy, tầm quan trọng trong sự trừu tượng hóa bộ nhớ của các đối tượng đó, khi bạn sẵn sàng thao tác với chúng, chúng sẽ dễ dàng truy cập hơn nếu chúng nằm trong một khối các câu thơ không gian địa chỉ tiếp giáp với ai biết ở đâu? Điều đó có đúng không, hay tôi vẫn còn thiếu một cái gì đó?
ChuckT

@ChuckT: Đúng. Bạn không phải trả chi phí đầu tư và bạn cũng có được bộ nhớ cache đẹp.
Eric Lippert

12

Điều đó có nghĩa là các loại giá trị được lưu trữ trực tiếp tại nơi bạn xác định chúng, điều này làm cho chúng hiệu quả hơn khi so sánh với các loại tham chiếu.

Nó chính xác nghĩa là gì? Nếu bạn có một biến cục bộ của một loại giá trị, nó thường sẽ được lưu trữ trực tiếp trên ngăn xếp (nhưng có nhiều trường hợp ngoại lệ). Nếu bạn có một trường thuộc loại giá trị, nó sẽ được lưu trữ trực tiếp trong lớp hoặc cấu trúc kèm theo.


1
Điều đó có ý nghĩa. Cảm ơn vì đã cho tôi biết, Svick!
ChuckT
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.