Verständnisfrage zu Namespace´s und Klassen im Vergleich zu C++
-
Sers COM,
ich komme aus der C/C++-Ecke und habe ein paar Verständnisfragen zu C# in Zusammenhang mit Namespaces und Klassen.
Laut einem C#-Buch ist "System" ein Namespace und "Console" eine Klasse im Namespace "Console". Der Zugriff kann dann wie folgt erfolgen:
System.Console.WriteLine
Nun meine Frage, ob diese einheitlichen Zugriffsoperatoren "." für Namespaces und Klassen gleichermaßen neu sind (im Vergleich zu C/C++)?
Konkret geht es mir darum zu erfahren, inwieweit der Compiler / Interpreter von C# erkennen kann, was ein Namespace und was eine Klasse ist, wenn syntaktisch auf beide Bezeichner (wie im Beispiel) jeweils mit ein und demselben Operator "." zugegriffen wird???In C/C++ erfolgt der Zugriff auf Namespaces nämlich durch den "::"-Operator und auf Klassen- und Struktur-Objekte durch den "." -bzw. "->"-Operator.
Ich habe mal das Grundgerüst in C/C++ nachgebaut und wenn ich das genauso wie in C# realisieren möchte (also System = Namespace, Console = class), dann sieht ein Zugriff syntaktisch nur so aus:System::Console.WriteLine
Oder ich realisiere es durch zwei ineinandergeschachtelte Klassen, dann wie bei C#, kommt denke ich aber irgendwie nicht dem Original nahe.
Daher nun meine eigentliche Frage, wie das in C# genau definiert / realisiert ist? Bzw. anders gefragt, wo liegt der Unterschied zwischen einem C/C++-Namespace und einem C#-Namespace (sowie Zugriff), gleiches zwischen einer C++-Klasse und einer C#-Klasse (sowie Zugriff)?
Ich danke vielmals im Voraus!
MfG
Schlitzauge
-
Eine Klasse ist auch nur ein Namespace, egal ob in C++ oder C#. Der Unterschied liegt hauptsächlich darin, dass ich von der Klasse Instanzen bilden und den Zugriff auf Member/Methoden einschränken kann.
-
Wirklich?
Is mir neu, so lässt sich ein Namespace allein schon syntaktisch einfacher erweitern als eine Klasse bzw. Struktur.Naja gut, aber das beantwortet meine eigentliche Frage ja nicht wirklich.
Mich irretiert die neue Syntax. Ich versuche sie zum einfacheren Verständnis in C/C++ nachzubilden, wüsste aber dazu die genaue C#-Implementierung, sowie Unterschied zur C/C++-Implementierung und Zugriff. Irgendeinen Unterschied muss es doch geben und woher weiß der C#-Compiler / Interpreter, ob er jetzt auf einen Namespace "System" oder eine Klasse "System" zugreift, wenn doch auf beide jeweils mit ein und demselben "."-Operator zugegriffen wird??? Allein syntaktisch finde ich das in C/C++ besser gelöst, da man so auch grammatisch einen Unterschied erkennt. Gibt es da nicht doch implementierungsspezifische Eigenheiten / Unterschiede?
-
Schlitzauge schrieb:
Irgendeinen Unterschied muss es doch geben und woher weiß der C#-Compiler / Interpreter, ob er jetzt auf einen Namespace "System" oder eine Klasse "System" zugreift, wenn doch auf beide jeweils mit ein und demselben "."-Operator zugegriffen wird??? Allein syntaktisch finde ich das in C/C++ besser gelöst, da man so auch grammatisch einen Unterschied erkennt. Gibt es da nicht doch implementierungsspezifische Eigenheiten / Unterschiede?
Der Compiler weiß natürlich, ob "System" jetzt der Name eines Namespace, einer Klasse oder eines Objektes ist. Für die seltenen Fälle, wo's da dann zu Uneindeutigkeiten kommen kann, hat C# auch einen :: Operator...
-
Unter .NET / C# ist grunsätzlich alles objektorientiert und befindet sich damit in Klassen.
Das gilt z.B. auch für Datentypen wie int, double, string, ... Ohne die namespaces
kann man auf die Eigenschaften und die Methoden einer Klasse nicht zugreifen.
Daneben muss man wissen, ob die Klassen statisch (ohne Objekt mit new) oder
dynamisch (Objekte mit new) zu verwenden sind.Diese Dinge gehören für den Einstieg oder Umstieg nach C# notwendig verstanden.
Ein Umstieg von C++ ist nicht besonders schwer!
-
Der Compiler weiß natürlich, ob "System" jetzt der Name eines Namespace, einer Klasse oder eines Objektes ist. Für die seltenen Fälle, wo's da dann zu Uneindeutigkeiten kommen kann, hat C# auch einen :: Operator...
Scheint sich bei C# anscheinend geändert zu haben. Hätten die es nicht einfach beim "::" belassen können (also nur beim "::")...
Unter .NET / C# ist grunsätzlich alles objektorientiert und befindet sich damit in Klassen.
Und wo liegt in C# dann der Unterschied zwischen Namespaces und richtigen Klassen? Das würde mich ja primär interessieren. Kann man in C# nun also mit "::"- und "."-Operator auf Namespaces zugreifen? Gibt es dann da einen Unterschied in der Funktionsweise oder steht es mir frei, welchen der beiden Operatoren ich verwende?
Ohne die namespaces
kann man auf die Eigenschaften und die Methoden einer Klasse nicht zugreifen.Wie das? Das wüsste ich mal gerne näher erläutert, möglichst mit einem anschaulichen Beispiel, thx...
Grüße
Schlitzauge
-
Warum sollte es verschiedene Navigationsoperatoren geben, wenn es in objektorientierte Welt die Möglichkeit der Überladeung gibst und somit .(namespace, namespacemember) als auch .(klasse, klassenmember) gilt. Und wie dot kommentiert hat, die Anwendung prüft der Compiler, weil bei der Evaluation des Ausdrück alle Daten vorliegen um es zu prüfen.
-
Syntaktisch find ichs natürlich nicht schlecht, Gesetz dem Fall es gibt keinen Unterschied zwischen Namespace und Klasse.
Das ist ja meine Primärfrage. Inwieweit unterscheiden sich Namespaces und Klassen in C#?
-
Es gibt keine "richtigen" Klassen, sondern nur Klassen. Bevor du dich mit der Vererbung der Systemklassen lange beschäftigst,
wende sie einfach so wie sie sind an und sorge dafür, dass deren namespaces in deinem Code richtig eingebunden sind.
Das meiste macht bereits die Entwicklungsumgebung wie VSC.Hau dir einfach eigenes Anwendungswissen rein!
-
Schlitzauge schrieb:
Syntaktisch find ichs natürlich nicht schlecht, Gesetz dem Fall es gibt keinen Unterschied zwischen Namespace und Klasse.
Das ist ja meine Primärfrage. Inwieweit unterscheiden sich Namespaces und Klassen in C#?Von C++ nicht viel, sind gleiche Konzepte, nur erweitert.
-
Ok ,falscher Ansatz.
Wenn ich in C# progge, passt das alles schon. Da frag ich nicht einfach, ich wende es einfach an...Ich versuche gerade nur den genauen Unterschied zwischen C# und C++ zu verstehen (also in Hinsicht auf das Problem, nicht allgemein). Ich möchte also tiefer in die Materie schauen.
Ich versuche gerade, einfach das Grundgerüst um System experimentell in C++ nachzubilden. Also kann man es allgemein so sagen, dass zwischen namespace und class hinsichtlich der Zugriffsoperatoren zwischen C++ und C# sich nichts geändert hat, außer, dass man nun freie Wahl hat, ob man den "."- oder "::"-Operator zum Zugriff auf einen Namespace hat?
Oder gibts in C# schon einen Unterschied zwischen dem "."- und dem "::"-Operator?
-
-
Noch eine kurze Frage dazu:
Gibt es in C# im Namespace System bereits eine Instanz bzw. eine angelegte Variable der Klasse System.Console (siehe unterhalb zu Variante b.)) oder einfach nur die Klassen-Deklaration / Gerüst der class System.Console (siehe unterhalb zu Variante a.))?Worauf ich hinaus möchte, wird vlt. an folgenden C++-Beispiel (leichte Implementierung von System.Console) deutlicher:
namespace System { class Console { static void WriteLine(void){} }; };
Hier gibt es nun zwei Möglichkeiten, auf die Klasse Console zuzugreifen:
Variante a.) Ohne erstellte Instanz im Namespace System:namespace System { class Console { public: static void WriteLine(void){} }; }; using namespace System; ... System::Console::WriteLine();
Variante b.) Mit erstellter Instanz im Namespace System:
namespace System { class Console { static void WriteLine(void){} }extern Console; }; using namespace System; class System::Console Console; ... System::Console.WriteLine(); // bzw. Console.WriteLine();
Der Unterschied liegt einfach in der Schreibweise, wie man innerhalb des Namespaces und der Klassen-Gerüste navigiert. In Variante a.) durchweg mit dem "::"-Operator und in Variante b.) nur bis z.B. System::Console mit dem "::"-Operator und ab dann mit dem "."-Operator zum Zugriff auf die Klassenmember, da nun bestehende Instanz.
Wie gesagt, ist halt nur eine einfache C++-Implementierung zur Verdeutlichung.
Welche der beiden Varianten würde der C#-Implementierung näher kommen?
Mich irretiert einfach nur die nun vereinheitlichte Schreibweise in C#, also sowohl der "."- als auch der"::"-Operator zum Zugriff auf Namespace´s und Klassen gleichermaßen. In C++ geht das nicht, da ist für den Zugriff der "."-Operator für Klassen- und Struktur-Instanzen und der "::"-Operator für Namespaces und Klassen-Gerüste zuständig. Daher auch die Beispiele zum Verständnis zu meinem Verständnisproblem und meine Frage.Ich danke vielmals im Voraus!
MfG
Schlitzauge
-
@Schlitzauge,
Hör auf C++ mit C# zu vergleichen. C# ist nicht C++ und C++ ist nicht C#. Probier schon gar nicht C# in C++ nachzuprogrammieren, dabei kommt nur Müll raus, weil man in C# und C++ Dinge anders löst. Es hilft dir vom Verständnis überhaupt nichts, wenn du probierst Sprachkonstrukte zwischen den Sprachen mit aller Macht nachzuprogrammieren. In C# musst du in C# denken, in C++ musst du in C++ denken.Auch scheinst du davon auszugehen, dass C# irgendeine Weiterentwicklung von C++ sei. Das ist nicht der Fall. C# ist wahrscheinlich viel mehr aus Java heraus entstanden. Wurde aber durch die Sprache C++ beeinflusst, wie das ja auch schon bei Java der Fall war. Aber es ist keine Weiterentwicklung!
Und vielleicht noch etwas ganz am Schluss: Die Unterscheidung der Syntax von C++ und C# findet im Parser statt und nicht in der Sprache selbst.
Grüssli
-
Probier schon gar nicht C# in C++ nachzuprogrammieren, dabei kommt nur Müll raus, weil man in C# und C++ Dinge anders löst.
Versuch ich doch garnicht. Ich bin dabei, mich in C# einzuarbeiten.
Ich versuche / möchte einfach verstehen, wie das funktionell umgesetzt wird.
Ich bin kein Mensch, der Dinge einfach mal so hinnimmt, ich möchte schon etwas näher die Funktionalität begreifen. Das bringt mir mehr beim Lernen und Üben.
C/C++ dient mir dabei nur zum Vergleich, da ich aus dieser Ecke komme und wenn einige Konstrukte aus C/C++ übernommen bzw. erweitert wurden, lassen sich nebenbei gesagt schon einige Möglichkeiten mit C/C++-Implementierung darstellen und wenn es nur zum Verständnis dient (gewiss nicht alles, aber eniniges).Auch scheinst du davon auszugehen, dass C# irgendeine Weiterentwicklung von C++ sei. Das ist nicht der Fall. C# ist wahrscheinlich viel mehr aus Java heraus entstanden. Wurde aber durch die Sprache C++ beeinflusst, wie das ja auch schon bei Java der Fall war. Aber es ist keine Weiterentwicklung!
iSchweis. Ich betrachte es ja auch so. Ich denke nicht, dass C# eine Weiterentwicklung von C/C++ ist. Ich betrachte es vielmehr als neue Programmiersprache, die einige neue Konzepte einführt, aber auch aufgrund der Syntaxnähe und teilweisen Abwärtskompatibilität sehr wohl einige altbekannte Konzepte übernommen bzw. dergleichen erweitert hat. Sind nicht meine eigenen Aussagen, sondern das, was ich immer wieder in Büchern, Totorials und Statements anderer (allein in diesem Thread) entnehme, verzeiht mir also etwaige Fehler bzw. Fehlausdrücke.
Wäre, schön, wenn man nochmal meinen letzten Post aufgreifen und beantworten könnte -> mir weiterhelfen könnte, thx...
-
Schlitzauge schrieb:
Versuch ich doch garnicht. Ich bin dabei, mich in C# einzuarbeiten.
Das folgende spricht aber eine andere Sprache:
Schlitzauge schrieb:
Ich versuche gerade, einfach das Grundgerüst um System experimentell in C++ nachzubilden.
Du probierst Dinge aus C# auf C++ abzubilden und das ist Unsinn.
Schlitzauge schrieb:
Ich versuche / möchte einfach verstehen, wie das funktionell umgesetzt wird.
Erklär das mal genauer. Was genau verstehst du unter "funktionell umgesetzt wird"? In C++ wird etwas in Maschensprache übersetzt und dann von der CPU ausgeführt. Unter C# wird das in CLI (Common Language Infrastructure) übersetzt, was dann von der CLR (Common Language Runtime) interpretiert wird. Aber das hat nichts mehr direkt mit C++ oder C# zu tun. Daher verstehe ich echt nicht, worauf du hier genau hinauswillst.
Schlitzauge schrieb:
C/C++ dient mir dabei nur zum Vergleich, da ich aus dieser Ecke komme und wenn einige Konstrukte aus C/C++ übernommen bzw. erweitert wurden, lassen sich nebenbei gesagt schon einige Möglichkeiten mit C/C++-Implementierung darstellen und wenn es nur zum Verständnis dient (gewiss nicht alles, aber eniniges).
Also zuerst mal C/C++ existiert nicht. Wenn schon C oder C++.
Und die Vergleiche hinken unglaublich stark zwischen C# und C++. Wie ich oben geschrieben habe, werden C++ und C# Programme komplett anders übersetzt und ausgeführt. Was nun der Punkt-Operator macht, kann jeder Compiler oder Interpreter selber festlegen. In C# ist es halt nach dem Standard so definiert und C++ halt andersrum.Schlitzauge schrieb:
... teilweisen Abwärtskompatibilität sehr wohl einige altbekannte Konzepte übernommen bzw. dergleichen erweitert hat.
Die Abwärtskompatibilität von C# gegenüber C++ ist genau gleich Null. Und wenn Konzepte übernommen wurden dann nur sehr abstrakte. C# und C++ haben komplett unterschiedliche Standards und beziehen sich darin in keiner Weise aufeinander.
Schlitzauge schrieb:
Wäre, schön, wenn man nochmal meinen letzten Post aufgreifen und beantworten könnte -> mir weiterhelfen könnte, thx...
Die Klasse
System.Console
ist einestatic class
. Man kann von ihr keine Objekte anlegen und sie enthält ausschliesslich statische Methoden. Also theoretisch Variante a) von deinen zwei Beispielen.Das könntest du übrigens auch ganz selber über die Referenz herausfinden:
http://msdn.microsoft.com/en-us/library/system.console.aspxMSDN schrieb:
public static class Console
Grüssli
-
Dravere schrieb:
.... daher verstehe ich echt nicht, worauf du hier genau hinauswillst ....
Vielleicht will er die Konzepte und Paradigmen von .NET und C# selbst mit C++ oder native C in einer reinen Windows-Umgebung nachbilden, um die dahintersthenden Details zu verstehen?
Von C++ kommend kann man das alles auch so verstehen und ohne viele Mühe anwenden können.
Vorschlag: Lasse Consol-Anwendungen beseite und beginne mit WindowsForms-Anwendungen. Man lernt nicht erst Kfz-Mechanik, um ein Auto zu fahren oder zu kaufen. Führerschein machen und als Anfänger sicheres Beherrschen üben reichen da aus!