Entwickler-Ecke
C# - Die Sprache - [Einsteiger] IList Arrays und deren Erstellung.
miniC# - Do 20.11.08 10:49
Titel: [Einsteiger] IList Arrays und deren Erstellung.
Guten Morgen,
ich habe mal wieder eine Frage. Ich habe mich heute den System.Collections gewidmet, da IList und IEnum usw mir vollkommen fremd sind/waren.
MDSN ist da mal wieder ein wenig verwirrend gestrickt, bzw die Beispiele, die ich dafür gefunden habe. Ich habe mir für meine Feldversuche
die IList herausgeuscht und möchte nun ein IList Array erstellen. Die ILists in dem Array bestehen aus Structs.
C#-Quelltext
1:
| private IList<_tokenStruct>[] _ts = new <_tokenStruct>[0]; |
Ist das soweit überhaupt richtig ? Wenn ja, dann geht es folgenderweise weiter :
C#-Quelltext
1: 2: 3: 4:
| public void AddToken(_tokenType type, double value) { this._ts[_set].Add(new _tokenStruct(type, value)); } |
Hier kassiere ich jedoch in Zeile 3 eine Null-Reference Exception und ich weis nicht so recht warum ...
Ralf Jansen - Do 20.11.08 11:28
Titel: Re: [Einsteiger] IList Arrays und deren Erstellung.
miniC# hat folgendes geschrieben : |
C#-Quelltext 1:
| private IList<_tokenStruct>[] _ts = new <_tokenStruct>[0]; |
Ist das soweit überhaupt richtig ? Wenn ja, dann geht es folgenderweise weiter :
|
Vermutlich nicht. Du hast ein Array der Länge 0 erstellt. Du kannst also gar keine Elemente hinzufügen. Sollte es nicht ein paar mehr Elemente also zumindest 1 Element enthalten dürfen? Oder wird _ts woanders neu zugewiesen?
Zweitens nach dem new fehlt der Typ also IList oder eine Klasse die IList implementiert.
miniC# hat folgendes geschrieben : |
C#-Quelltext 1: 2: 3: 4:
| public void AddToken(_tokenType type, double value) { this._ts[_set].Add(new _tokenStruct(type, value)); } |
|
Hast du den auch an der Stelle _ts[_set] eine IList implementierende Klasse erzeugt? Also vorher irgendwo mal z.B.
C#-Quelltext
1:
| this._ts[_set] = new List<tokenStruct>(); |
aufgerufen?
Th69 - Do 20.11.08 13:44
Ich glaube, miniC#, du hast einen anderen Denkfehler.
Du willst vermutlich kein Array von IList<tokenStruct> Objekten erzeugen (denn dies wäre dann ein zweidimensionales Array von tokenStruct-Objekten), sondern du möchtest einfach eine eindimensionale Liste erstellen, oder?
Außerdem verwechselst du m.E. Schnittstelle und Implementierung.
IList, IEnumerable sowie deren generischen Äquivalente IList<>, IEnumerable<> etc. sind nur Schnittstellen (interfaces), d.h. sie beschreiben welche Eigenschaften und Methoden vorhanden sein müssen, damit man solche Objekte benutzen kann.
Ein Array beispielsweise ist so deklariert:
C#-Quelltext
1:
| public abstract class Array : ICloneable, IList, ICollection, IEnumerable |
d.h. jede Methode welche z.B. ein IList oder ein ICollection erwartet, kannst du auch mit einem Array benutzen.
Am besten ist jedoch, du verwendest statt der festen Arrays die dynamische Klasse List<>:
C#-Quelltext
1:
| public class List<T> : IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable |
,
welche ebenfalls diese Schnittstellen unterstützt.
Dein Beispiel sähe dann so aus:
C#-Quelltext
1: 2: 3: 4:
| private List<_tokenStruct> _list = new List<_tokenStruct>();
_list.Add(new _tokenStruct()); |
am besten, du liest dann mal Kapitel 4:
http://openbook.galileocomputing.de/visual_csharp/
miniC# - Fr 21.11.08 03:59
Th69 hat folgendes geschrieben : |
Ich glaube, miniC#, du hast einen anderen Denkfehler.
Du willst vermutlich kein Array von IList<tokenStruct> Objekten erzeugen (denn dies wäre dann ein zweidimensionales Array von tokenStruct-Objekten), sondern du möchtest einfach eine eindimensionale Liste erstellen, oder? |
hm , ich bin mir net einhundertprozentig sicher, aber ich denke ich will ein zweidimensionales array . _ts soll ein array von (I)Lists sein , welche dann jeweils aus tokenStructs bestehen.
| Zitat: |
Außerdem verwechselst du m.E. Schnittstelle und Implementierung.
IList, IEnumerable sowie deren generischen Äquivalente IList<>, IEnumerable<> etc. sind nur Schnittstellen (interfaces), d.h. sie beschreiben welche Eigenschaften und Methoden vorhanden sein müssen, damit man solche Objekte benutzen kann. |
sowas in die richtung hatte ich schon vermutet, daher auch meine vorsichtige frage :) ich hatte mir die system.collections seite angeschaut und habe leider nur teile von dem wust an inofrmationen gelesen. das i steht also für interface (ein thema was ich leider auch noch nicht behandelt habe, habe aber zumindest eine grobe vortsellung davon , was ein interface ist). ich werde mich mal mit List ohne I beschäftigen.
Das Buch habe ich gebookmarkt :), aber dennoch danke für den Link .
Ralf Jansen hat folgendes geschrieben : |
Vermutlich nicht. Du hast ein Array der Länge 0 erstellt. Du kannst also gar keine Elemente hinzufügen. Sollte es nicht ein paar mehr Elemente also zumindest 1 Element enthalten dürfen? Oder wird _ts woanders neu zugewiesen? Zweitens nach dem new fehlt der Typ also IList oder eine Klasse die IList implementiert. |
1.Die Länge des Arrays wird an anderer Stelle festgelegt.2. Den Typ beim zuweisen mittels new habe ich auch angegeben, nur dummerweise
beim Abtippen verschludert. Asche auf mein Haupt.
| Zitat: |
Hast du den auch an der Stelle _ts[_set] eine IList implementierende Klasse erzeugt? Also vorher irgendwo mal z.B.
C#-Quelltext 1:
| this._ts[_set] = new List<tokenStruct>(); |
aufgerufen? |
Nein :) Ich denke hier liegt mein Grund für die NullRefException :) Vielen Dank für eure Antworten,
Gruß,
miniC#
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!