Forum: PC-Programmierung Wann "new" verwenden C#


von Sharper (Gast)


Lesenswert?

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ß

von Peter II (Gast)


Lesenswert?

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.

von Sharper (Gast)


Lesenswert?

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.

von Volker Z. (vza)


Lesenswert?

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

von Sharper (Gast)


Lesenswert?

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?

von Peter II (Gast)


Lesenswert?

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.

von Peter II (Gast)


Lesenswert?

Nachtrag:

die unterschied ist der: einmal bekommst du ein objekt und einmal 
erstellt du selber ein objekt.

von Sharper (Gast)


Lesenswert?

Danke Peter!

von Sven P. (Gast)


Lesenswert?

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.

von Peter II (Gast)


Lesenswert?

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.

von Sven P. (Gast)


Lesenswert?

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.

von Arc N. (arc)


Lesenswert?

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.

von Sven P. (Gast)


Lesenswert?

Asche auf mein Haupt, ich überlas das 'C#' im Titel.
Immerhin, man sieht, die Verwirrung trifft einen C/C++-Menschen schwer 
:->

von Jasch (Gast)


Lesenswert?

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^)

von Sven P. (Gast)


Lesenswert?

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

von Arc N. (arc)


Lesenswert?

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?

von Sven P. (Gast)


Lesenswert?

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.

von Sam .. (sam1994)


Lesenswert?

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
Noch kein Account? Hier anmelden.