Affecter valeur à tableau défini dans une structure (VB.NET)
Résolu/Fermé
danyvio
Messages postés
3
Date d'inscription
vendredi 25 janvier 2019
Statut
Membre
Dernière intervention
5 juin 2020
-
Modifié le 9 févr. 2019 à 12:21
danyvio Messages postés 3 Date d'inscription vendredi 25 janvier 2019 Statut Membre Dernière intervention 5 juin 2020 - 12 févr. 2019 à 15:35
danyvio Messages postés 3 Date d'inscription vendredi 25 janvier 2019 Statut Membre Dernière intervention 5 juin 2020 - 12 févr. 2019 à 15:35
A voir également:
- Affecter valeur à tableau défini dans une structure (VB.NET)
- Tableau croisé dynamique - Guide
- Tableau ascii - Guide
- Tableau word - Guide
- Trier tableau excel - Guide
- Imprimer tableau excel sur une page - Guide
4 réponses
NHenry
Messages postés
15175
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
25 décembre 2024
350
9 févr. 2019 à 12:25
9 févr. 2019 à 12:25
Il y a quelques différences entre les structures et les classes, entre autre :
- Les structures sont transférées par valeur par défaut contre par référence pour les classes.
- Les structures ne peuvent pas avoir de constructeur par défaut (il faut qu'il soit paramétré et appelé explicitement).
Dans ton cas, il faut soit que tu appelles la méthode Initialize "manuellement" avant de pouvoir utiliser le tableau ou alors l'assigner directement avec un tableau déjà prêt.
- Les structures sont transférées par valeur par défaut contre par référence pour les classes.
- Les structures ne peuvent pas avoir de constructeur par défaut (il faut qu'il soit paramétré et appelé explicitement).
Dans ton cas, il faut soit que tu appelles la méthode Initialize "manuellement" avant de pouvoir utiliser le tableau ou alors l'assigner directement avec un tableau déjà prêt.
Kalissi
Messages postés
218
Date d'inscription
jeudi 2 mai 2013
Statut
Membre
Dernière intervention
15 juillet 2019
20
11 févr. 2019 à 21:39
11 févr. 2019 à 21:39
Bonjour,
Il te manque quelques lignes ...
K
Il te manque quelques lignes ...
Public Jeu_initial As Jeu = New Jeu Public Sub Main() Jeu_initial.Niv_appel = 6 Jeu_initial.Initialize() Jeu_initial.Plq(1).Valeur = 0 Jeu_initial.Plq(2).Valeur = 0 Console.ReadLine() End Sub
K
danyvio
Messages postés
3
Date d'inscription
vendredi 25 janvier 2019
Statut
Membre
Dernière intervention
5 juin 2020
11 févr. 2019 à 22:08
11 févr. 2019 à 22:08
Bonjour et Merci Kalissi ! J'étais prêt à casser mon PC à coups de masse :-). Je vais étudier de près cette syntaxe !
Utilisateur anonyme
11 févr. 2019 à 21:54
11 févr. 2019 à 21:54
Bonsoir
Comme te l'as expliqué NHenry, c'est justement un problème de pas objet, puisqu'une structure n'est pas un objet.
Il faut comprendre que VB.Net n'est pas un langage orienté objet, mais "tout" objet. La différence est importante, même si complexe à cerner au début.
Exemple, si tu tapes
Un simple 1 dans ton code est déjà un objet de type Integer.
Dans un langage orienté objet ce sera une variable (pas un objet) une fois le code compilé.
Je nuance malgré tout, les types de base, (Integer, bool, double, etc... Attention pas les string) sont basé sur des structures. Ce sont donc des types Valeurs.
A noté que le binding, un des gros points forts de .Net (surtout en WPF), marche mal, voire pas, avec des structures.
J'ai l'expérience du C où une structure contenant elle-même des structures en cascade ne pose pas de problème.
Toute aide sera bienvenue, sans m'orienter SVP vers la POO ou autre.
Comme te l'as expliqué NHenry, c'est justement un problème de pas objet, puisqu'une structure n'est pas un objet.
Il faut comprendre que VB.Net n'est pas un langage orienté objet, mais "tout" objet. La différence est importante, même si complexe à cerner au début.
Exemple, si tu tapes
dim un as string = 1.ToString()Intellisense ne va pas te proposer une liste de méthode quand tu vas tapper le . car il anticipe que tu tapes un double. Mais ça compile et ça marche.
Un simple 1 dans ton code est déjà un objet de type Integer.
Dans un langage orienté objet ce sera une variable (pas un objet) une fois le code compilé.
Je nuance malgré tout, les types de base, (Integer, bool, double, etc... Attention pas les string) sont basé sur des structures. Ce sont donc des types Valeurs.
A noté que le binding, un des gros points forts de .Net (surtout en WPF), marche mal, voire pas, avec des structures.
Kalissi
Messages postés
218
Date d'inscription
jeudi 2 mai 2013
Statut
Membre
Dernière intervention
15 juillet 2019
20
Modifié le 12 févr. 2019 à 14:31
Modifié le 12 févr. 2019 à 14:31
Bonjour,
Voici une autre façon de faire avec des objets instanciés et non des structures.
A noter qu'au lieu de redimensionner l'objet plaque, j'ai créé une liste fortement typé.
Je te recommande d'éviter d'utiliser des instructions qui se rattache à la référence
Microsoft.VisualBasic
VisualStudio // Explorateur de solution // Clic droit sur projet // Propriétés // Onglets référence
Décoche la référence à Microsoft.VisualBasic
Cela t'éviteras d'utiliser des instructions VB6 (ReDim, CInt, Len, etc ..), toutes ces instructions on leur
équivalent .NET natif.
Dernier point : Il est toujours préférable d'utiliser des IList(Of T) au lieu de List(Of T), le IList est plus
performant au moment d'exécuter des méthodes LinQ sur ces listes.
Un fichier dans le même projet avec les structures qui sont remplacé par des classes (i.e. Objets)
Et le module avec le main :
K
Voici une autre façon de faire avec des objets instanciés et non des structures.
A noter qu'au lieu de redimensionner l'objet plaque, j'ai créé une liste fortement typé.
Je te recommande d'éviter d'utiliser des instructions qui se rattache à la référence
Microsoft.VisualBasic
VisualStudio // Explorateur de solution // Clic droit sur projet // Propriétés // Onglets référence
Décoche la référence à Microsoft.VisualBasic
Cela t'éviteras d'utiliser des instructions VB6 (ReDim, CInt, Len, etc ..), toutes ces instructions on leur
équivalent .NET natif.
Dernier point : Il est toujours préférable d'utiliser des IList(Of T) au lieu de List(Of T), le IList est plus
performant au moment d'exécuter des méthodes LinQ sur ces listes.
Un fichier dans le même projet avec les structures qui sont remplacé par des classes (i.e. Objets)
Public Class Objet_Plaque #Region "--- Attributs ---" Private zValeur As UInt32 = 0 #End Region #Region "--- Propriétés ---" Public Property Valeur As UInt32 Get Return Me.zValeur End Get Set(value As UInt32) Me.zValeur = value End Set End Property #End Region End Class Public Class Objet_Jeu #Region "--- Attributs ---" Private zLsPlq As IList(Of Objet_Plaque) = Nothing Private zNiv_appel As Int32 = 0 #End Region #Region "--- Propriétés ---" Public Property LsPlq As IList(Of Objet_Plaque) Get Dim OldPlq As IList(Of Objet_Plaque) = Me.zLsPlq If (OldPlq Is Nothing) Then Me.zLsPlq = New List(Of Objet_Plaque) End If Return Me.zLsPlq End Get Set(value As IList(Of Objet_Plaque)) Me.zLsPlq = value End Set End Property Public Property Niv_appel As Int32 Get Return Me.zNiv_appel End Get Set(value As Int32) Me.zNiv_appel = value End Set End Property #End Region End Class
Et le module avec le main :
Public Module DonneesTravail #Region "--- Attributs ---" Private zJeu_Initial As Objet_Jeu = Nothing #End Region #Region "--- Propriétés ---" Public Property Jeu_Initial As Objet_Jeu Get Dim OldJeu As Objet_Jeu = zJeu_Initial If (OldJeu Is Nothing) Then zJeu_Initial = New Objet_Jeu End If Return zJeu_Initial End Get Set(value As Objet_Jeu) zJeu_Initial = value End Set End Property #End Region Public Sub Main() Dim ObjetPlq As Objet_Plaque = Nothing With Jeu_Initial .Niv_appel = 6 .LsPlq = New List(Of Objet_Plaque) ObjetPlq = New Objet_Plaque ObjetPlq.Valeur = 0 .LsPlq.Add(ObjetPlq) ObjetPlq = New Objet_Plaque ObjetPlq.Valeur = 0 .LsPlq.Add(ObjetPlq) End With Console.WriteLine(Jeu_Initial.LsPlq.Count.ToString) Console.ReadLine() End Sub End Module
K
danyvio
Messages postés
3
Date d'inscription
vendredi 25 janvier 2019
Statut
Membre
Dernière intervention
5 juin 2020
12 févr. 2019 à 15:35
12 févr. 2019 à 15:35
Merci !!!