Unsafe Codes and Pointers in C#

 

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.

 

Pointers in C#:

For every value type or pointer type V in a C# program, there is a corresponding C# pointer type named V*. A pointer instance holds the address of a value. That value is considered to be of type V, but pointer types can be (unsafely) cast to any other pointer type. As shown below we have pointer operators supported by the C# language.

 

& - 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 A->B is equivalent to (*A).B

 

Unsafe Code in C#:

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 that uses 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;

              }

            }