capypad
0 Tage Serie
csharp / expert
Snippet

Unsafe Accessors für Zero-Overhead-Zugriff auf private Member

Eingeführt in C# 12 ermöglichen Unsafe Accessors den Zugriff auf private Member anderer Klassen ohne die Performance-Einbußen von Reflection. Durch die Verwendung des [UnsafeAccessor]-Attributs auf einer externen statischen Methode generiert der Compiler eine direkte IL-Referenz auf das private Feld oder die Methode, was den Zugriff so schnell wie bei öffentlichen Membern macht und Sichtbarkeitsbeschränkungen umgeht.

snippet.csharp
csharp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System.Runtime.CompilerServices;
 
public class DataBuffer {
private int _secretId = 42;
}
 
public class Accessor {
[UnsafeAccessor(UnsafeAccessorKind.Field, Name = "_secretId")]
public static extern ref int GetSecretId(DataBuffer buffer);
}
 
// Usage
var buffer = new DataBuffer();
ref int id = ref Accessor.GetSecretId(buffer);
id = 100; // Directly modifies private field
Erklärung
1
[UnsafeAccessor(UnsafeAccessorKind.Field, Name = "_secretId")]
Anweisung an den Compiler, diese Methode mit einem privaten Feld namens _secretId zu verknüpfen.
2
public static extern ref int GetSecretId(DataBuffer buffer);
Definiert eine externe Methode, die eine Referenz auf das private Integer-Feld zurückgibt.
3
ref int id = ref Accessor.GetSecretId(buffer);
Ruft die Referenz ab und ermöglicht die direkte Änderung des privaten Zustands.