.NET › CLR & Runtime

What does the `unsafe` keyword and pointer usage in C# allow, and why would a developer opt into it?

Intermediate

Answer

The `unsafe` keyword enables code blocks that use raw pointers, pointer arithmetic, and direct memory manipulation, bypassing the CLR's normal type-safety and bounds-checking guarantees -- used sparingly for performance-critical scenarios (like high-performance buffer manipulation, interop with native libraries, or certain SIMD operations) where the overhead of managed safety checks is measurably significant and the developer accepts the increased risk of memory-safety bugs in exchange for raw performance.
unsafe {
    fixed (byte* ptr = buffer) {
        for (int i = 0; i < buffer.Length; i++) {
            *(ptr + i) = 0;  // direct pointer manipulation, bypasses bounds checking
        }
    }
}
// Requires <AllowUnsafeBlocks>true</AllowUnsafeBlocks> in the .csproj
Real-world example A high-performance image processing library uses unsafe pointer manipulation to iterate over pixel buffers directly, avoiding the bounds-checking overhead of normal array indexing in a hot loop processing millions of pixels per second.

Common follow-ups: How does Span<T> provide similar performance benefits without needing unsafe code?;What are the risks of unsafe code re-introducing memory corruption bugs?