Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Lesedauer 3 Min.

C# 7: Der richtige Einsatz von ref

Die neue Version von C# unterstützt nun Referenzen mittels des Schlüsselwortes ref. Damit lassen sich etwa schnelle Zugriffe auf Arrays programmieren, die noch dazu sicher sind.
Wer schon mal in C oder C++ entwickelt hat, kennt die Pointer-Spielereien, die man dort macht. Statt den Wert einer Variablen über den Stack zu übergeben, wird die Adresse der Speicherstelle über den Stack übergeben. Damit ist eine direkte Manipulation des Variableninhalts möglich - und allen möglichen Schweinereien Tür und Tor geöffnet. Der große Vorteil diese Vorgehens ist aber, dass damit Manipulation etwa an Array-Elementen immens schnell gehen. Die Gefahr ist aber groß, dass die falschen Speicherstellen verändert werden und das Programm dadurch fehlerhaft wird oder gar abstürzt. Diese Fehler zu finden, ist knifflig.Auch C# bietet eine begrenzte Möglichkeit des Referenzzugriffs. Das Zauberwort heißt unsafe.Was ist das Resultat von der Ausführung von folgendem Code?

class Program
{
  unsafe static void Main(string[] args)
  {
    int i = 42;
    MIncrement(&i);
    Console.WriteLine(i);
  }

  static unsafe void MIncrement(int* x)
  {
    *x = *x + 1;
  }
}
 
Richtig: 43. Da nicht der Wert, sondern die Referenz, also die Adresse der Variablen übergeben wird, verändert MIncrement den Inhalt dieser Variablen. Wie geschrieben, funktionierte das schon mit den ersten Versionen von .NET.

Und dann kam ref

Die Problematik von unsafe-Code hebt Marc Gravell in einem Blogpost hervor, in dem er auch die Möglichkeiten und Grenzen von ref erklärt.
  • Der Garbage Collector weigert sich auch nur zu versuchen, Pointern zu folgen.
  • Es kann unter Umständen beliebiger Code verändert werden.
  • das Schlüsselwort unsafe muss verwendet werden, was zu schwer aufzufindenden Fehlern führen kann.
  • außerdem funktionieren Pointer nur mit einer kleinen Untermenge an Typen.
Aus diesen Gründen sollte man - wenn benötigt - den Code mittels des neuen Schlüsselworts ref formulieren:
class Program
{
  static void Main(string[] args)
  {
    int i = 42;
    MIncrement(ref i);
    Console.WriteLine(i);
  }

  static unsafe void MIncrement(ref int x)
  {
    x = x + 1;
  }
} 
Es kommt das gleich Ergebnis heraus. Trotzdem kann der Garbage Collector aktiv werden und die Gefahr von Bugs ist nicht so groß.

Allerdings muss man - wie bei Referenzen immer - genau aufpassen, was man als Referenz übergibt. Handelt es sich hierbei etwa um eine lokale Variable, auf die außerhalb des Gültigkeitsbereich zugegriffen wird, wird der Compiler das nicht zulassen. Der folgende Code führt zu einem Fehler bei der Kompilierung: Das lokale Element i kann nicht als Verweis zurückgegeben werden, weil es kein lokales ref-Elelement ist.
ref int ReturnInvalidStackReference()
{
    int i = 32;
    return ref i; // can't do this
}
void WhatHappensHere()
{
    ref int v = ref ReturnInvalidStackReference();
    CallSomeOtherMethods(); // to use the stack
    int i = v; // dereference the ref
} 
Besonders interessant sind aber Referenzen in Bezug auf Arrays:
ref int GetArrayReference(int[] items, int index)
    => ref items[index];

void IncrementInsideArrayByRef()
{
    int[] values = { 1, 2, 3 };

    ref int item = ref GetArrayReference(values, 1);
    IncrementByRef(ref item);
    // what does this line print, and why?
    Console.WriteLine(string.Join(",", values));
} 
Damit lassen sich Array-Elemente manipulieren, ohne sie erst auf den Stack legen zu müssen.

Zu den Möglichkeiten schreibt Marc Gravell in seinem Blogpost.
Miscellaneous

Neueste Beiträge

JSON mit T-SQL auswerten - Neues in SQL Server 2025, Teil 2
Die JSON-Unterstützung in SQL Server 2025 erweitert das relationale Modell um die direkte Verarbeitung dokumentbasierter Daten.
6 Minuten
13. Mai 2026
Was Developer in Europa wirklich wollen – und was sie nervt - European Transparent IT Job Market Report
Über 23.000 Stellenanzeigen, mehr als 1.300 befragte IT-Fachleute, sechs europäische Länder: Der Job-Market-Report liefert handfeste Zahlen zu Gehältern, Recruiting-Frust und dem wachsenden Einfluss von KI auf den Arbeitsalltag. Was Developer wirklich wollen – und wo Unternehmen noch deutlich Luft nach oben haben.
3 Minuten
19. Mai 2026
HMAC mit C# und T-SQL - Neues in SQL Server 2025, Teil 3
Kompatible Signaturberechnung über Systemgrenzen hinweg.
4 Minuten
20. Mai 2026

Das könnte Dich auch interessieren

Elektronische Schaltkreise im Browser simulieren - Simulation
Statt mit Steckfeld oder Lötkolben kann man auf dieser Website Schaltungen per Drag and Drop zusammenstellen und deren Verhalten testen.
2 Minuten
26. Jul 2018
C#-.NET-Apps mit WinUI 3 - Komponentenbasierte Apps mit Fluent/FAST, Teil 3
Microsoft macht mit WinUI 3 ein natives User-Experience-Framework für Windows verfügbar, dessen Komponenten auf dem Microsoft-eigenen Design-System Fluent 2 basieren.
23 Minuten
13. Mai 2024
UIs für Linux - Bedienoberflächen entwickeln mithilfe von C#, .NET und Avalonia
Es gibt viele UI-Frameworks für .NET, doch nur sehr wenige davon unterstützen Linux. Avalonia schafft als etabliertes Open-Source-Projekt Abhilfe.
16 Minuten
16. Jun 2025
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige