| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Arrays in Structure (289 mal gelesen)
|
Theo37 Mitglied Techniker
Beiträge: 423 Registriert: 08.10.2008
|
erstellt am: 19. Jul. 2010 14:34 <-- editieren / zitieren --> Unities abgeben:
Hallo an Alle, eine Frage zu VB.Net. In möchte schreiben in einer Structure: Structure Blockzeile Dim Ident As String Dim Attri(15) As String End Structure Das geht aber nicht, die fünfzehn in der Klammer geht nicht, da bekomme ich eine Fehlermedlung. Also lasse ich die Klammer leer. Was muß ich machen um das Array später doch so verwenden zu können: For Y = 0 To 15 zeile(i).Attri(Y) = xlstab.Cells(i + 1, Y + 2).Value Next Irgendwas mit Redim? Vielen Dank, Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 19. Jul. 2010 22:28 <-- editieren / zitieren -->
Hi, dieses würde funktionieren:
Code: Structure Blockzeile Dim Ident As String Dim Attri() As String End Structure Public Sub test() Dim tBZ As Blockzeile tBZ.Ident = "4711" ReDim tBZ.Attri(15) For i As Integer = 0 To 15 tBZ.Attri(i) = i.ToString Next End Sub
ABER: wenn es sich vermeiden läßt, dann bau das gleich als Klassen oder als reines Array auf. Begründung: Struct-Definitionen sind eigentlich ein Relikt aus der Vergangenheit (und imho nur aus Kompatibilitätsgründen mitgeführt) und Du kannst diese nicht als Parameter an Funktionen übergeben, die in einem anderen Namespace liegen. Damit wird alles gewinnbringende wie z.B. Klassenvererbung etc zunichte gemacht. Dazu kommt auch noch, dass ich stark annehme, dass das Freimachen des Speichers (Verwaltung der Garbage-Collection) mit dieser Form der Speicherung wohl keine große Freude hat, das ist aber jetzt nur Bauchgefühl.
Ein kleines (ziemlich sorgloses) Beispiel als Ersatz:
Code: Public Sub test2() 'erstellen einer Instanz Dim tBZ As Blockzeile = New Blockzeile("123") 'anlegen der Werte für ATTRI For i As Integer = 0 To 15 Call tBZ.addAttri(i.ToString) Next 'auslesen der ATTRI-Werte For Each tStr As String In tBZ.Attri Debug.Print(tStr) Next End Sub Public Class Blockzeile Private pIdent As String = "" Private pAttri As List(Of String) = Nothing
Public Sub New(ByVal Ident As String) pIdent = Ident pAttri = New List(Of String) End Sub Public Sub addAttri(ByVal Str As String) pAttri.Add(Str) End Sub Public ReadOnly Property Attri() As List(Of String) Get Return pAttri End Get End Property End Class
- alfred -
------------------ www.hollaus.at |
Theo37 Mitglied Techniker
Beiträge: 423 Registriert: 08.10.2008
|
erstellt am: 20. Jul. 2010 14:19 <-- editieren / zitieren --> Unities abgeben:
Hallo Alfred, ich verwende die erste Lösung. Sieht dann so aus: For i = 0 To Anzahl ReDim zeile(i).Attri(0 To 15) zeile(i).Ident = xlstab.Cells(i + 1, 1).Value For Y = 0 To 15 zeile(i).Attri(Y) = xlstab.Cells(i + 1, Y + 2).Value Next Next Die Zweite Lösung schau ich mir mal an. Kann ich die Klasse auch als Array verwenden? Erscheint mir etwas aufwendiger. Gruß, Theo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 20. Jul. 2010 14:45 <-- editieren / zitieren -->
Hi, >> Kann ich die Klasse auch als Array verwenden? Jede Instanz einer Klassendefinition darfst Du als eigene Objektdefinition auffassen und diese darfst Du in Listen, in Collections, in Arrays etc sammeln. >> Erscheint mir etwas aufwendiger.
Ja, es wird um ein paar Zeilen mehr in die Tastatur geklopft, der Zeitaufwand von vielleicht 1 Min wird aber wohl nicht das Problem sein. Du siehst aber auch schon an meinem Beispiel, dass eben jede Klasse wiederum ihre eigenen Funktionen haben kann (die Zeilen im Hauptcode werden daher minimiert) und damit gewinnt auch die Struktur des Programms deutlich an Lesbarkeit. Die eine Minute, die Du so am Anfang verlierst, hast sich beim ersten Nachbearbeiten Deines Programms hundertfach amortisiert. - alfred - ------------------ www.hollaus.at |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|