Forum: PC-Programmierung C#: Instanz zur Laufzeit erstellen?


von Andreas (Gast)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

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?

von Andreas (Gast)


Lesenswert?

Danke für die schnelle Antwort PeterII!
Mit Instanz meine ich ein Objekt einer Klasse. Verwechsle ich da etwas?

von Paul H. (powl)


Lesenswert?

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.

von Peter II (Gast)


Lesenswert?

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?

von Arc N. (arc)


Lesenswert?

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?

von Andreas (Gast)


Lesenswert?

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.

von Sven H. (dsb_sven)


Lesenswert?

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.

von Andreas (Gast)


Lesenswert?

beim zweiten klick auf den button wird aber ein fehler auftreten oder? 
Instanzname existiert ja bereits. Gibt es dafür eine elegante lösung?

von guest (Gast)


Lesenswert?

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.

von Rogie (Gast)


Lesenswert?

Nein, da wird kein fehler auftreten, weil der Instanz dann ein einfach 
neues Objekt der Klasse myClass zugeordnet wird.

von A. V. (kra5h)


Lesenswert?

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
}

von Peter II (Gast)


Lesenswert?

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
}

von Arc N. (arc)


Lesenswert?

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.

von A. V. (kra5h)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

A. V. schrieb:
> enthält keine Definition für "add"

objects.add( new Myclass() ); ->  objects.Add( new Myclass() );

war aber schon nah dran ...

von A. V. (kra5h)


Lesenswert?

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

von Andreas (Gast)


Lesenswert?

Danke für all eure Bemühungen und raschen Antworten!
Die Lösung von PeterII ist genau das was ich gesucht habe!

Nettes Forum!

von Peter II (Gast)


Lesenswert?

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