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
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);}// Usagevar 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.