này tạo ra một mảng monodimensional mạnh mẽ gõ "trực tiếp":
int[] array = new int[10];
Dưới mui xe nó sử dụng lệnh IL newarr
.
Cái này là tương tự như sử dụng phản ánh để tạo ra một mảng (loại có thể được quyết định trong thời gian chạy)
int[] array2 = (int[])Array.CreateInstance(typeof(int), 10);
Mảng tạo cuối cùng là như nhau nhưng tốc độ của việc tạo ra nó được chậm hơn khi sử dụng Array.CreateInstance
.Lưu ý rằng với Array.CreateInstance
bạn có thể chủ động chọn kiểu mảng (trong cùng một cách mà thông qua phản ánh bạn có thể tạo một thể hiện của một loại nhất định các loại trong thời gian chạy), ví dụ:
Type type = someCondition ? typeof(int) : typeof(string);
Array array2 = Array.CreateInstance(type, 10);
Một sự khác biệt lớn: lớp "cơ sở" Array
được nhập sai (do đó phương pháp của nó sử dụng thông số object
, thay vì int
/string
'/ something
). Vì vậy:
int num = (int)array2.GetValue(1); // You have to cast the return value to int from object
lý do khác để sử dụng
array[5] = 1;
thay vì
array2.SetValue(5, 1);
được rằng phương pháp đầu tiên được tối ưu hóa trong mã IL là truy cập trực tiếp tới một monodimensional mảng (stelem
và ldelem
). Điều này cũng đúng cho GetValue
.
Lý do tôi đang sử dụng thuật ngữ "monodimensional mảng":
Trong NET có hai "loại" của mảng: mảng monodimensional và các mảng "phức tạp" (họ có thể đa chiều , hoặc với phần tử đầu tiên không có chỉ số 0, hoặc cả hai). Nhóm thứ hai chậm hơn nhiều. Các stelem
và ldelem
chỉ hoạt động với các mảng một chiều. Đối với đa chiều mảng/đặc biệt phương pháp "ẩn" được sử dụng để truy cập chúng (C# biên dịch làm thay đổi get và thiết lập để cho các phương pháp này được gọi là) (họ cũng tương tự như các GetValue
/SetValue
của lớp Array
, xem ví dụ https://stackoverflow.com/a/597729/613130)
Họ làm những việc hoàn toàn khác nhau. – asawyer
Khi bạn biết loại tại thời gian biên dịch, tôi không thể thấy * bất kỳ * lợi ích nào khi sử dụng biểu mẫu thứ hai. –
Không giống như hầu hết các lớp, Array cung cấp phương thức CreateInstance, thay vì các hàm tạo công khai, để cho phép ** truy cập bị ràng buộc trễ **. - [Array.CreateInstance Method] (http://msdn.microsoft.com/en-us/library/zb3cfh7k.aspx) – Habib