Autor Beitrag
miniC#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 75

Wiin XP Home
C# VS Express 2008
BeitragVerfasst: Do 20.11.08 09:49 
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.

ausblenden C#-Quelltext
1:
private IList<_tokenStruct>[] _ts = new <_tokenStruct>[0];					


Ist das soweit überhaupt richtig ? Wenn ja, dann geht es folgenderweise weiter :

ausblenden C#-Quelltext
1:
2:
3:
4:
public void AddToken(_tokenType type, double value)
{
this._ts[_set].Add(new _tokenStruct(type, value)); //_set ist belegt und innerhalb der arraygrenzen
}


Hier kassiere ich jedoch in Zeile 3 eine Null-Reference Exception und ich weis nicht so recht warum ...

_________________
Zitat MDSN : " ... C# (gesprochen: "si scharp") " :D
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 20.11.08 10:28 
user profile iconminiC# hat folgendes geschrieben Zum zitierten Posting springen:

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

user profile iconminiC# hat folgendes geschrieben Zum zitierten Posting springen:

ausblenden C#-Quelltext
1:
2:
3:
4:
public void AddToken(_tokenType type, double value)
{
this._ts[_set].Add(new _tokenStruct(type, value)); //_set ist belegt und innerhalb der arraygrenzen
}



Hast du den auch an der Stelle _ts[_set] eine IList implementierende Klasse erzeugt? Also vorher irgendwo mal z.B.

ausblenden C#-Quelltext
1:
this._ts[_set] = new List<tokenStruct>();					


aufgerufen?
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4805
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 20.11.08 12: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:
ausblenden 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<>:
ausblenden 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:
ausblenden C#-Quelltext
1:
2:
3:
4:
private List<_tokenStruct> _list = new List<_tokenStruct>();

// im Code
_list.Add(new _tokenStruct());


am besten, du liest dann mal Kapitel 4: openbook.galileocomp...ng.de/visual_csharp/
miniC# Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 75

Wiin XP Home
C# VS Express 2008
BeitragVerfasst: Fr 21.11.08 02:59 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
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.

Zitat:
am besten, du liest dann mal Kapitel 4: openbook.galileocomp...ng.de/visual_csharp/


Das Buch habe ich gebookmarkt :), aber dennoch danke für den Link .

user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:

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.

ausblenden 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#

_________________
Zitat MDSN : " ... C# (gesprochen: "si scharp") " :D