Frage zu List (of T)

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Frage zu List (of T)

    Hallo zusammen,

    hier ein Teil meiner Klasse

    VB.NET-Quellcode

    1. Imports System.Collections.Generic
    2. Public Class Class1
    3. Implements IEquatable(Of Class1)
    4. Public Property StackTyp() As Integer
    5. Get
    6. Return m_StackTyp
    7. End Get
    8. Set(value As Integer)
    9. m_StackTyp = value
    10. End Set
    11. End Property
    12. Private m_StackTyp As Integer
    13. Public Property StackID() As Integer
    14. Get
    15. Return m_StackID
    16. End Get
    17. Set(value As Integer)
    18. m_StackID = value
    19. End Set
    20. End Property
    21. Private m_StackID As Integer
    22. Public Property StackWert() As Integer
    23. Get
    24. Return m_StackWert
    25. End Get
    26. Set(value As Integer)
    27. m_StackWert = value
    28. End Set
    29. End Property
    30. Private m_StackWert As Integer
    31. Public Property StackAllCards(ByVal Index As Integer) As Integer
    32. Get
    33. Return m_StackAllCards(Index)
    34. End Get
    35. Set(value As Integer)
    36. m_StackAllCards.Add(value)
    37. End Set
    38. End Property
    39. Private m_StackAllCards As List(Of Integer)
    40. Public Function Equals1(other As Class1) As Boolean Implements IEquatable(Of Class1).Equals
    41. If other Is Nothing Then
    42. Return False
    43. End If
    44. Return (Me.StackTyp.Equals(other.StackTyp))
    45. End Function
    46. Public Overrides Function GetHashCode() As Integer
    47. Return StackTyp
    48. End Function
    49. Public Overrides Function Equals(obj As Object) As Boolean
    50. If obj Is Nothing Then
    51. Return False
    52. End If
    53. Dim objAsPart As Class1 = TryCast(obj, Class1)
    54. If objAsPart Is Nothing Then
    55. Return False
    56. Else
    57. Return Equals(objAsPart)
    58. End If
    59. End Function
    60. End Class


    Leider funktioniert der Teil: StackAllCards nicht.
    Was muß ich Ändern?

    Vielen Dank im voraus

    Wastl

    Wastl schrieb:

    Leider funktioniert der Teil: StackAllCards nicht.
    Wie äußert sich das?
    Du hast da so was gemacht wie eine indizierte Property. So was gibt es (eigentlich) nicht.
    Mach da eine oder zwei Prozedur(en) draus.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    indizierte Property funktioniert prächtig in VB.net und hat exakt das gleiche Verhalten wie jeweils ein Get- und eine Set-Funktion.
    Im IL steht auch exakt der gleiche Code. In einer indizierten Property werden automatisch die gleichen Methoden generiert, wie in einem händischen programmieren:

    VB.NET-Quellcode

    1. Protected _storage As Double()()
    2. Public Property Val(rowIndex As Integer, columnIndex As Integer) As Double
    3. Get
    4. Return _storage(rowIndex)(columnIndex)
    5. End Get
    6. Set(value As Double)
    7. _storage(rowIndex)(columnIndex) = value
    8. End Set
    9. End Property
    10. Public Sub SetValue(val As Double, rowindex As Integer, columnIndex As Integer)
    11. _storage(rowindex)(columnIndex) = val
    12. End Sub
    13. Public Function GetValue(rowIndex As Integer, columnIndex As Integer) As Double
    14. Return _storage(rowIndex)(columnIndex)
    15. End Function


    wird zu

    XML-Quellcode

    1. // Methods
    2. .method public specialname
    3. instance float64 get_Val (
    4. int32 rowIndex,
    5. int32 columnIndex
    6. ) cil managed
    7. {
    8. // Method begins at RVA 0x2d3f
    9. // Code size 11 (0xb)
    10. .maxstack 8
    11. IL_0000: ldarg.0
    12. IL_0001: ldfld float64[][] Helpers.Matrix::_storage
    13. IL_0006: ldarg.1
    14. IL_0007: ldelem.ref
    15. IL_0008: ldarg.2
    16. IL_0009: ldelem.r8
    17. IL_000a: ret
    18. } // end of method Matrix::get_Val
    19. .method public specialname
    20. instance void set_Val (
    21. int32 rowIndex,
    22. int32 columnIndex,
    23. float64 'value'
    24. ) cil managed
    25. {
    26. // Method begins at RVA 0x2d4b
    27. // Code size 12 (0xc)
    28. .maxstack 8
    29. IL_0000: ldarg.0
    30. IL_0001: ldfld float64[][] Helpers.Matrix::_storage
    31. IL_0006: ldarg.1
    32. IL_0007: ldelem.ref
    33. IL_0008: ldarg.2
    34. IL_0009: ldarg.3
    35. IL_000a: stelem.r8
    36. IL_000b: ret
    37. } // end of method Matrix::set_Val
    38. .method public
    39. instance void SetValue (
    40. float64 val,
    41. int32 rowindex,
    42. int32 columnIndex
    43. ) cil managed
    44. {
    45. // Method begins at RVA 0x2d58
    46. // Code size 12 (0xc)
    47. .maxstack 8
    48. IL_0000: ldarg.0
    49. IL_0001: ldfld float64[][] Helpers.Matrix::_storage
    50. IL_0006: ldarg.2
    51. IL_0007: ldelem.ref
    52. IL_0008: ldarg.3
    53. IL_0009: ldarg.1
    54. IL_000a: stelem.r8
    55. IL_000b: ret
    56. } // end of method Matrix::SetValue
    57. .method public
    58. instance float64 GetValue (
    59. int32 rowIndex,
    60. int32 columnIndex
    61. ) cil managed
    62. {
    63. // Method begins at RVA 0x2d3f
    64. // Code size 11 (0xb)
    65. .maxstack 8
    66. IL_0000: ldarg.0
    67. IL_0001: ldfld float64[][] Helpers.Matrix::_storage
    68. IL_0006: ldarg.1
    69. IL_0007: ldelem.ref
    70. IL_0008: ldarg.2
    71. IL_0009: ldelem.r8
    72. IL_000a: ret
    73. } // end of method Matrix::GetValue

    In C# glaube ich funktioniert es aber nicht

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „SKeks“ ()

    @SKeks Interessant. Wie sieht der Code aus, wenn Du ihn vom IlSpy als C# ausgeben lässt?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    SKeks schrieb:

    In C# glaube ich funktioniert es aber nicht


    Na das sollte einem aber zu denken geben. Schätze mal in VB.Net funktioniert das nur aus VB6 Kompatibilitätsgründen. Zumal die hier verwendete Methode Val() noch aus VB6 Zeiten stammen dürfte.

    Zumal, wenn die Property mit der List(Of T) gefüllt ist, brauchts da gar keine weitere Property, Methode o.Ä. Da
    MeinObjekt.PropertyListOfFoo(3)
    hierzu eigentlich ausreicht.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „mrMo“ ()

    Lange Rede - Kurzer Sinn:
    Es kommt eine NullReferenceException da m_StackAllCards nicht instanziert ist.
    Einfach einen Parameterlosen Konstruktur erstellen wo m_StackAllCards instanziert wird:

    VB.NET-Quellcode

    1. Public Sub New()
    2. m_StackAllCards = new List(Of Integer)()
    3. End Sub


    PS:
    Man könnte StackAllCards als Default Property deklarieren. Somit reicht der Variablenname + index:

    VB.NET-Quellcode

    1. Default Public Property StackAllCards(ByVal Index As Integer) As Integer
    2. ' ----------
    3. Dim c as new Class1()
    4. Debug.print(c(0))


    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Gutem Morgen

    Es wäre zu allererst sicher ganz interessant zu wissen, wie bekommt die Member m_StackAllCards ihre Werte.

    also so etwas wie ein Kontruktor fehlt hier gänzlich. Eine andere Möglichkeit sehe ich jetzt nicht gerade, auf diesem Wege, die Members mit Werten zu versetzen. (Ausser über die Set der Property und dies ohne vorer instanzierte Member)

    VB.NET-Quellcode

    1. Public Sub New(ByVal l As List(Of Int32))
    2. 'm_StackAllCards = l
    3. Dim arr() As Int32 = l.ToArray'So keine Rückkopplung
    4. m_StackAllCards = New List(Of Int32)(arr)
    5. End Sub


    Was ich mich jetzt auch gefragt habe, muss es denn eine generische Klsse sein, wenn ja, was soll generisch gemacht werden?


    Freundliche Grüsse


    exc-jdbi

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „exc-jdbi“ ()

    Hier der C# Code: ich habe leider keine Ahnung davon, wie hier eine richtige Formatierung aussieht, deswegen nur aus IL-Spy kopiert.

    C#-Quellcode

    1. public double Val
    2. {
    3. get
    4. {
    5. return this._storage[rowIndex][columnIndex];
    6. }
    7. set
    8. {
    9. this._storage[rowIndex][columnIndex] = value;
    10. }
    11. }


    sowie

    C#-Quellcode

    1. public void SetValue(double val, int rowindex, int columnIndex)
    2. {
    3. this._storage[rowindex][columnIndex] = val;
    4. }
    5. public double GetValue(int rowIndex, int columnIndex)
    6. {
    7. return this._storage[rowIndex][columnIndex];
    8. }


    Na das sollte einem aber zu denken geben. Schätze mal in VB.Net funktioniert das nur aus VB6 Kompatibilitätsgründen. Zumal die hier verwendete Methode Val() noch aus VB6 Zeiten stammen dürfte.


    Glaube ich nicht und Val ist der Name meiner Property. Hätte sie auch statt Val Dieter nennen können :)
    Und mein Anfangs erwähntes "glaube ich": Ich kann bei C# zwar verstehen was der Code bezwecken möchte aber ich arbeite nicht damit. Deswegen sind mir eventuelle Feinheiten unbekannt.
    Zusammengenommen glaube ich, dass es hierbei nur um persönlichen Geschmack geht, ob eine property nur eine Eigenschaft nach außen weitergibt oder ob sie noch was tut. Kompiliert wird beides zum gleichen.

    Einfach einen Parameterlosen Konstruktur erstellen wo m_StackAllCards instanziert wird:

    Wie in Beitrag 2 bereits geschrieben :rolleyes:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „SKeks“ ()

    Womit man mal wieder sieht, dass MSIL deutlich mehr kann und unterstützt als VB.NET oder C# jeweils für sich selbst können.
    Denn das, was ILSpy als C# Code ausspuckt, dürfte gar nicht kompilieren, weil rowIndex und colIndex nirgends deklariert sind.

    Zum eigentlichen Problem zurück:
    Der TE hat immer noch nicht verraten, was das eigentliche Problem (Fehlermeldung) ist. Angenommen, m_StackAllCards wird doch irgendwo instanziert, dann sieht der Property-Code dennoch seltsam aus.

    Wastl schrieb:

    VB.NET-Quellcode

    1. Public Property StackAllCards(ByVal Index As Integer) As Integer
    2. Get
    3. Return m_StackAllCards(Index)
    4. End Get
    5. Set(value As Integer)
    6. m_StackAllCards.Add(value)
    7. End Set
    8. End Property

    StackAllCards ist eine indizierte Eigenschaft. Das heißt, nicht nur beim Lesen, sondern auch beim Setzen der Eigenschaft muss der Index angegeben werden. Beim Lesen scheint das soweit in Ordnung zu sein, aber beim Schreiben wird der Index komplett außen vor gelassen und stattdessen der zu schreibende Wert einfach an die List(of T) angefügt. Ich nehme daher an, dass dies das eigentliche Problem ist, denn ein

    VB.NET-Quellcode

    1. StackAllCards(10) = 1
    setzt nicht den Listenwert mit Index 10 auf den Wert 1, sondern fügt die 1 an die Liste an und vergrößert somit deren Elemente-Anzahl. Ich kann mir nicht vorstellen, dass das so gewollt ist.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.

    Bluespide schrieb:

    Is ja witzig.
    Was zu beweisen war. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!