Zum Inhalt springen

C# Grundlegende Frage zu namespace/klasse


N_Gnom

Empfohlene Beiträge

Hi,
ich beginne gerade mit C# und hätte eine Frage.
Nehmen wir folgenden weltberühmten code ;)

using System;
namespace HelloWorld
{
    class Hello 
    {
        static void Main() 
        {
            Console.WriteLine("Hello World!");

            // Keep the console window open in debug mode.
            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
        }
    }
}

Warum wird dort zu Beginn der namespace mit dem Namen des Programms festgelegt/erstellt und die Klasse Hello(mir ist bewusst dass da auch xyz stehen könnte)?
Dient dies vorsorglich dazu da man seinen code ja auch jederzeit als lib nutzen könnte, oder zu welchem Zweck macht man dies an dieser Stelle?
 

Bearbeitet von N_Gnom
Link zu diesem Kommentar
Auf anderen Seiten teilen

Namespaces dienen dazu, Klassen eindeutig zu identifizieren.
Angenommen du entwirfst die Klasse Auto und lädst eine Drittbibliothek, die ebenfalls eine Klasse Auto besitzt. Welche Klasse soll dann genommen werden?

Deine Klasse Hello, kannst du auch im vollqualifizierten Namen schreiben: HelloWorld.Hello

Beispiel:

Hello hello1 = new Hello();
HelloWorld.Hello hello2 = new HelloWorld.Hello();

Beide Zeilen machen exakt das selbe. Die zweite Zeile benutzt aber den vollqualifizierten Namen der Klasse.

Du gibst ja auch was aus der Konsole aus. Die Steuerung der Konsole machst du ja über die Klasse Console. Die Klasse befindet sich im Namespace System. Darum findest du in der ersten Zeile auch

using System;

Mit der using-Direktive weiß der Compiler, wo er nach den Klassen suchen soll, wenn du nicht den vollqualifizierten Namen der Klasse angibst. Genauso gut könntest du auch diese Zeile löschen und anstatt Console.WriteLine() schreibst du System.Console.WriteLine().

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke für die Antworten.
Ich weiß was namespaces und klassen sind, meine Frage war warum dies hier verwendet wird

namespace HelloWorld
{
    class Hello 

Wenn ich eine standalone .exe compiliere, brauche ich doch theoretisch weder den namespace Helloworld, noch die Klasse Hello.
Ich weiß dass das so standard ist, aber wozu an dieser Stelle?

Wenn ich den code nicht als alleinstehende .exe haben will sondern die methoden in anderen codes wiederverwenden will, dann ist das schlüssig.Jedoch nicht bei einer .exe

Im obigen Beispiel exisitiert ja kein Zugriff auf Helloworld und Hello.

Klar könnte ich es einfach so hinnehmen dass es so ist, aber ich würde das einfach genau wissen wollen.

Bearbeitet von N_Gnom
Link zu diesem Kommentar
Auf anderen Seiten teilen

Oftmals ist es ja so, dass solche Programme nur der Einstieg sind und später zum Beispiel noch erweitert werden. Ansonsten wird es so gemacht, damit man es direkt richtig lernt.

Um die Eindeutigkeit zu wahren, sollte man seinem Code immer einen Namespace zuordnen. Genauso wie jegliches Coding immer in einer Klasse stattfinden muss. In diesem Fall nunmal "class Hello"!

vor 20 Minuten schrieb N_Gnom:

Im obigen Beispiel exisitiert ja kein Zugriff auf Helloworld und Hello.

Natürlich existiert der Zugriff auf beides. Da du zum Einen in diesem Namespace operierst und zum anderen die Main-Methode in der Klasse Hello aufgerufen wird.

Bearbeitet von Rienne
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 37 Minuten schrieb N_Gnom:

Wenn ich eine standalone .exe compiliere, brauche ich doch theoretisch weder den namespace Helloworld, noch die Klasse Hello.
Ich weiß dass das so standard ist, aber wozu an dieser Stelle?

Regeln der Objektorientierung: 

  1. Alles ist ein Objekt
  2. Objekte kommunizieren durch das Senden und Empfangen von Nachrichten (welche aus Objekten bestehen)
  3. Objekte haben ihren eigenen Speicher (strukturiert als Objekte)
  4. Jedes Objekt ist die Instanz einer Klasse (welche ein Objekt sein muss)
  5. Die Klasse beinhaltet das Verhalten aller ihrer Instanzen (in der Form von Objekten in einer Programmliste)
  6. Um eine Programmliste auszuführen, wird die Ausführungskontrolle dem ersten Objekt gegeben und das Verbleibende als dessen Nachricht behandelt

Du kannst also keine Methode implementieren, die nicht in einer Klasse steckt.

Eine .exe ist im Grunde auch nichts anderes als eine .dll. Die .exe besitzt aber als Information, dass sie ausführbar ist und weil sie ausführbar ist, braucht sie einen Einstiegspunkt. Unter C# gilt als Einstiegspunkt immer eine Klasse, die die statische Main()-Methode implementiert. Du kannst ja mal gerne versuchen, eine weitere Klasse zu erzeugen, die eine statische Main()-Methode besitzt. Du wirst ein Kompilierfehler bekommen, weil er nun nicht weiß, welchen Einstiegspunkt er nehmen soll. Die Methode muss auch statisch sein, weil sie ein Merkmal der Klasse ist und nicht einer Instanz.

Im Zuge mit .Net Core wird es auch wohl in ferner Zukunft keine .exe mehr geben, sondern nur noch .dll, weil man die Anwendungen für verschiedene Systeme kompilieren kann und über die Runtime sagt, welche .dll man starten möchte.

 

Bearbeitet von Whiz-zarD
Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...