Main() und andere Methoden (C# und Java im Vergleich)

Aktualisiert: November 2007

In diesem Abschnitt werden Methoden erklärt bzw. wie Methodenparameter als Verweis oder als Wert übergeben werden.

Die Main ()-Methode

Jede C#-Anwendung muss genau eine Main-Methode enthalten, in der angegeben ist, wo die Programmausführung beginnen soll. In C# wird Main groß geschrieben, in Java wird ein klein geschriebenes main verwendet.

Main kann nur int oder void zurückgeben und nimmt ein optionales Argument mit einem Zeichenfolgenarray zur Abbildung eventueller Befehlszeilenparameter entgegen:

static int Main(string[] args)
{
    //...
    return 0;
}

Der Zeichenfolgenarrayparameter mit den übergebenen Befehlszeilenargumenten funktioniert genauso wie in Java. So gibt args[0] den ersten Befehlszeilenparameter an, args[1] den zweiten Parameter, usw. Im Gegensatz zu C++ enthält das args-Array nicht den Namen der EXE-Datei.

Andere Methoden

Parameter können als Wert oder als Verweis an eine Methode übergeben werden. Werteparameter nehmen lediglich den Wert einer beliebigen Variable zur Verwendung in der Methode auf. Folglich wird der Variablenwert im aufrufenden Code nicht von den Operationen innerhalb einer Methode beeinflusst.

Verweisparameter dagegen zeigen auf eine Variable, die im aufrufenden Code deklariert ist. Folglich kann eine Methode den Inhalt dieser Variable verändern, wenn diese als Verweis übergeben wird.

Übergeben als Verweis

Sowohl in Java als auch in C# werden Methodenparameter, die auf Objekte verweisen, als Verweis übergeben. Parameter primitiver Datentypen (Werttypen in C#) werden dagegen als Wert übergeben.

Zum Übergeben eines Werttyps als Verweis in C# müssen Sie entweder das ref-Schlüsselwort oder das out-Schlüsselwort angeben. Der Unterschied zwischen diesen beiden Schlüsselwörtern besteht in der Parameterinitialisierung. Der ref-Parameter muss vor seiner Verwendung initialisiert werden. Der out-Parameter dagegen muss vor der Übergabe nicht explizit initialisiert werden, und jeder vorherige Wert wird ignoriert.

Das ref-Schlüsselwort

Geben Sie dieses Schlüsselwort für einen Werttyp an, wenn Sie möchten, dass die aufgerufene Methode die als Parameter verwendeten Variablenwerte dauerhaft ändert. Auf diese Weise wird nicht der Variablenwert zur Zeit des Aufrufs, sondern ein Verweis auf die Variable übergeben. Die Methode verwendet dann die Referenz. Wenn sich bei der Ausführung der Methode der Parameter ändert, werden diese Änderungen in der ursprünglichen als Methodenparameter übergebenen Variable übernommen.

Im folgenden Beispiel wird dies anhand der Add-Methode veranschaulicht. Der zweite int-Parameter wird als Verweis mit dem ref-Schlüsselwort übergeben:

class TestRef
{
    private static void Add(int i, ref int result)
    {
        result += i;
        return;
    }

    static void Main()
    {
        int total = 20;
        System.Console.WriteLine("Original value of 'total': {0}", total);

        Add(10, ref total);
        System.Console.WriteLine("Value after calling Add(): {0}", total);
    }
}

Die Ausgabe dieses einfachen Beispiels zeigt, dass die Änderungen im result-Parameter sich auf die Variable total auswirken, die im Aufruf der Add -Methode verwendet wird:

Original value of 'total': 20

Value after calling Add(): 30

Das liegt daran, dass der Parameter result auf die eigentliche Speicheradresse verweist, die von der Variablen total im aufrufenden Code in Anspruch genommen wird. Die Eigenschaft einer Klasse ist keine Variable und kann nicht direkt als ref-Parameter verwendet werden.

Das ref-Schlüsselwort muss dem Parameter sowohl beim Aufruf der Methode als auch in der Methodendeklaration vorangestellt sein.

Das out-Schlüsselwort

Das out-Schlüsselwort funktioniert ähnlich wie das ref-Schlüsselwort. Änderungen an einem mit out deklarierten Parameter sind auch außerhalb der Methode sichtbar. Im Unterschied zu ref wird jeder Anfangswert eines out-Parameters innerhalb der Methode ignoriert. Außerdem muss ein out-Parameter während der Ausführung der Methode zugewiesen werden.

class TestOut
{
    private static void Add(int i, int j, out int result)
    {
        // The following line would cause a compile error:
        // System.Console.WriteLine("Initial value inside method: {0}", result);

        result = i + j;
        return;
    }

    static void Main()
    {
        int total = 20;
        System.Console.WriteLine("Original value of 'total': {0}", total);

        Add(33, 77, out total);
        System.Console.WriteLine("Value after calling Add(): {0}", total);
    }
}

In diesem Fall wird der dritte Parameter der Add-Methode mit dem out-Schlüsselwort deklariert. Aufrufe an diese Methode müssen für diesen Parameter ebenfalls das out-Schlüsselwort enthalten. Die Ausgabe sieht wie folgt aus:

Original value of 'total': 20

Value after calling Add(): 110

Zusammenfassend lässt sich sagen: Verwenden Sie das ref-Schlüsselwort, wenn eine Methode eine bestehende Variable verändern soll. Verwenden Sie dagegen das out-Schlüsselwort, um einen Wert zurückzugeben, der innerhalb der Methode erzeugt wurde. Das out-Schlüsselwort wird im Allgemeinen dann in Verbindung mit dem Rückgabewert der Methode verwendet, wenn die Methode mehr als einen Ergebniswert für den aufrufenden Code erzeugt.

Siehe auch

Konzepte

C#-Programmierhandbuch

Main() und Befehlszeilenargumente (C#-Programmierhandbuch)

Referenz

Übergeben von Parametern (C#-Programmierhandbuch)

Weitere Ressourcen

Die Programmiersprache C# für Java-Entwickler