<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://techcorner.max-it.de/index.php?action=history&amp;feed=atom&amp;title=Lokale_Funktionen_in_C-Sharp_%28Local_Functions%29</id>
	<title>Lokale Funktionen in C-Sharp (Local Functions) - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://techcorner.max-it.de/index.php?action=history&amp;feed=atom&amp;title=Lokale_Funktionen_in_C-Sharp_%28Local_Functions%29"/>
	<link rel="alternate" type="text/html" href="https://techcorner.max-it.de/index.php?title=Lokale_Funktionen_in_C-Sharp_(Local_Functions)&amp;action=history"/>
	<updated>2026-10-17T10:53:20Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in maxTechCorner</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://techcorner.max-it.de/index.php?title=Lokale_Funktionen_in_C-Sharp_(Local_Functions)&amp;diff=4292&amp;oldid=prev</id>
		<title>imported&gt;TechCorner-Redaktion: Neufassung von &quot;C-sharp 7 - Local Functions&quot;: Beispiele statt PDF, statische lokale Funktionen, Vergleich mit Lambdas</title>
		<link rel="alternate" type="text/html" href="https://techcorner.max-it.de/index.php?title=Lokale_Funktionen_in_C-Sharp_(Local_Functions)&amp;diff=4292&amp;oldid=prev"/>
		<updated>2026-10-14T00:00:00Z</updated>

		<summary type="html">&lt;p&gt;Neufassung von &amp;quot;C-sharp 7 - Local Functions&amp;quot;: Beispiele statt PDF, statische lokale Funktionen, Vergleich mit Lambdas&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Steckbrief&lt;br /&gt;
| gilt_fuer   = C# 7.0 bis C# 14 (.NET 10); statische lokale Funktionen ab C# 8, Attribute ab C# 9&lt;br /&gt;
| bereich     = Softwareentwicklung&lt;br /&gt;
| dauer       = ca. 10 Minuten Lesezeit&lt;br /&gt;
| rechte      = –&lt;br /&gt;
| stand       = Oktober 2026&lt;br /&gt;
}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lokale Funktionen in C#&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;Local Functions&amp;#039;&amp;#039;) sind Methoden, die innerhalb einer anderen Methode definiert werden. Hilfslogik, die nur an einer Stelle gebraucht wird, bleibt so direkt beim Aufrufer, ist von außen nicht aufrufbar und macht Klassen übersichtlicher. Eingeführt mit C# 7, wurden sie in späteren Versionen um statische lokale Funktionen und Attribute erweitert.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Lokale-Funktionen-CSharp.png|thumb|center|750px|Lokale Funktionen in C#: Hilfsmethode innerhalb einer Methode und Vergleich mit Lambda-Ausdrücken.]]&lt;br /&gt;
&lt;br /&gt;
== Grundprinzip ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
public decimal Gesamtpreis(IEnumerable&amp;lt;Position&amp;gt; positionen, decimal rabattProzent)&lt;br /&gt;
{&lt;br /&gt;
    if (rabattProzent is &amp;lt; 0 or &amp;gt; 100)&lt;br /&gt;
        throw new ArgumentOutOfRangeException(nameof(rabattProzent));&lt;br /&gt;
&lt;br /&gt;
    return positionen.Sum(p =&amp;gt; Netto(p) * (1 - rabattProzent / 100));&lt;br /&gt;
&lt;br /&gt;
    // lokale Funktion: nur innerhalb von Gesamtpreis sichtbar&lt;br /&gt;
    decimal Netto(Position p) =&amp;gt; p.Menge * p.Einzelpreis;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die lokale Funktion darf am Ende der Methode stehen und trotzdem vorher aufgerufen werden – das hält den Hauptablauf oben lesbar.&lt;br /&gt;
&lt;br /&gt;
== Typische Einsatzfälle ==&lt;br /&gt;
=== Argumentprüfung bei Iteratoren und async-Methoden ===&lt;br /&gt;
Bei &amp;lt;code&amp;gt;yield return&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;async&amp;lt;/code&amp;gt; laufen Prüfungen sonst erst beim ersten Durchlauf bzw. landen in der Task. Mit einer lokalen Funktion wird sofort geprüft:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
public static IEnumerable&amp;lt;int&amp;gt; Bereich(int start, int anzahl)&lt;br /&gt;
{&lt;br /&gt;
    ArgumentOutOfRangeException.ThrowIfNegative(anzahl);   // greift sofort&lt;br /&gt;
    return Iterator();&lt;br /&gt;
&lt;br /&gt;
    IEnumerable&amp;lt;int&amp;gt; Iterator()&lt;br /&gt;
    {&lt;br /&gt;
        for (var i = 0; i &amp;lt; anzahl; i++)&lt;br /&gt;
            yield return start + i;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rekursion ohne zusätzliche Klassenmethode ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
public static long Fakultaet(int n)&lt;br /&gt;
{&lt;br /&gt;
    ArgumentOutOfRangeException.ThrowIfNegative(n);&lt;br /&gt;
    return Berechne(n);&lt;br /&gt;
&lt;br /&gt;
    static long Berechne(int x) =&amp;gt; x &amp;lt;= 1 ? 1 : x * Berechne(x - 1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Statische lokale Funktionen (ab C# 8) ==&lt;br /&gt;
Mit &amp;lt;code&amp;gt;static&amp;lt;/code&amp;gt; darf die lokale Funktion &amp;#039;&amp;#039;&amp;#039;keine&amp;#039;&amp;#039;&amp;#039; Variablen der umgebenden Methode verwenden („capturen“). Der Compiler meldet versehentliche Zugriffe als Fehler, und es entstehen keine versteckten Allokationen für Closures. Faustregel: lokale Funktionen standardmäßig &amp;lt;code&amp;gt;static&amp;lt;/code&amp;gt; machen, solange sie keinen Zustand der Methode brauchen.&lt;br /&gt;
&lt;br /&gt;
== Lokale Funktion oder Lambda? ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Kriterium !! Lokale Funktion !! Lambda-Ausdruck&lt;br /&gt;
|-&lt;br /&gt;
| Rekursion || direkt möglich || nur über Umwege&lt;br /&gt;
|-&lt;br /&gt;
| Generische Typparameter || ja || nein&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;yield return&amp;lt;/code&amp;gt; (Iterator) || ja || nein&lt;br /&gt;
|-&lt;br /&gt;
| Speicher || meist ohne Heap-Allokation, mit &amp;lt;code&amp;gt;static&amp;lt;/code&amp;gt; garantiert || erzeugt einen Delegaten, ggf. mit Closure&lt;br /&gt;
|-&lt;br /&gt;
| Attribute an Funktion und Parametern || ja (ab C# 9) || ja (ab C# 10)&lt;br /&gt;
|-&lt;br /&gt;
| Als Wert übergeben (Delegat) || möglich, wird dann umgewandelt || ja, dafür gedacht&lt;br /&gt;
|}&lt;br /&gt;
Lambdas bleiben die erste Wahl für kurze Ausdrücke in LINQ-Abfragen und Event-Handlern; für mehrzeilige Hilfslogik sind lokale Funktionen lesbarer.&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Nicht übertreiben:&amp;#039;&amp;#039;&amp;#039; Wird die Hilfslogik an mehreren Stellen gebraucht oder lässt sie sich sinnvoll testen, gehört sie in eine eigene (private) Methode.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Verfügbarkeit:&amp;#039;&amp;#039;&amp;#039; Lokale Funktionen funktionieren in allen aktuellen .NET-Versionen; auch .NET-Framework-Projekte können sie nutzen, wenn ein aktueller Compiler (Visual Studio 2022/2026) verwendet wird.&lt;br /&gt;
* Bei Architektur und Code-Qualität Ihrer .NET-Anwendungen unterstützt Sie die [https://www.max-it.de/development/individuelle-softwareentwicklung/ individuelle Softwareentwicklung von m.a.x. it].&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[HTML in C-Sharp bearbeiten mit AngleSharp]]&lt;br /&gt;
* [[.NET MAUI: MVVM mit dem CommunityToolkit.Mvvm statt MvvmLight]]&lt;br /&gt;
&lt;br /&gt;
== Links und Quellen ==&lt;br /&gt;
* [https://learn.microsoft.com/de-de/dotnet/csharp/programming-guide/classes-and-structs/local-functions Microsoft Learn: Lokale Funktionen]&lt;br /&gt;
* [https://www.max-it.de/development/individuelle-softwareentwicklung/ Individuelle Softwareentwicklung von m.a.x. it]&lt;br /&gt;
&lt;br /&gt;
{{Uebermax}}&lt;br /&gt;
[[Kategorie:Softwareentwicklung]]&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;TechCorner-Redaktion</name></author>
	</entry>
</feed>