Tại sao các mảng trong .Net có Độ dài nhưng các loại bộ sưu tập khác có Đếm? [đóng cửa]


23

Trong C # chẳng hạn, mảng có thuộc tính Độ dài. Nhưng các loại bộ sưu tập khác như danh sách, vv có thuộc tính Count. Có một lý do tại sao hai người này là khác nhau? Nếu vậy tôi muốn biết.


4
Tôi không thể tìm thấy tiếng còi của mình, vì vậy tôi không nghĩ rằng chúng tôi sẽ có câu trả lời hay ngày hôm nay :(
MetaFight

4
Chỉ là một phỏng đoán hoang dã, vì tôi không có kiến ​​thức bên trong về cách CLR được thiết kế: các chi tiết về cách các mảng hoạt động được chỉ định trước các loại bộ sưu tập. Gọi thuộc tính Độ dài là tên tự nhiên nhất của nó và vì không có tiêu chuẩn từ trước để tuân thủ, vì vậy đây là điều mà người thiết kế mảng đã chọn sử dụng. Sau đó, các bộ sưu tập đã được chỉ định sau đó, nhưng Độ dài không phù hợp với một số bộ sưu tập (nó ngụ ý tuyến tính, do đó, đối với các bộ sưu tập không có thứ tự, nó không phải là một tên hợp lý) vì vậy Count được chọn là phù hợp hơn về mặt logic.
Jules

4
Tôi đoán bài viết stackoverflow trước đây có câu trả lời đúng.
Doc Brown

6
@MetaFight: Gần đây tôi đã ghi lại một loạt các video giáo dục và tại một thời điểm tôi đề cập rằng tôi không biết tại sao các nhà thiết kế sử dụng cả chiều dài và số đếm. Nó luôn luôn đánh tôi là kỳ quái. Nhận xét từ Jules ở trên có vẻ hợp lý.
Eric Lippert

3
Meta note - Tôi đã bỏ VTC lần thứ 5 vì tôi không tin câu hỏi này có thể được trả lời dứt khoát. Câu trả lời hiện tại là một câu trả lời chắc chắn và hợp lý, nhưng nó không được hỗ trợ bằng chứng. Tương tự như vậy, bình luận của Lippert khiến tôi nghĩ rằng không ai biết câu trả lời vì nó có thể là do sự giám sát trái ngược với quyết định có ý thức.

Câu trả lời:


30

Chúng được đặt tên khác nhau vì về mặt ngữ nghĩa chúng khá khác nhau:

Số lượng bộ sưu tập là số lượng vật phẩm hiện được lưu trữ trong đó và có khả năng thay đổi theo thời gian.

Độ dài của một mảng là số lượng vật phẩm tối đa nó có thể giữ (nó sẽ có chiều dài là 10 ngay cả khi bạn không lưu trữ nhiều vật phẩm trong đó) và không thay đổi.

Thí dụ:

Nếu tôi có một cái xô có thể chứa tối đa 100 quả bóng trong đó thì nó có Chiều dài 100. Nếu tôi đặt 50 quả bóng vào đó thì nó có Đếm là 50.

Nếu tôi thêm 10 quả bóng nữa, Đếm trở thành 60 nhưng Độ dài vẫn là 100. Để thay đổi Độ dài, tôi cần lấy một thùng khác.

Mảng có thể sử dụng từ Độ dài vì dưới mui xe, nó phân bổ một khối liền kề (độ dài) bộ nhớ dựa trên dung lượng nhân với kích thước của vật phẩm. Mặc dù thực tế là lớp List sử dụng "Dung lượng" cho một khái niệm tương tự (mặc dù có thể thay đổi) cho thấy mảng có thể sử dụng từ "Độ dài" vì lý do lịch sử.


12
A T[]có độ dài N luôn lưu trữ chính xác N giá trị của loại T. Về mặt ngữ nghĩa, không phải tất cả các giá trị đó có thể có ý nghĩa (chúng có thể là nullví dụ), nhưng chúng tồn tại. Điều này khác với ý nghĩa thông thường của năng lực ( List<T>ví dụ như được sử dụng ). Bạn đúng mà Countcó thể thay đổi trong khi Lengthkhông thể. Sau đó, một lần nữa, không có gì bắt buộc Countsẽ, trong thực tế, thay đổi. Nó cũng được sử dụng cho các bộ sưu tập bất biến.

@del Nam ơi. đã không nhận ra từ Công suất đã được sử dụng trong C # như thế này. Tôi đã vô tình làm quá tải nó. Cảm ơn đã chỉ ra điều này. Tôi sẽ cập nhật câu trả lời của tôi để làm rõ.
tổ hợp

Sự khác biệt giữa Công suất và Độ dài là - Công suất có thể thay đổi theo vòng đời của đối tượng, trong khi Độ dài luôn giữ nguyên. Nếu tôi thấy thuộc tính Độ dài trên đối tượng, tôi giả sử đó là số tối đa "cứng" (hoặc đường viền / chỉ mục), trong khi nếu tôi thấy thuộc tính Công suất, tôi sẽ giả sử đó là số tối đa "mềm" mà tôi chỉ nên kiểm tra chống lại nếu tôi quan tâm đến hiệu suất.
StoolOne

@StoolOne: Nếu bạn đi theo con đường đó, thì bất kỳ mảng nào cũng sẽ có một count-perperty.
Ded repeatator

1
StringBuilder chết tiệt ... trong các ngôn ngữ chặt chẽ hơn như Vigil, lớp StringBuilder sẽ bị trừng phạt thích đáng vì phá vỡ quy ước github.com/munificent/vigil
Falco
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.