Unsafe Code and Pointers
C# supports direct memory manipulation via pointers within blocks of code marked unsafe
and compiled with the /unsafe
compiler option. Pointer
types are primarily useful for interoperability with C APIs, but they may also be used for
accessing memory outside the managed heap or for performance-critical hotspots.
Pointer Basics
For every value type or pointer type V, there is a corresponding pointer type V*. A pointer instance holds the address of a value. This is considered to be of type V, but pointer types can be (unsafely) cast to any other pointer type.
The main pointer operators are listed below.
Operator |
Meaning |
---|---|
& |
The address-of operator returns a pointer to the address of a value. |
* |
The dereference operator returns the value at the address of a pointer. |
-> |
The pointer-to-member operator is a syntactic shortcut,
in which |
Unsafe Code
By marking a type, type member, or statement block with the unsafe
keyword, you’re permitted to use pointer types and perform C++ style
pointer operations on memory within that scope. Here is an example of using pointers to quickly process a bitmap:
unsafe void RedFilter(int[,] bitmap) { int length = bitmap.Length; fixed (int* b = bitmap) { int* p = b; for(int i = 0; i < length; i++) *p++ &= 0xFF; } }
Unsafe code can run faster than a corresponding safe implementation. In this case, the code would have required a nested loop with array indexing and bounds checking. An unsafe C# method may ...
Get C# 3.0 Pocket Reference, 2nd Edition now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.