c# - Wo am besten Methode/Klassen etc. definieren?

3 Antworten

Methoden müssen immer innerhalb einer Klasse sein und eine Klasse sollte immer in einem Namespace sein oder worauf willst du hinaus?

Es gelten logischen Limitationen in der Syntax (Hierarchien) und der zweite wichtige Punkt ist die Übersichtlichkeit.

Eine Methode kann nur innerhalb einer Klasse definiert werden. Sie selbst kann neben den üblichen Anweisungen zwar auch noch lokale Funktionen (also Funktionen, die nur innerhalb der Methode bekannt sind) beinhalten, doch sollte hier Sinn und Übersichtlichkeit sehr bedacht werden. Oftmals könnten solche Helferfunktionen auch noch an anderer Stelle des Programms einsetzbar sein, weshalb ihre Beschränkung auf den einen Methodenkörper hinderlich wird. Des Weiteren blähen sie eine Methode schnell auf. In der Praxis wirst du daher nur sehr selten auf sie treffen.

Die Tatsache, dass Methoden nur innerhalb von Klassen erlaubt sind, lässt sich daran erklären, dass sich C# bei einer Lösungssuche für ein Problem an dem objektorientierten Paradigma orientiert. Das heißt, man entwickelt ein System, welches sich aus verschiedenen Objekten zusammensetzt, die miteinander agieren und auf diese Weise das Problem lösen. Man könnte auch idealisiert sagen, ein Problemkontext der echten Welt wird nachmodelliert.

Als besser fassbares Beispiel: Ein Kartenspiel (Skat/Mau-Mau/...; = das System) soll entwickelt werden. Demzufolge brauchst du Objekte wie Spieler, Karten, Talon, usw.). Die jeweiligen Objekte haben eigene Zustände (Karten haben Kartenfarben und -werte, die Spieler haben bestimmte Karten auf der Hand und vielleicht eine Punktzahl, usw.) und Methoden (Spieler können bspw. eine Karte ziehen), mit denen sie ihre Zustände ändern.

Klassen stellen in diesem Modell die Blaupausen für die Objekte dar und beinhalten daher auch die Methodendefinitionen. Wenn du Namespaces verwendest, sollten Klassen in den Namespaces definiert werden.

Innerhalb von Klassen kannst du noch andere Klassen (innere Klassen) erstellen. Das ist aber nur sinnvoll, wenn du einen Helfertyp brauchst, der nur in dieser Klasse gebraucht wird. Bei einer Baumstruktur (diese besteht aus mehreren Knoten) könnte man eine innere Klasse z.B. für den Knotentyp verwenden, da dieser Typ nur für die innere Strukturierung dienlich ist, für den (äußeren) Anwender der Baumstruktur allerdings keine Relevanz hat.

Namespace-Blöcke stellen dir ein Werkzeug zur Verfügung, um Code (auf der Ebene: Klassen, Enums, Interfaces, Delegates - oder aber auch andere Namespaces) zu gruppieren.

Würdest du bspw. mit C# einen Zoo modellieren, könntest du alle Klassen und Interfaces, die Tiere beschreiben, in einen Namespace Animals einordnen und verschiedene Orte wiederum in einen Namespace Locations. Folgendermaßen fällt die Wartung des Projekts leichter (die Elemente sind schneller und intuitiver auffindbar), nicht zuletzt da Visual Studio üblicherweise mit dem Anlegen eines neuen Ordners auch einen gleichnamigen Namespace kreiert.

Der explizite Einsatz eines Namespace ist aber kein Muss. Doch es empfiehlt sich, um gut strukturierte Projekte zu schaffen. Funktional lassen sich mit Namespaces zudem Namenskollisionen vermeiden.

Dazu ein einfaches Beispiel: Du hast in deinem Projekt eine Klasse Object kreiert.

class Object
{
}

Nun gibt es aber auch eine Klasse Object in der Standardbibliothek. Wenn du beide in der Program-Klasse verwenden wolltest, müsstest du schauen, wie du sie auseinanderhalten kannst. Der Namespace hilft hierbei.

var yourObject = new Object();
var defaultObject = new System.Object(); // or alias: object

Anhand meiner bisherigen Erklärungen dürftest du nun schon herausgelesen haben, dass es bei dem objektorientierten Modell viel um eine logische Strukturierung geht. Eine Methode ZieheKarte würdest du demzufolge nicht in einer Klasse Karte finden, aber eher in einer Klasse Spieler.

Für einen Anfänger wird eine großangelegte Aufteilung nun natürlich noch nicht so viel Sinn machen und vieles wird sich daher in der Klasse Program abspielen. Sobald du aber komplexere Projekte angehst und dich mit den Konzepten objektorientierter Programmierung befasst hast (Vererbung, Kapselung, usw.), würde ich dir folgende Tipps auf den Weg geben:

  • Jede Klasse bekommt ihre eigene Datei. Einzige Ausnahme stellen innere Klassen, sofern man sie denn wirklich einmal benötigt.
  • Methoden sollten nicht nur nach ihrer Funktion benannt, sondern logisch auch der richtigen Klasse zugeteilt werden (s. Beispiel oben: ZieheKarte). Sie sind folglich auch nur noch über das/die Objekt/Klasse aufrufbar, in der sie sich befinden.
  • Wenn du viele Klassen hast und sie gruppieren/strukturieren möchtest, lege dir Ordner in der Projektmappe an. Jeder Ordner stellt einen eigenen Namespace.
jumbo23 
Fragesteller
 29.10.2021, 20:29

Klasse antwort, vielen dank :)

0

In C# müssen alle Methoden teil einer Klasse sein.

Daher gibt es dafür auch nur einen Ort wo du sie definieren kannst.

Für Klassen siehts anders aus, aber da kommts drauf an wie du die Klasse verwendest oder verwenden möchtest.