Span<T>
là bản chất chỉ có ngăn xếp trong khi Memory<T>
có thể sử dụng vùng heap.
Span<T>
là một loại mới, chúng tôi đang bổ sung thêm cho nền tảng để đại diện cho vùng tiếp giáp bộ nhớ tùy ý, với hiệu suất đặc điểm ngang bằng với T []. API của nó tương tự như mảng, nhưng không giống như mảng, nó có thể trỏ đến bộ nhớ được quản lý hoặc riêng hoặc tới bộ nhớ được cấp phát trên ngăn xếp.
Memory <T>
là loại bổ sung Span<T>
. Như đã thảo luận trong tài liệu thiết kế , Span<T>
là loại chỉ có ngăn xếp. Bản chất chỉ có ngăn xếp của Span<T>
làm cho nó không phù hợp với nhiều trường hợp yêu cầu lưu trữ các tham chiếu vào bộ đệm (được biểu diễn bằng Span<T>
) trên heap, ví dụ: cho thường trình thực hiện cuộc gọi không đồng bộ.
async Task DoSomethingAsync(Span<byte> buffer) {
buffer[0] = 0;
await Something(); // Oops! The stack unwinds here, but the buffer below
// cannot survive the continuation.
buffer[0] = 1;
}
Để giải quyết vấn đề này, chúng tôi sẽ cung cấp một tập hợp các loại bổ sung, dự định sẽ được sử dụng như các loại trao đổi mục đích chung đại diện, giống như Span <T>
, một loạt các bộ nhớ tùy ý, nhưng không giống như Span <T>
các loại này sẽ không được xếp chồng lên nhau, với chi phí đáng kể là các hình phạt về hiệu suất cho việc đọc và ghi vào bộ nhớ.
async Task DoSomethingAsync(Memory<byte> buffer) {
buffer.Span[0] = 0;
await Something(); // The stack unwinds here, but it's OK as Memory<T> is
// just like any other type.
buffer.Span[0] = 1;
}
Trong ví dụ trên, các Memory <byte>
được sử dụng để đại diện cho các bộ đệm. Đây là loại thông thường và có thể được sử dụng trong các phương thức thực hiện cuộc gọi không đồng bộ. Thuộc tính Span của nó trả về Span<byte>
, nhưng giá trị trả lại không được lưu trữ trên heap trong các cuộc gọi không đồng bộ, mà là giá trị mới được tạo ra từ giá trị Memory<T>
. Theo nghĩa nào đó, Memory<T>
là một nhà máy của Span<T>
.
tham khảo tài liệu: here
Xem thêm: [C# 7.2: Tìm hiểu về Span] (https://channel9.msdn.com/Events/Connect/2017/T125) –
@JeffMercado Có danh sách đầy đủ ở đâu đó về loại C# mà họ có thể thay thế ngoài chuỗi không []? Chúng chỉ dành cho mảng hoặc chúng có thể được sử dụng thay cho các loại như Danh sách không? –
user3610374