2012-04-18 44 views
9

Có cách nào được thiết lập để trả về mảng 2-d chỉ đọc trong C# không?Chỉ đọc mảng hai chiều trong C#

Tôi biết ReadOnlyCollection là điều phù hợp để sử dụng cho mảng 1-d và vui lòng viết lớp trình bao bọc của riêng tôi triển khai this[] {get}. Nhưng tôi không muốn phát minh lại bánh xe nếu bánh xe này đã tồn tại.

+2

không có gì được tích hợp sẵn cho các mảng đa chiều afaik – BrokenGlass

+0

Dưới đây là một số câu trả lời từ một câu hỏi tương tự trên StackOverflow - http://stackoverflow.com/questions/678379/is-there-a-read-only-generic-dictionary-available -in-net –

+0

Đó không phải là rất giống nhau, @ Scorpion-Prince. –

Trả lời

1

Chỉ có một cách để mô phỏng điều này.

Bạn cần tạo lớp của riêng mình, với một mảng riêng tư.

Việc thực hiện tương tự như hầu hết của một mảng là một indexer:

Các '10 0,8' liên kết cho thấy các mô phỏng của một mảng hai chiều.

Nếu bạn chỉ triển khai trình chỉ mục với trình thu thập dữ liệu, người dùng chỉ có thể đọc các phần tử, nhưng không thể ghi chúng. Tuy nhiên, nếu mỗi phần tử là một đối tượng (kiểu tham chiếu), bạn không thể ngăn chặn việc sửa đổi các thuộc tính của đối tượng được truy cập.

Tuy nhiên, có một số cách để mô phỏng "chỉ đọc" các đối tượng:

  • Tạo một lớp wrapper đó cho thấy nhiều các thuộc tính của mỗi phần tử trong mảng như chỉ đọc tài sản, do đó họ không thể được sửa đổi
  • Sử dụng các loại giá trị nguyên thủy (như int)
  • Đánh bại các thay đổi bằng cách trả về bản sao của phần tử trong mảng riêng thay vì phần tử gốc trong mảng riêng, để thay đổi đối tượng không ảnh hưởng đến đối tượng gốc trong mảng.

Trong các ngôn ngữ khác như C++ có tham chiếu và con trỏ đến giá trị không đổi, nhưng điều này không tồn tại trong C#.

3

Rất tiếc, không có bất kỳ triển khai tích hợp nào để xử lý trường hợp bạn yêu cầu. Nhưng thực hiện đơn giản trên của riêng bạn, không phải là một cái gì đó khó khăn.

Chỉ nghĩ thôi, tôi hy vọng bạn biết về điều đó, bạn sẽ làm là một bộ sưu tập chỉ đọc, nhưng không phải là trong bộ sưu tập đó.

Hy vọng điều này sẽ hữu ích.