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 :

CORE 8.0 et constructeur primaire


Sujet :

C#

  1. #1
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 721
    Points : 5 366
    Points
    5 366
    Par défaut CORE 8.0 et constructeur primaire
    Bonjour,

    J'ai un problème avec un constructeur primaire (C#12).

    Mon point de départ est le code suivant :
    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
    internal class AnonymousDataProvider
    {
        public AnonymousDataProvider(Configuration configuration)
        {
            faker = new Faker(configuration.Generation.Language.ToString().ToLowerInvariant());
        }
     
        public string LastName()
        {
            return faker.Name.LastName();
        }
     
        public string PhoneNumber()
        {
            return faker.Phone.PhoneNumber("0# ## ## ## ##");
        }
     
        private readonly Faker faker;
    }
    Visual studio affiche le message "IDE0290 : Use primary constructor".
    Le [Ctrl]+[;] me propose cette correction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    internal class AnonymousDataProvider(Configuration configuration)
    {
        public string LastName()
        {
            return faker.Name.LastName();
        }
     
        public string PhoneNumber()
        {
            return faker.Phone.PhoneNumber("0# ## ## ## ##");
        }
     
        private readonly Faker faker = new (configuration.Generation.Language.ToString().ToLowerInvariant());
    }
    Cela enlève bien le message mais affiche désormais cet avertissement :
    S3604 : Remove the member initializer, all constructors set an initial value for the member

    Cet avertissement me parait bizarre mais si je comprend bien, ça me dit que mon Faker n'a pas besoin d'être initialisé.
    D'ailleurs le [Ctrl]+[;] me propose l'option "Remove redundant initializer".

    J'essaie donc cette option.
    Le code devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    internal class AnonymousDataProvider(Configuration configuration)
    {
        public string LastName()
        {
            return faker.Name.LastName();
        }
     
        public string PhoneNumber()
        {
            return faker.Phone.PhoneNumber("0# ## ## ## ##");
        }
     
        private readonly Faker faker;
    }
    Mais du coup, j'ai les avertissements suivants :
    S3459 : Remove unassigned field 'faker', or set its value
    CS9113 : Parameter 'configuration' is unread.

    Bref, il y a quelque chose qui m'échappe mais je ne parviens pas à savoir quoi.
    Quelqu'un a-t-il une solution ?

    Merci.

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 721
    Points : 5 366
    Points
    5 366
    Par défaut
    Le code suivant ne provoque plus de messages ou d'avertissements.
    Mais, je trouve que cela fait un montage un peu trop complexe juste pour initialiser mon faker.
    Je laisse la discussion ouverte pour le moment.

    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
    internal class AnonymousDataProvider(Configuration configuration)
        : AbstractDataProvider(configuration)
    {
        public string LastName()
        {
            return Faker.Name.LastName();
        }
     
        public string PhoneNumber()
        {
            return Faker.Phone.PhoneNumber("0# ## ## ## ##");
        } 
    }
     
    internal abstract class AbstractDataProvider(Configuration configuration)
    {
        protected Faker Faker => faker ??= new Faker(configuration.Generation.Language.ToString());
        private Faker? faker;
    }

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 232
    Points : 1 798
    Points
    1 798
    Par défaut
    Est-ce que ça ne fonctionne pas ? (dans le 2nd code, il n'y a pas l'appel au constructeur Faker, une erreur de copier/coller ou de la correction proposée ?)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    internal class AnonymousDataProvider(Configuration configuration)
    {
        public string LastName()
        {
            return faker.Name.LastName();
        }
     
        public string PhoneNumber()
        {
            return faker.Phone.PhoneNumber("0# ## ## ## ##");
        }
     
        private readonly Faker faker =new Faker(configuration.Generation.Language.ToString().ToLowerInvariant());
    }

  4. #4
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 721
    Points : 5 366
    Points
    5 366
    Par défaut
    Citation Envoyé par umfred Voir le message
    Est-ce que ça ne fonctionne pas ? (dans le 2nd code, il n'y a pas l'appel au constructeur Faker, une erreur de copier/coller ou de la correction proposée ?)
    Il n'y a pas d'erreur dans ce code mise à part le warning cité.
    L'unique différence entre ta version et la mienne est que j'utilise l'expression new simplifiée.
    Avec ta proposition, j'obtiens donc le même warning plus une suggestion pour simplifier le new.

  5. #5
    Membre émérite
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 317
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 317
    Points : 2 507
    Points
    2 507
    Par défaut
    Bonjour,

    J'ai le même message dans une application MVC qui doit recevoir un argument de l'URL, et qui donc doit transmettre cet argument par le constructeur du contrôleur.

    Dans ces conditions, je me demande bien quel sens peut avoir un constructeur sans arguments.

    Je me demande si ils ne poussent pas un peu loin le bouchon.

  6. #6
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 721
    Points : 5 366
    Points
    5 366
    Par défaut
    J'ai trouvé.
    En réalité il n'y a pas de problème.
    Ou plutôt il y a avait un faux problème, enfin deux.

    Il y avait un souci dans .Net 8.0.0 donc dans le SDK 8.0.100 où ça ne fonctionnait pas à cause du readonly.
    Ce problème a été corrigé par Microsoft dans la version 8.0.5 et donc dans le SDK 8.0.300.

    Et ma version de Sonar Lint générait un faux positif.
    https://github.com/SonarSource/sonar...g/9.14.0.81108
    Nom : 2024-05-27_163304.png
Affichages : 56
Taille : 8,1 Ko

    Au final, mon code est devenu beaucoup plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        internal class AnonymousDataProvider(Configuration configuration)
        {
            public string LastName() => faker.Name.LastName();
            public string PhoneNumber() => faker.Phone.PhoneNumber("0# ## ## ## ##");
     
            private readonly Faker faker = new (configuration.Generation.Language.ToString().ToLowerInvariant());
        }

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

Discussions similaires

  1. [Framework] [Spring Core] conversion de valeur pour un constructeur
    Par robert_trudel dans le forum Spring
    Réponses: 1
    Dernier message: 01/09/2008, 09h16
  2. [Framework] [Core] bean et constructeur avec paramètre
    Par robert_trudel dans le forum Spring
    Réponses: 3
    Dernier message: 10/07/2008, 13h52
  3. Procédure stocké:Insert et renvoie de la clé primair
    Par caramel dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 17/04/2003, 09h34
  4. Problème pour récupérer la clé primaire
    Par caramel dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 11/04/2003, 13h57
  5. pb constructeurs classes dérivant classe abstraite
    Par Cornell dans le forum Langage
    Réponses: 2
    Dernier message: 10/02/2003, 19h02

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