Hallo, folgendes Bsp. aus der msdn: http://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener.aspx Da wird einmal ein Objekt so erstellt: TcpListener server=null; server = new TcpListener(localAddr, port); Und der TcpClient dann so: TcpClient client = server.AcceptTcpClient(); Warum brauche ich bei dem client den "new" Operator nicht? Gruß
Sharper schrieb: > Warum brauche ich bei dem client den "new" Operator nicht? weil du keine neuen Object anlegt sonder ein objekt von der methode AcceptTcpClient bekommt.
Ok das macht Sinn - trotzdem noch eine Frage: Mit TcpClient client erstelle ich was? Anscheinend ja noch kein Objekt? So wie ich das bisher verstanden habe brauchts für die Objekterstellung noch einen Konstruktor.
"client" wird wahrscheinlich nur innerhalb einer Funtion verwendet. Also wird es auf dem Stack gepackt, wie alle lokalen Variablen/Objekte. "server" erzeugst du mit "new" auf dem Heap. So "überlebt" es die Funktion in der das Objekt erzeugt wurde.
Mh das ist für mich als Laie etwas unverständlich - kann ich generell sagen, dass ich client erst verwenden kann, wenn ich ihm entweder wie im vorliegenden Fall ein Objekt zuweise oder aus client mit einem Konsturktor ein Objekt erstelle?
Volker Zabe schrieb: > "client" wird wahrscheinlich nur innerhalb einer Funtion verwendet. Also > wird es auf dem Stack gepackt, wie alle lokalen Variablen/Objekte. > "server" erzeugst du mit "new" auf dem Heap. So "überlebt" es die > Funktion in der das Objekt erzeugt wurde. nein diese Trennung gibt es in c# nicht mehr man könnte auch schreiben TcpClient client = new TcpClient(); aber dies geht nur syntaktisch und nicht von der logik. Denn der Client muss ja von der Server erstellt werde wo die verbindung angekommen ist. Sharper schrieb: > Mit TcpClient client erstelle ich was? Anscheinend ja noch kein Objekt? > So wie ich das bisher verstanden habe brauchts für die Objekterstellung > noch einen Konstruktor. du legst einfach eine Variable vom Type TcpClient an und dort speicherst du das object was server.AcceptTcpClient(); zurückliefert rein.
Nachtrag: die unterschied ist der: einmal bekommst du ein objekt und einmal erstellt du selber ein objekt.
Sharper schrieb: > TcpListener server=null; > server = new TcpListener(localAddr, port); Definieren die da in der Bibliothek allen Ernstes einen Zeigertyp, damit man schön so garnicht erkennen kann, dass es kein statisches Objekt ist?! Respekt.
Sven P. schrieb: > Definieren die da in der Bibliothek allen Ernstes einen Zeigertyp, damit > man schön so garnicht erkennen kann, dass es kein statisches Objekt > ist?! Respekt. wie meinst du da? Es gibt dort kein statisches Object.
Ja eben. Eigentlich sollte man bei Verwendung von 'new' doch erkennen, dass man mit einem Zeiger herumhantiert, was dort aber nicht der Fall ist, weil irgendein Typedef den Zeiger versteckt.
Sven P. schrieb: > Ja eben. > > Eigentlich sollte man bei Verwendung von 'new' doch erkennen, dass man > mit einem Zeiger herumhantiert, was dort aber nicht der Fall ist, weil > irgendein Typedef den Zeiger versteckt. ??? Es ist nicht C/C++, es gibt keine C/C++ typedefs und es gibt keine Zeiger (außer man will/muss unbedingt unsafe nutzen). Der Operator new erzeugt nur ein neues Objekt (und ruft den Konstruktor auf) und gibt eine Referenz auf das neue Objekt zurück.
Asche auf mein Haupt, ich überlas das 'C#' im Titel. Immerhin, man sieht, die Verwirrung trifft einen C/C++-Menschen schwer :->
Sven P. schrieb: > Asche auf mein Haupt, ich überlas das 'C#' im Titel. > Immerhin, man sieht, die Verwirrung trifft einen C/C++-Menschen schwer > :-> Immer mal wieder zwischen C, C++, C# und Java hin- und herwechseln, vielleicht auch mal Perl einstreuen. Und ganz schnell wundert Dich garnix mehr... =8^)
Normalerweise bereitet mir das keine Probleme. Kritisch wirds nur immer dann, wenn eine Sprache von einer anderen Sprache klaut, zum Beispiel ein syntaktisches Konstrukt. Das sieht dann exakt gleich aus und meint etwas völlig anderes. Grad hier, wo man doch eigentlich Speicherlöcher vermeiden will, ist das m.M.n. sehr gefährlich für Programmierer, die auch noch C/C++ sprechen. In Hardware verbaut man ja auch unterschiedliche Steckerarten, damit niemand etwas falsch verkabelt...
Sven P. schrieb: > Normalerweise bereitet mir das keine Probleme. Kritisch wirds nur immer > dann, wenn eine Sprache von einer anderen Sprache klaut, zum Beispiel > ein syntaktisches Konstrukt. Das sieht dann exakt gleich aus und meint > etwas völlig anderes. new gab's schon bei Smalltalk und Simula, geklaut und die Semantik verändert hat hier C++. > Grad hier, wo man doch eigentlich Speicherlöcher vermeiden will, ist das > m.M.n. sehr gefährlich für Programmierer, die auch noch C/C++ sprechen. Das liegt an C/C++ und am Programmierer scnr. > In Hardware verbaut man ja auch unterschiedliche Steckerarten, damit > niemand etwas falsch verkabelt... Warum gibt's dann in C++ nur eine Steckerart?
So richtig verstanden hast du ja nicht, was ich da sagte, SCNR. Zumindest in Smalltalk sah das doch syntaktisch eine ganze Ecke anders aus. Der C#-Code ginge syntaktisch aber 1:1 als C++-Code durch, meint aber was völlig anderes. Wenigstens bei mir stiftet das beim Hingucken jedes Mal wieder Verwirrung... Allerdings nicht nur bei C#, z.B. auch bei PHP muss ich immer wieder zweimal hinschauen. Mag aber alles ein persönlicher Eindruck sein, natürlich.
Sven P. schrieb: > Der C#-Code ginge syntaktisch aber 1:1 als C++-Code durch, meint > aber was völlig anderes. naja in speziellen Fällen vielleicht. Aber sobald Pointer hinzukommen wird das nichts mehr. In c# kann man Pointer nämlich nur sehr umständlich (wenn überhaupt) machen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.