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

PandaOS: Die Workstation, die ich mir immer gewünscht habe
Monatelang bin ich zwischen KI-Werkzeugen hin- und hergesprungen. Cursor, Claude Code, OpenCode, Aider. Jedes hatte etwas Geniales, doch keines fühlte sich vollständig an. Also habe ich ein eigenes Tool gebaut? PandaOS ist das Ergebnis.
6 Minuten
KI bedeutet Developer-Level – Agentic Coding braucht Pro-Code
Agentic Coding auf einem geschlossenen Low-Code-Builder kombinieren? Lieber nicht. Denn wer seine Plattform nicht für Developer gebaut hat, hat sie nicht für KI gebaut.
6 Minuten
30. Jul 2026
AI Slop vermeiden: Harness-First Engineering für Teams, die mit Coding Agenten arbeiten - Der neue Engpass heißt Vertrauen
Coding Agents wie GitHub Copilot, Cursor oder Claude Code haben die Produktivität von Entwicklungsteams dramatisch erhöht. Was früher Tage dauerte, entsteht heute in Stunden. Doch mit der Geschwindigkeit wächst ein neues Problem: Der Engpass liegt inzwischen im Vertrauen in das, was geschrieben wurde.
4 Minuten
4. Aug 2026

Das könnte Dich auch interessieren

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
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
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