Autor Beitrag
Hegmeg
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Fr 17.07.09 15:40 
Hallo, ich bin Anfänger.

Irgendwie verstehe ich nicht, wann man new verwenden muß und wann nicht.

Beispiel
Das mann ein Objekt einer Klasse, also eine Instanz, mit
ausblenden C#-Quelltext
1:
Klassenname objek = new Klassenname();					

erzeugt ist mir klar. Es wird hierbei der Standardkonstruktor von "Klassenname" aufgerufen.
Jedoch sehe ich in manchen Beispielen auch, daß man hinschreibt:
ausblenden C#-Quelltext
1:
2:
KlasNam neuesObjektvonKlasNam;
neuesObjektvonKlasNam = irgendeinAnderesObjektKlasnam;

Wieso geht das?

Ähnliches ist bei string oder arrays immer wieder zu beobachten. Einmal schreibt man:
ausblenden C#-Quelltext
1:
string zeichenkette = new string("blabla");					

dann wieder
ausblenden C#-Quelltext
1:
2:
string irgendNenWort;
IrgendNenWort = "hallo";


Wann genau muß ich new verwenden, wann kann ich, wann sollte ich?
Oder habe ich was grundlegendes nicht verstanden?


Gruß
Hegmeg
bakachan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 503
Erhaltene Danke: 34

W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
BeitragVerfasst: Fr 17.07.09 15:52 
kurz: new beim erstellen einer neuen Instanz und kein new bei einer Zuweisung
Hegmeg Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Fr 17.07.09 16:08 
Danke für die schnelle Antwort.

Aber wenn z.b. Objekt Nr.1 ein bestehendes Objekt Nr.2 zuweise, dann muß ich doch erst eine Instanz von Objekt Nr.1 erzeugen, oder?

Das ist ja bei
ausblenden C#-Quelltext
1:
2:
KlasNam neuesObjektvonKlasNam;
neuesObjektvonKlasNam = irgendeinAnderesObjektKlasnam;

nicht der Fall.
Es müsste doch heisen:
ausblenden C#-Quelltext
1:
2:
KlasNam neuesObjektvonKlasNam = new KlasNam();
neuesObjektvonKlasNam = irgendeinAnderesObjektKlasnam;

Sonst wäre der Konstruktor von neuesObjektvonKlasNam nicht aufgerufen worden und somit auch keine Instanz erzeugt worden.

Wo habe ich denn meinen Denkfehler? :)
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Fr 17.07.09 16:11 
Hallo und :welcome:

Grundsätzlich ist klar: new wird benutzt, um ein neues Objekt zu erzeugen, d.h. eine Instanz dieser Klasse. Es gibt Sonderfälle mit anderen Wegen, um ein neues Objekt zu bekommen, und es gibt Vereinfachungen.

Zu deinen Beispielen im einzelnen: Ob die Deklaration mit der Erstzuweisung in einer Zeile steht oder in zwei Zeilen getrennt wird, ist völlig nebensächlich. Andere Programmiersprachen (z.b. Delphi) verlangen, dass die Deklaration an einer speziellen Stelle steht; es wird auch oft empfohlen, alle verwendeten Variablen am Anfang eines Blocks gesammelt zu deklarieren.

ausblenden C#-Quelltext
1:
2:
KlasNam neuesObjektvonKlasNam;
neuesObjektvonKlasNam = irgendeinAnderesObjektKlasnam;

Hier wird kein neues Objekt erzeugt! Das Objekt, das unter dem letzten Namen existiert, wird nur der anderen Variablen zugewiesen. Es handelt sich als um ein und dasselbe Objekt, das unter zwei verschiedenen Namen benutzt werden kann.

ausblenden C#-Quelltext
1:
2:
3:
4:
string zeichenkette = new string("blabla");
//  sowie
string irgendNenWort;
IrgendNenWort = "hallo";

Strings sind ein Sonderfall: Sie sind zum einen eine normale Klasse mit vielen Konstruktoren; zum anderen können sie ähnlich wie ein Datentyp (Werttyp) verwendet werden. Das erste Beispiel arbeitét explizit mit einem Konstruktor, das zweite mit einer direkten Zuweisung, die implizit einen Konstruktor aufruft.

Für Arrays von grundlegenden Datentypen gilt Ähnliches: Bei direkter Zuweisung von Werten wird implizit ein Array erzeugt.

Es gibt noch eine weitere Situation, in der eine Methode einer (anderen) Klasse dazu verwendet wird, ein Objekt zu erzeugen und zurückzugeben.
ausblenden C#-Quelltext
1:
2:
string [] sArr = new string [] { "a""bc""def""ghij" };
string result = String.Join("|", sArr);

Die Methode String.Join bekommt einen String und ein String-Array und erzeugt einen neuen String.

user profile iconHegmeg hat folgendes geschrieben Zum zitierten Posting springen:
Wann genau muß ich new verwenden, wann kann ich, wann sollte ich?

Du musst es immer dann verwenden, wenn du explizit eine neue Instanz einer Klasse erzeugen willst. Alle anderen Beispiele haben nichts mit dieser Frage "eine neue Instanz einer Klasse erzeugen" zu tun.

Ich hoffe, ich konnte etwas Klarheit verschaffen.

Gruß Jürgen

/Nachtrag
Zitat:
Sonst wäre der Konstruktor von neuesObjektvonKlasNam nicht aufgerufen worden und somit auch keine Instanz erzeugt worden.

Wo habe ich denn meinen Denkfehler? :)

Wichtig ist an dieser Stelle nicht, dass der Konstruktor von neuesObjektvonKlasNam aufgerufen wird, sondern der Konstruktor von KlasNam. Wenn irgendeinAnderesObjektKlasnam als ebensolches Objekt erzeugt worden ist, kann dieses Objekt dem Namen (!) neuesObjektvonKlasNam zugewiesen werden. Du solltest dich noch genauer über Klasse, Objekt, Instanz, Variable (und wohl auch "Referenz" bzw. Adresse im Arbeitsspeicher) informieren.
Hegmeg Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Fr 17.07.09 16:29 
WOW! Superantwort in Rekordzeit!

Vielen Dank für die ausführliche Antwort, ich habe den Unterschied jetzt wirklich verstanden. In meinem Buch ist das zwar erklärt, aber die Zusammenhänge habe ich erst jetzt kapiert.

Zitat:

Du solltest dich noch genauer über Klasse, Objekt, Instanz, Variable (und wohl auch "Referenz" bzw. Adresse im Arbeitsspeicher) informieren.

Allerdings! :) Bin grad fleißig dabei. :les:
Als Anfänger empfinde ich das objektorientierte Programmieren in .NET als etwas verwirrend, vor allem wegen der vielen Varianten um ein und das selbe Ziel zu erreichen.