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 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access