IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Condition lors de l'initialisation d'une propriété [Débutant]


Sujet :

C#

  1. #1
    Membre régulier
    Homme Profil pro
    Chef de projet BI
    Inscrit en
    Août 2013
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Chef de projet BI

    Informations forums :
    Inscription : Août 2013
    Messages : 42
    Points : 82
    Points
    82
    Par défaut Condition lors de l'initialisation d'une propriété
    Bonjour à tous,

    Débutant en C#, j'espère que je vais utiliser les bons termes pour vous faire comprendre mon problème.

    Lors de l'initialisation d'un objet, je souhaite pouvoir initialiser ou non une propriété en fonction de la valeur NULL ou non d'un datareader.
    Autrement dit, dans le code suivant, si le prénom récupéré en base est NULL, alors il ne faut pas initialiser la propriété FirstName :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Student student = new Student
    {
    FirstName = drSQL["FirstName"].ToString(),
    LastName = drSQL["LastName"].ToString(),
    };
    J'ai essayé plusieurs syntaxe du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    !drSQL.IsDBNull(1) ? FirstName = drSQL["FirstName"].ToString() : null,
    Ici, ça ne compile pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FirstName = !drSQL.IsDBNull(1) ? drSQL["FirstName"].ToString() : null,
    Dans ce cas, ça compile mais c'est complétement inutile... et puis la propriété est quand même initialisée

    Je précise que j'ai plusieurs propriétés à traiter de cette façon donc les solutions du type ci dessous ne sont pas envisageable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    ServerConnection serverConnection;
    if (!windowsAuthentication)
    {
        serverConection = new ServerConnection()
        {
            ServerInstance = server,
            LoginSecure = windowsAuthentication,
            Login = user,
            Password = password
        };
    }
    else
    {
        serverConection = new ServerConnection()
        {
            ServerInstance = server,
            LoginSecure = windowsAuthentication,
        };
    }

    Par avance, merci pour votre aide.
    Jonathan

  2. #2
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 760
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par III Jonathan III Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FirstName = !drSQL.IsDBNull(1) ? drSQL["FirstName"].ToString() : null,
    Dans ce cas, ça compile mais c'est complétement inutile... et puis la propriété est quand même initialisée
    Avec cette syntaxe, FirstName sera toujours initialiser, puisque le symbole = représente ici une affectation.
    Il n'existe pas d'affectation conditionnelle. La seule possibilité pour faire ce que tu souhaites faire, c'est d'abord d'instancier l'objet, et ensuite d'utiliser une conditionnelle par propriété :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Student student = new Student();
     
    if (!drSQL.IsDBNull(1))
    {
       student.FirstName = drSQL["FirstName"].ToString();
    }
     
    if (!drSQL.IsDBNull(2))
    {
       student.LastName = drSQL["LastName"].ToString();
    }
     
    ...
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  3. #3
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    je ne comprends pas trop, ni le problème, ni "FirstName sera toujours initialiser, puisque le symbole = représente ici une affectation"

    s'il met null alors que c'était null, certes ca initialise, mais à rien
    s'il veut garder une valeur qui serait contenu avant (on ne sait trop comment) il pourrait dans le pire des cas mettre : FirstName à la fin ; ce qui équivaudrait aux ifs mais avec moins de lignes de code

    si le problème c'est de ne pas rentrer dans le set de la propriété (qui contiendrait du code), il reste possible de setter la variable privée au lieu de la propriété (en c# la variable privée d'une propriété automatique n'est pas accessible (ou alors je n'ai pas trouvé comment ^^))

    après je vois bien des solutions complexes à base d'expressions trees compilés mais bon ca serait dommage d'en arriver là
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 899
    Points : 1 916
    Points
    1 916
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    s'il veut garder une valeur qui serait contenu avant (on ne sait trop comment)
    Valeur par défaut affectée par le constructeur ou en affectation pré-constructeur. Mais effectivement ça reste un cas improbable.

  5. #5
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    Citation Envoyé par III Jonathan III Voir le message
    Autrement dit, dans le code suivant, si le prénom récupéré en base est NULL, alors il ne faut pas initialiser la propriété FirstName :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Student student = new Student
    {
    FirstName = drSQL["FirstName"].ToString(),
    LastName = drSQL["LastName"].ToString(),
    };
    Pourquoi ne pas mettre la condition dans le setter?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    public class Student
    {
        private string _FirstName;
            public string FirstName
            {
                get
                {
                    return _FirstName;
                }
                set
                {
                    if (value != null)
                    {
                        _FirstName = value;
                    }
                }
            }
    }

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Je pense qu'en nombre de lignes de code une encapsulation serait préférable
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 760
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par ZenZiTone Voir le message
    Pourquoi ne pas mettre la condition dans le setter?
    Attention, il ne sera plus possible de réinitialiser à null la propriété... Ou alors il faut prévoir un autre mécanisme, comme une méthode ClearFirstName().
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  8. #8
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    Citation Envoyé par François DORIN Voir le message
    Attention, il ne sera plus possible de réinitialiser à null la propriété... Ou alors il faut prévoir un autre mécanisme, comme une méthode ClearFirstName().
    D'un autre côté pour un string c'est pas étonnant, non? Autrement, si on accepte la valeur null on la définit comme nullable.

    [EDIT] Autant pour moi, le type string est déjà nullable

  9. #9
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 760
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Le type string est une classe et est donc nullable (toutes les classes le sont).

    Donc oui, on peut vouloir faire un xxx.FirstName = null qui aura un comportement inattendu et contre-intuitif avec ta proposition. Vigilance donc.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  10. #10
    Membre régulier
    Homme Profil pro
    Chef de projet BI
    Inscrit en
    Août 2013
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Chef de projet BI

    Informations forums :
    Inscription : Août 2013
    Messages : 42
    Points : 82
    Points
    82
    Par défaut
    Merci pour toutes ces informations, j'ai commencé à revoir mon code de cette façon :

    Citation Envoyé par François DORIN Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Student student = new Student();
     
    if (!drSQL.IsDBNull(1))
    {
       student.FirstName = drSQL["FirstName"].ToString();
    }
     
    if (!drSQL.IsDBNull(2))
    {
       student.LastName = drSQL["LastName"].ToString();
    }
     
    ...
    Puis j'ai appris l'existence de la propriété XmlIgnore qui permet d'ignorer les propriétés NULL lors de la sérialisation. Ce qui répond parfaitement à mon souci.

    PS : J'ai volontairement omis de parler de la sérialisation dans ma question pour éviter de charger le post, je ne pensais pas que la solution pouvait venir de là.

  11. #11
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par III Jonathan III Voir le message
    PS : J'ai volontairement omis de parler de la sérialisation dans ma question pour éviter de charger le post, je ne pensais pas que la solution pouvait venir de là.
    c'est souvent le problème, qui se nomme problème XY
    quelqu'un veut faire X, il part sur l'idée de le faire avec Y, bloque, pose sa question sur Y alors qu'avec la problématique de base c'est souvent plus simple d'y répondre
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  12. #12
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 760
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par III Jonathan III Voir le message
    Puis j'ai appris l'existence de la propriété XmlIgnore qui permet d'ignorer les propriétés NULL lors de la sérialisation. Ce qui répond parfaitement à mon souci.
    Attention ! XmlIgnore permet d'indiquer de ne pas sérialiser une propriété, ce qui est très différent d'ignorer les propriétés dont la valeur est null. Une propriété marquée par cet attribut ne sera jamais sérialisé, que sa valeur soit nulle ou pas.


    PS : J'ai volontairement omis de parler de la sérialisation dans ma question pour éviter de charger le post, je ne pensais pas que la solution pouvait venir de là.
    Comme précisé par Pol63, il vaut mieux expliciter le contexte et parler de ce que vous souhaitez obtenir, plutôt que de ne parler que de la partie visible de l'iceberg.

    Donc, on oublie dans un premier temps ces histoires d'initialisation. Que souhaitez-vous obtenir exactement ? Donnez nous la structure de la classe et du XML que vous souhaitez manipuler.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Incompatibilité de type lors de la lecture d'une propriété
    Par ptitcool dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 22/06/2014, 12h20
  2. Réponses: 9
    Dernier message: 19/08/2009, 10h43
  3. problème lors de l'initialisation d'une Applet
    Par blueLight dans le forum Applets
    Réponses: 0
    Dernier message: 27/07/2009, 11h51
  4. Problème d'initialisation d'une propriété
    Par choas dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 21/10/2008, 15h53
  5. [POO] Problème lors de l'appel d'une propriété d'un objet.
    Par akecoocoo dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 24/08/2005, 08h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo