Freigeben über


Anweisungen (C#-Programmierhandbuch)

Die von einem Programm ausgeführten Aktionen werden in Anweisungen ausgedrückt. Allgemeine Aktionen umfassen das Deklarieren von Variablen, das Zuweisen von Werten, das Aufrufen von Methoden, das Durchlaufen von Auflistungen und das Verzweigen zu einem oder einem anderen Codeblock, abhängig von einer bestimmten Bedingung. Die Reihenfolge, in der Anweisungen in einem Programm ausgeführt werden, wird als Ablauf der Steuerung oder des Ausführungsflusses bezeichnet. Der Steuerungsfluss kann jedes Mal variieren, wenn ein Programm ausgeführt wird, je nachdem, wie das Programm auf Eingaben reagiert, die es zur Laufzeit empfängt.

Eine Anweisung kann aus einer einzelnen Codezeile bestehen, die in einem Semikolon endet, oder aus einer Reihe von einzeiligen Anweisungen in einem Block. Ein Anweisungsblock ist in geschweiften Klammern ({}) eingeschlossen und kann geschachtelte Blöcke enthalten. Der folgende Code zeigt zwei Beispiele für einzeilige Anweisungen und einen mehrzeiligen Anweisungsblock:

    public static void Main()
    {
        // Declaration statement.
        int counter;

        // Assignment statement.
        counter = 1;

        // Error! This is an expression, not an expression statement.
        // counter + 1;

        // Declaration statements with initializers are functionally
        // equivalent to  declaration statement followed by assignment statement:
        int[] radii = [15, 32, 108, 74, 9]; // Declare and initialize an array.
        const double pi = 3.14159; // Declare and initialize  constant.

        // foreach statement block that contains multiple statements.
        foreach (int radius in radii)
        {
            // Declaration statement with initializer.
            double circumference = pi * (2 * radius);

            // Expression statement (method invocation). A single-line
            // statement can span multiple text lines because line breaks
            // are treated as white space, which is ignored by the compiler.
            System.Console.WriteLine($"Radius of circle #{counter} is {radius}. Circumference = {circumference:N2}");

            // Expression statement (postfix increment).
            counter++;
        } // End of foreach statement block
    } // End of Main method body.
} // End of SimpleStatements class.
/*
   Output:
    Radius of circle #1 = 15. Circumference = 94.25
    Radius of circle #2 = 32. Circumference = 201.06
    Radius of circle #3 = 108. Circumference = 678.58
    Radius of circle #4 = 74. Circumference = 464.96
    Radius of circle #5 = 9. Circumference = 56.55
*/

Typen von Anweisungen

In der folgenden Tabelle sind die verschiedenen Typen von Anweisungen in C# und die zugehörigen Schlüsselwörter mit Links zu Themen aufgeführt, die weitere Informationen enthalten:

Kategorie C#-Schlüsselwörter /Notizen
Declaration Statements (Deklarationsanweisungen) Eine Deklarationsanweisung führt eine neue Variable oder Konstante ein. Eine Variabledeklaration kann optional der Variablen einen Wert zuweisen. Bei einer Deklaration einer Konstante ist die Zuweisung erforderlich.
Expression Statements (Ausdrucksanweisungen) Ausdrucksanweisungen, die einen Wert berechnen, müssen den Wert in einer Variablen speichern.
Auswahlanweisungen Auswahlanweisungen helfen Ihnen in unterschiedliche Codeabschnitte zu verzweigen, abhängig von einer oder mehreren angegebenen Bedingungen. Weitere Informationen finden Sie in den folgenden Themen:
Iterationsanweisungen Iterationsanweisungen ermöglichen es Ihnen, Sammlungen wie Arrays zu durchlaufen oder denselben Satz von Anweisungen wiederholt auszuführen, bis eine angegebene Bedingung erfüllt ist. Weitere Informationen finden Sie in den folgenden Themen:
Sprunganweisungen Sprunganweisungen übertragen die Steuerung in einen anderen Codeabschnitt. Weitere Informationen finden Sie in den folgenden Themen:
Ausnahmebehandlungsanweisungen Mit Ausnahmebehandlungsanweisungen können Sie ordnungsgemäß von Ausnahmebedingungen wiederherstellen, die zur Laufzeit auftreten. Weitere Informationen finden Sie in den folgenden Themen:
checked und unchecked Mit den checked- und unchecked-Anweisungen können Sie angeben, ob numerische Operationen vom Integraltyp zu einem Überlauf führen dürfen, wenn das Ergebnis in einer Variablen gespeichert wird, die zu klein ist, um den resultierenden Wert zu speichern.
Die Anweisung await Wenn Sie eine Methode mit dem Modifizierer async kennzeichnen, können Sie den Operator await in der Methode verwenden. Wenn das Steuerelement einen await Ausdruck in der asynchronen Methode erreicht, kehrt das Steuerelement zum Aufrufer zurück, und der Fortschritt in der Methode wird angehalten, bis die erwartete Aufgabe abgeschlossen ist. Wenn die Aufgabe abgeschlossen ist, kann die Ausführung in der Methode fortgesetzt werden.

Ein einfaches Beispiel finden Sie im Abschnitt "Async Methods" von Methods. Weitere Informationen finden Sie unter Asynchrone Programmierung mit Async und Await.
Die Anweisung yield return Ein Iterator führt eine benutzerdefinierte Iteration über eine Sammlung durch, z. B. eine Liste oder ein Array. Ein Iterator verwendet die yield return -Anweisung, um jedes Element einzeln nacheinander zurückzugeben. Wenn eine yield return-Anweisung erreicht wird, wird die aktuelle Position im Code gespeichert. Die Ausführung wird von diesem Speicherort neu gestartet, wenn der Iterator das nächste Mal aufgerufen wird.

Weitere Informationen finden Sie unter Iteratoren.
Die Anweisung fixed Die fixed-Anweisung verhindert, dass der Garbage Collector eine bewegliche Variable verschiebt. Weitere Informationen finden Sie unter fixed.
Die Anweisung lock Mit der Lock-Anweisung können Sie den Zugriff auf Codeblöcke auf jeweils nur einen Thread beschränken. Weitere Informationen finden Sie unter lock.
Anweisungen mit Bezeichnung Sie können einer Anweisung eine Bezeichnung zuordnen und dann das Goto Schlüsselwort verwenden, um zur beschrifteten Anweisung zu springen. (Sehen Sie sich das Beispiel in der folgenden Zeile an.)
Die leere Anweisung Die leere Anweisung besteht aus einem einzelnen Semikolon. Es tut nichts und kann an Stellen verwendet werden, an denen eine Anweisung erforderlich ist, aber keine Aktion ausgeführt werden muss.

Declaration Statements (Deklarationsanweisungen)

Der folgende Code zeigt Beispiele für Variablendeklarationen mit und ohne anfängliche Zuweisung sowie eine konstante Deklaration mit der erforderlichen Initialisierung.

// Variable declaration statements.
double area;
double radius = 2;

// Constant declaration statement.
const double pi = 3.14159;

Expression Statements (Ausdrucksanweisungen)

Der folgende Code zeigt Beispiele für Ausdrucksanweisungen, einschließlich Zuweisung, Objekterstellung mit Zuordnung und Methodenaufruf.

// Expression statement (assignment).
area = 3.14 * (radius * radius);

// Error. Not  statement because no assignment:
//circ * 2;

// Expression statement (method invocation).
System.Console.WriteLine();

// Expression statement (new object creation).
System.Collections.Generic.List<string> strings =
    new System.Collections.Generic.List<string>();

Die leere Anweisung

Die folgenden Beispiele zeigen zwei Verwendungen für eine leere Anweisung:

void ProcessMessages()
{
    while (ProcessMessage())
        ; // Statement needed here.
}

void F()
{
    //...
    if (done) goto exit;
//...
exit:
    ; // Statement needed here.
}

Eingebettete Anweisungen

Einige Anweisungen, z. B. Iterationsanweisungen, haben immer eine eingebettete Anweisung, die diesen folgt. Diese eingebettete Anweisung kann entweder eine einzelne Anweisung oder mehrere Anweisungen sein, die in {} Klammern in einem Anweisungsblock eingeschlossen sind. In geschweiften Klammern ({}) können sogar einzeilige eingebettete Anweisungen wie im folgenden Beispiel gezeigt eingeschlossen werden:

// Recommended style. Embedded statement in  block.
foreach (string s in System.IO.Directory.GetDirectories(
                        System.Environment.CurrentDirectory))
{
    System.Console.WriteLine(s);
}

// Not recommended.
foreach (string s in System.IO.Directory.GetDirectories(
                        System.Environment.CurrentDirectory))
    System.Console.WriteLine(s);

Eine eingebettete Anweisung, die nicht in {} Klammern eingeschlossen ist, darf keine Deklarationsanweisung oder eine beschriftete Anweisung sein. Dies wird im folgenden Beispiel gezeigt:

if(pointB == true)
    //Error CS1023:
    int radius = 5;

Setzen Sie die eingebettete Anweisung in einen Block, um den Fehler zu beheben:

if (b == true)
{
    // OK:
    System.DateTime d = System.DateTime.Now;
    System.Console.WriteLine(d.ToLongDateString());
}

Geschachtelte Anweisungsblöcke

Anweisungsblöcke können geschachtelt werden, wie im folgenden Code gezeigt wird:

foreach (string s in System.IO.Directory.GetDirectories(
    System.Environment.CurrentDirectory))
{
    if (s.StartsWith("CSharp"))
    {
        if (s.EndsWith("TempFolder"))
        {
            return s;
        }
    }
}
return "Not found.";

Nicht erreichbare Anweisungen

Wenn der Compiler feststellt, dass der Kontrollfluss unter keinen Umständen eine bestimmte Anweisung erreichen kann, erzeugt er die Warnung CS0162, wie im folgenden Beispiel gezeigt:

// An over-simplified example of unreachable code.
const int val = 5;
if (val < 4)
{
    System.Console.WriteLine("I'll never write anything."); //CS0162
}

C#-Sprachspezifikation

Weitere Informationen finden Sie im Abschnitt Anweisungen der C#-Sprachspezifikation.

Siehe auch