Bất cứ khi nào bạn phân bổ một mảng mới trong C# vớikhởi mảng trực tiếp với một giá trị không đổi
new T[length]
các mục mảng được thiết lập để mặc định của T. Đó là null
đối với trường hợp mà T
là một loại tài liệu tham khảo hoặc kết quả của hàm tạo mặc định là T
, nếu T
là một loại giá trị.
Trong trường hợp của tôi, tôi muốn khởi tạo một mảng Int32
với giá trị -1:
var myArray = new int[100];
for (int i=0; i<myArray.Length; i++) { myArray[i] = -1; }
Vì vậy, sau khi bộ nhớ được dành riêng cho mảng, CLR vòng qua bộ nhớ vừa được cấp phát và đặt tất cả các mục để mặc định (int) = 0. Sau đó, mã của tôi đặt tất cả các mục vào -1.
Điều đó làm cho việc khởi tạo không cần thiết. Liệu JIT có phát hiện ra điều này và bỏ qua việc khởi tạo đến 0 và nếu không, có cách nào để trực tiếp khởi tạo một phần bộ nhớ với một giá trị tùy chỉnh không?
Tham chiếu đến C# Array initialization - with non-default value, sử dụng Enumerable.Repeat(value, length).ToArray()
không có tùy chọn, vì Enumerable.ToArray
phân bổ mảng mới và sao chép các giá trị cho nó sau đó.
Nếu bạn có byte mảng, sau đó [P/Invoke có thể giúp] (http://stackoverflow.com/a/19060558/380331). Nhưng nếu kích thước phần tử mảng lớn hơn byte (như trong trường hợp của bạn) - phương pháp này sẽ không hữu ích. –