2010-07-03 41 views
12

Những hạn chế của mã không an toàn, trong C# là gì? Ví dụ, tôi có thể làm hầu như tùy ý các phôi con trỏ và số học như thể tôi đang sử dụng C hoặc C++?Mã không an toàn trong C#

Trả lời

11

Có. All bets are off khi không an toàn đang được phát. Đây là ý tưởng đằng sau "không an toàn" - rằng "an toàn" của các loại có thể xác minh được loại bỏ và bạn có thể truyền từ một con trỏ của một loại sang con trỏ thuộc loại khác mà không có thời gian chạy giữ bạn từ shooting yourself in the foot, nếu bạn mong muốn - giống như C hoặc C++.

Dưới đây là một ví dụ về sử dụng các loại con trỏ khác nhau trong C#:

fixed (Byte* dstBytes = &currentImage[0]) 
{ 
    var dstBuffer = (Int64*)dstBytes; 
    const int blockCount = ImageSizeInBytes/sizeof(Int64); 

    for (var j = 0; j < blockCount; j++) 
    { 
     dstBuffer[j] = srcBuffer[j]; 
    } 
} 

Lưu ý kiểu của mảng là Byte[], nhưng sau khi tôi nhận được một Byte* tôi có thể bỏ nó vào Int64* và làm việc với 8 byte tại một thời gian.

+0

+1 Đối với liên kết, (và câu trả lời hay). – Sam

1

Có, bạn có thể tạo điểm con trỏ ở bất cứ đâu bạn muốn.

Tuy nhiên, khi chương trình của bạn đang chạy trong không gian địa chỉ ảo, bạn chỉ có thể truy cập bộ nhớ thực sự tồn tại trong không gian đó, tức là bạn không thể truy cập bất kỳ quy trình nào khác và bạn không thể truy cập bộ nhớ không có. t được phân bổ.

0

Bạn có thể tham khảo trang sau để biết thêm thông tin:

http://msdn.microsoft.com/en-us/library/y31yhkeb.aspx

Mã không an toàn cung cấp khả năng để khai báo con trỏ cho hầu như bất kỳ biến nguyên thủy (loại cơ bản); bạn được phép truyền giữa các loại con trỏ. Số học con trỏ được dựa trên kích thước lưu trữ của kiểu con trỏ, do đó việc áp dụng sau tăng hoặc sau giảm cho con trỏ sẽ tăng địa chỉ bằng sizeof (loại).

3

Có, đó là tất cả. Đây là Unsafe Code Tutorial từ MSDN.

Để tất cả những người nói cách sử dụng này là một ý tưởng khủng khiếp: có, nhưng nó có một lý do. Gần đây, tôi đã phải sử dụng tính năng này (lần đầu tiên), nhận dữ liệu webcam qua API của bên thứ ba trả lại Byte *.