| |
VB.NET - Ein- und UmsteigerRe: KeyNotFoundExeption in abgeleiteter Klasse | | | Autor: Manfred X | Datum: 21.10.10 15:53 |
| Hallo!
Kann man das Ganze nicht einfach dadurch lösen, dass
Du aus Albumstruct eine Klasse machst(*) und bei der
Initialisierung einer neuen Instanz (Konstruktor) bei der
entsprechenden Eigenschaft "[Leer]" einträgst,
sowie beim Versuch der Zuweisung eines String durch
"String.IsNullOrWhiteSpace" prüfst, ob eine Angabe
vorhanden ist und, falls nicht, diese Eigenschaft
re-initialisierst.
(*) falls Albumstruct nicht bereits eine Klasse ist ...
MfG
Manfred
Beitrag wurde zuletzt am 21.10.10 um 15:59:19 editiert. | |
KeyNotFoundExeption in abgeleiteter Klasse | | | Autor: Schü | Datum: 21.10.10 13:18 |
| Hallo!
Habe eine abgeleitete Klasse von System.Collections.Generic.SortedDictionary(Of String, AlbumStruct)
Dort möchte ich eigentlich die Add und die Remove-Methoden überschreiben. Offensichtlich Falsch von mir gemacht!
Der Clou ist, dass bei einem Leeren sAlbumName der Schlüssel ''Leer'' erzeugt/abgefragt wird.
Friend Class SortedAlbumStruct
Inherits System.Collections.Generic.SortedDictionary(Of String, _
AlbumStruct)
Default Public Overloads ReadOnly Property Item(ByVal Index As Integer) _
As AlbumStruct
Get
Try
Return MyBase.Item(Keys(Index))
Catch
Throw New IndexOutOfRangeException
End Try
End Get
End Property
Default Public Overloads ReadOnly Property Item(ByVal sAlbumName As _
String) As AlbumStruct
Get
Try
If sAlbumName = "" Then sAlbumName = "[Leer]"
Debug.Print(MyBase.Count.ToString)
Return MyBase.Item(sAlbumName) '---> Fehler:
' KeyNotFounmdExeption!
Catch
Throw New IndexOutOfRangeException
End Try
End Get
End Property
Public ReadOnly Property Items() As String()
Get
Dim Res(Keys.Count - 1) As String
Me.Keys.CopyTo(Res, 0)
Return Res
End Get
End Property
Public Shadows Sub Add(ByVal sAlbumName As String, ByVal iNr As Integer)
If _Vorschau Is Nothing OrElse _Vorschau.Items.Count < 1 Then Exit _
Sub
If sAlbumName = "" Then sAlbumName = "[Leer]"
If Not Me.ContainsKey(sAlbumName) Then
Dim X As New AlbumStruct
X.Add(iNr)
MyBase.Add(sAlbumName, X)
Else
Dim X As AlbumStruct = MyBase.Item(sAlbumName)
X.Add(iNr)
End If
Debug.Print(MyBase.Count.ToString)
End Sub
Public Shadows Function Remove(ByVal sAlbumName As String) As Boolean
If sAlbumName = "" Then sAlbumName = "[Leer]"
If Not Me.ContainsKey(sAlbumName) Then Return True
Return MyBase.Remove(sAlbumName)
End Function
End Class Wenn ich nun diese Klasse erstelle und ein Element mit einem leeren String anlege, tritt dabei kein Fehler auf. Nur wenn ich dann .Item("") abfrage tritt ein Fehler auf.
Ich habe schon lange gesucht, aber nichts gefunden.
Bei der Add-Methode wird nach dem Hinzufügen korrekt eine Anzahl von 1 ausgegeben.
Bei der Abfrage dann über Item(sAlbumName) aber ist MyBase.count auf einmal 0!!
Jemand eine Idee?
Achja, die Klasse AlbumStruct könnte genausogut zum Test ein Integer oder String sein.
Die eigentliche Klasse AlbumStruct ist sehr Komplex.
(Windows XP, Framework 4.0)
Schü
Beitrag wurde zuletzt am 21.10.10 um 13:18:34 editiert. | |
Re: KeyNotFoundExeption in abgeleiteter Klasse | | | Autor: Maas | Datum: 21.10.10 18:35 |
| Offtopic:
Du solltest auf gar keinen Fall alle Exceptions mit Standard-TryCatch abfangen und dann daraus eine IndexOutOfRangeException machen. Nicht alle Exceptions sind IndexOutOfRange. Kann natürlich sein, dass SortedDictionary.Item nur diese Exception schmeisst (steht in der Doku welche das dann wären), aber dann würde das Ganze gar keinen Sinn machen. Also so oder so: weg mit dem TryCatch. Das ist nur eine Quelle mehr, die für Verwirrung sorgt.
Ansonsten schließe ich mich ManfredX an. Wieso keine Konstruktor-Lösung? Ein Konstruktor geht auch bei Structures, außer dass der Standard-Konstruktor immer existiert, aber eine Klasse wäre schon besser.
Es gilt außerdem die Regel, dass Structures klein zu halten sind (ich glaube maximal 8KB/B? Verbrauch im Speicher pro Instanz). Das liegt daran, dass bei Structures keine Referenz bei einer Variablenzuweisung erstellt wird, sondern eine neue Instanz. (imho) Google mal nach Stack, Heap, Value-Type und Reference-Type. (Mein Wissen ist dahingehend auch nicht so besonders, also besser nachrecherchieren).
Wenn deine Structure also sehr groß ist, solltest du sie allein schon deswegen in eine Klasse umwandeln.
Maas | |
Re: KeyNotFoundExeption in abgeleiteter Klasse | | | Autor: Schü | Datum: 21.10.10 20:00 |
| Ups,
ich weiss im Moment gar nicht, ob Ihr mich richtig verstanden habt.
AlbumStruct ist eine Klasse (Struct ist sicherlich irreführend!).
Das mit dem Abfangen des Fehlers im Try Catch ... OK stimmt. Sollte man lassen.
Als ich schrieb, dass AlbumStruct auch ein String sein könne, meinte ich, dass ich die Klasse AlbumStruct nicht posten wollte, sondern Ihr solltet anstatt AlbumStruct einfach einen String oder so was einfügen, damit der Code läuft. Ich meinte z.B. folgendes:
Public Class AlbumStruct
Public iNr as Integer
Public Name as string
End Class Aber: Ich möchte den Nullstring in der Klasse abfangen. Dafür sind Propertys da. Sonst hätte ich alle Klassenvariablen einfach mit Public deklarieren können.
Mein Problem ist aber, dass beim Hinzufügen mittels .Add() das Element in MyBase korrekt eingefügt wird, aber bei der Abfrage über .Item() dann plötzlich MyBase.Count=0 ist. Daher tritt KeyNotFoundExeption auf.
Schü | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
TOP! Unser Nr. 1
Neu! sevDataGrid 3.0
Mehrspaltige Listen, mit oder ohne DB-Anbindung. Autom. Sortierung, Editieren von Spalteninhalten oder das interaktive Hinzufügen von Datenzeilen sind ebenso möglich wie das Erstellen eines Web-Reports. Weitere InfosTipp des Monats Access-Tools Vol.1
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|