Hallo, Google konnte mir nicht weiterhelfen, da ich vermutlich mit den falschen Wörtern suche... Meine Frage(n): Wie kann ich während mein Programm ausgeführt wird eine Instanz erstellen? Wie wird der Name vergeben? Instanz1, Instanz2, Instanz3,... würde schongenügen. Vielen Dank schon im Vorhinein! Andreas
Andreas schrieb: > Wie kann ich während mein Programm ausgeführt wird eine Instanz > erstellen? kannst du mal genau erklären was du unter einer Instanz verstehts?
Danke für die schnelle Antwort PeterII! Mit Instanz meine ich ein Objekt einer Klasse. Verwechsle ich da etwas?
also wenn du ein array mit objekten einer klasse erstellst dürfte das das sein, was du haben möchtest.
1 | // Array-Variable erzeugen und initialisieren
|
2 | klasse[] meinArray = new klasse[3]; |
3 | |
4 | // Instanzen der Klasse "klasse" erzeugen:
|
5 | for(int i=0; i<=3; i++) |
6 | {
|
7 | meinArray[i] = new klasse(); |
8 | }
|
all das passiert zur Laufzeit.
Andreas schrieb: > Mit Instanz meine ich ein Objekt einer Klasse. Verwechsle ich da etwas? naja das war mir zu trivial. Datetime x = new Datetime(); x ist jetzt eine neu instance von Datetime meinst du das?
Andreas schrieb: > Danke für die schnelle Antwort PeterII! > Mit Instanz meine ich ein Objekt einer Klasse. Verwechsle ich da etwas? > Wie kann ich während mein Programm ausgeführt wird eine Instanz > erstellen? > Wie wird der Name vergeben? > Instanz1, Instanz2, Instanz3,... würde schongenügen. var Instanz1 = new Klasse(); var Instanz2 = new Klasse(); var aList = new List<Klasse>(); aList.Add(new Klasse()); var aDictionary = new Dictionary<string, Klasse>(); aDictionary.Add("Name", new Klasse()); oder was war die Frage?
Danke für eure Antworten! Folgende Funktion möchte ich erreichen: User drückt Button "Erstelle Objekt/Instanz". Daraufhin wird von "myClass" ein Objekt erzeugt und in einem Array gespeichert.
Im EventHandler vom Button:
1 | myClass instanz = new myClass(); // Neue Instanz erzeugen |
2 | |
3 | arrayMitInztanzen[aktuellerIndex] = instanz; // In Array ablegen. Vielleicht ist eine Datenstruktur List<myClass> besser geeignet, dann spart man sich den Index. |
4 | |
5 | aktuellerIndex++; // Index erhöhen nicht vergessen. |
beim zweiten klick auf den button wird aber ein fehler auftreten oder? Instanzname existiert ja bereits. Gibt es dafür eine elegante lösung?
Der Instanzname "lebt" nur lokal im Eventhandler und wird bei verlassen wieder zerstört (Destruktor wird gerufen). Du legst dabei aber mit der zeile: arrayMitInztanzen[aktuellerIndex] = instanz; eine Kopie dieses Objekts in Dein Array. Damit bleibt die Kopie erhalten (natürlich nur wenn Dein Array nicht auch nur innerhalb des Eventhandlers existiert.
Nein, da wird kein fehler auftreten, weil der Instanz dann ein einfach neues Objekt der Klasse myClass zugeordnet wird.
Ich würde es so machen:
1 | using System; |
2 | using System.Collections.Generic; |
3 | using System.ComponentModel; |
4 | using System.Data; |
5 | using System.Drawing; |
6 | using System.Linq; |
7 | using System.Text; |
8 | using System.Windows.Forms; |
9 | |
10 | namespace WindowsFormsApplication7 |
11 | {
|
12 | public partial class Form1 : Form |
13 | {
|
14 | Myclass[] objects=new Myclass[0]; |
15 | public Form1() |
16 | {
|
17 | InitializeComponent(); |
18 | }
|
19 | |
20 | private void button1_Click(object sender, EventArgs e) |
21 | {
|
22 | Myclass[] temp = new Myclass[objects.Length + 1]; |
23 | for (int i = 0; i < objects.Length; i++) temp[i] = objects[i]; |
24 | temp[objects.Length] = new Myclass(); |
25 | objects = temp; |
26 | }
|
27 | }
|
28 | public class Myclass |
29 | {
|
30 | }
|
31 | }
|
A. V. schrieb: > Ich würde es so machen: geht nicht nocht komplizierter?
1 | using System; |
2 | using System.Collections.Generic; |
3 | using System.ComponentModel; |
4 | using System.Data; |
5 | using System.Text; |
6 | using System.Windows.Forms; |
7 | |
8 | namespace WindowsFormsApplication7 |
9 | {
|
10 | public partial class Form1 : Form |
11 | {
|
12 | List<Myclass> objects = new List<Myclass>(); |
13 | public Form1() |
14 | {
|
15 | InitializeComponent(); |
16 | }
|
17 | |
18 | private void button1_Click(object sender, EventArgs e) |
19 | {
|
20 | objects.add( new Myclass() ); |
21 | }
|
22 | }
|
23 | public class Myclass |
24 | {
|
25 | }
|
26 | }
|
A. V. schrieb: > Ich würde es so machen: Warum den ganzen Kram umkopieren? Das ist nicht C und es gibt, wie oben schon vorgeschlagen, List<T> oder Dictionary<TKey, TValue>, je nachdem was man sonst noch damit machen will und die diesen Verwaltungskram übernehmen.
Peter II schrieb: > geht nicht nocht komplizierter? -> Fehler 1 "System.Collections.Generic.List<WindowsFormsApplication7.Myclass>" enthält keine Definition für "add", und es konnte keine Erweiterungsmethode "add" gefunden werden, die ein erstes Argument vom Typ "System.Collections.Generic.List<WindowsFormsApplication7.Myclass>" akzeptiert. (Fehlt eine Using-Direktive oder ein Assemblyverweis?) c:\users\kra5h\documents\visual studio 2010\Projects\WindowsFormsApplication7\WindowsFormsApplication7\Form1.cs 20 21 WindowsFormsApplication7 ^^also meins funzt.. ;)
A. V. schrieb: > enthält keine Definition für "add" objects.add( new Myclass() ); -> objects.Add( new Myclass() ); war aber schon nah dran ...
Peter II schrieb: > A. V. schrieb: >> enthält keine Definition für "add" > > objects.add( new Myclass() ); -> objects.Add( new Myclass() ); > > war aber schon nah dran ... ^^Das war dein Quellcode....hab ihn nur kopiert und im VS eingefügt... ..aber ja..dein Vorschlag ist besser...
Danke für all eure Bemühungen und raschen Antworten! Die Lösung von PeterII ist genau das was ich gesucht habe! Nettes Forum!
Andreas schrieb: > Danke für all eure Bemühungen und raschen Antworten! > Die Lösung von PeterII ist genau das was ich gesucht habe! Du könnstest mal etwas mehr über dein Objekt sagen. Warum braucht du noch eine Referenz darauf? Wenn du die Referenz nicht verwendest, verhindest du damit das der Speicher wieder frei gemacht wird. Kann es sein das du ein Formular dort neu anlegst?
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.