2015-09-03 19 views
8

Dòng fixed (int* pArray = &array[0]) từ ví dụ dưới đây có ghim toàn bộ mảng hay chỉ array[0]?Cách ghim toàn bộ mảng trong C# bằng cách sử dụng từ khóa cố định

int array = new int[10]; 
unsafe { 
    fixed (int* pArray = &array[0]) { } // or just 'array' 
} 
+0

tôi nghĩ là không. bạn phải làm 'fixed (int * pArray = array)' –

+0

@M.kazemAkhgary, không, điều đó sẽ không hoạt động: 'CS0208 Không thể lấy địa chỉ, lấy kích thước, hoặc khai báo con trỏ tới kiểu được quản lý ('int []')' –

+2

@ThomasLevesque không đặt '&' before 'array '. chỉ cần viết '(int * pArray = mảng)' –

Trả lời

6

Các tuyên bố sau:

fixed (int* pArray = array) 

sẽ sửa chữa các hoàn mảng. Bằng chứng có thể được tìm thấy trong C# language specification (Mục 18.6 Tuyên bố cố định, tôi nhấn mạnh):

Một cố định con trỏ-initializer có thể là một trong những cách sau:

...

  • Biểu thức kiểu mảng với các phần tử của kiểu không được quản lý T, với điều kiện loại T * được chuyển đổi hoàn toàn thành kiểu con trỏ được đưa ra trong câu lệnh cố định. Trong trường hợp này, bộ khởi tạo tính toán địa chỉ của phần tử đầu tiên trong mảng, và toàn bộ mảng được đảm bảo duy trì ở một địa chỉ cố định trong khoảng thời gian của câu lệnh cố định. ...

Các tuyên bố sau:

fixed (int* pArray = &array[0]) 

sửa địa chỉ của phần tử mảng đầu tiên. Một lần nữa, một trích dẫn từ các đặc điểm kỹ thuật (từ một ví dụ được tìm thấy trong chương đó):

...  
[third fixed statement:] fixed (int* p = &a[0]) F(p); 
... 

... và báo cáo kết quả thứ ba sửa và có được địa chỉ của một phần tử mảng.


Side lưu ý: Tôi sẽ giả định rằng bất kỳ thực hiện lành mạnh điều này khắc phục các yếu tố đầu tiên chỉ đơn giản là sửa chữa toàn bộ mảng, nhưng thông số kỹ thuật dường như không chắc rằng điều này.

Đào một chút sâu hơn vào các mã ví dụ trong đặc tả cho thấy như sau:

...  
[third fixed statement:] fixed (int* p = &a[0]) F(p); 
[fourth fixed statement:] fixed (int* p = a) F(p); 
... 

Tuyên bố cố định thứ tư trong ví dụ trên tạo ra một kết quả tương tự như thứ ba.

Thật không may, họ không xác định chính xác những gì họ có ý nghĩa bởi "kết quả tương tự", nhưng nó là đáng chú ý là họ không nói "cùng kết quả".

Các vấn đề liên quan