Hallo,
also das mit den Zeigern ist eigentlich ziemlich einfach (naja, nachdem ich mich jahrelang mit dem gleichen Verständnisproblem herumgeschlagen habe). Ich möchte aber nicht Deine Aussage umstellen und korrigieren, weil das nur noch mehr verwirren würde; ich gehe lieber von Deinem Problem aus:
- Du deklarierst zunächst Deine Liste mypictureboxes als PictureBox[]. Jetzt ist nur ein Name festgelegt, und es ist bekannt, dass dieser Name für eine Liste von PictureBoxen verwendet wird. Es ist noch kein Speicher zugeordnet:
C#-Quelltext
1:
| private System.Windows.Forms.PictureBox[] mypictureboxes; |
- Dann erzeugst Du diese Liste. Damit wird Speicher für eine Liste angelegt. (Vom Speicherplatz her ist es [noch] gleichgültig, ob es sich um eine Liste von Integer, Form oder eben PictureBox handelt.) Dieser Befehl vermeidet (verhindert) die Fehlermeldung "keine Objektinstanz", aber nur in Bezug auf die gesamte Liste unter dem Namen mypictureboxes. Dadurch wird ein Zeiger auf diese Liste angelegt; jetzt erst weiß das Programm, an welcher Stelle im Speicher es nachschauen soll, wenn die Liste mypictureboxes benutzt wird.
C#-Quelltext
1:
| this.mypictureboxes = new System.Windows.Forms.PictureBox[40]; |
- Tatsächlich enthält diese Liste aber noch "nichts": Für jeden einzelnen Index muss eine eigene PictureBox erzeugt werden; erst danach weiß das Programm, an welcher Stelle im Speicher es nachschauen soll, wenn eine bestimmte PictureBox mypictureboxes[n] benutzt wird. Dieser Schritt hatte bei Dir gefehlt (erledigt durch den ersten Code von alias5000).
- Durch die vorherige Deklaration wird zusätzlich sichergestellt, dass im 3. Schritt nur eine PictureBox (oder eine davon abgeleitete Klasse) eingetragen werden kann, aber kein Integer oder Form oder Image; sonst schimpft schon der Compiler.
Unter NET denkt man in der Regel nicht darüber nach, ob man einen Zeiger oder einen Wert benutzt, sondern darüber, ob das Objekt, das man unter einem Namen ansprechen will, wirklich existiert (d.h. ob eine Instanz dieser Klasse erzeugt worden ist; andernfalls "zeigt" dieser Name an eine Stelle im Nirwana); dann hat sich nämlich NET einen Zeiger dafür geschaffen.
Für Fachleute: bitte nicht meckern, wenn diese Darstellung zu sehr vereinfacht ist; mir ging es um das grundsätzliche Verständnis.
Zusatzhinweis zu this: Das hat eigentlich überhaupt nichts mit Zeigern zu tun, sondern es ist nur eine Kurzbezeichnung für die aktuelle Klasse, in der man sich befindet. Es kann (fast) immer weggelassen werden, hilft aber wegen Intellisense: Nach dem Punkt erhältst Du die zugänglichen Member dieser Klasse, sonst musst Du alle Namen "aus dem Gedächtnis" schreiben.
Ich hoffe, ich konnte es etwas klarer machen. Jürgen