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 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. Table 4-2 lists the main pointer operators.
Table 4-2. Principal pointer operators
|
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
with a managed object:
unsafe void RedFilter(int[,] bitmap) {
const int length = bitmap.Length;
fixed (int* b = bitmap) {
int* p = b;
for(int i = 0; i < length; i++)
*p++ &= 0xFF;
}
}Unsafe code typically runs faster than a corresponding safe implementation, which in this case would have required a nested loop with array indexing and bounds ...