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.
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.
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.