web-dev-qa-db-fra.com

Comment déclarer un type d'enregistrement C #?

J'ai lu sur un blog que C # 7 comportera des types d'enregistrement

class studentInfo(string StudentFName, string StudentMName, string StudentLName);

Mais quand je l'ai essayé, j'obtiens ces erreurs

CS0116 Un espace de noms ne peut pas contenir directement des membres tels que des champs ou des méthodes
CS1022 Type ou définition d'espace de noms, ou fin de fichier attendue
CS1514 {attendu

Comment cela est-il censé fonctionner?

24
Jeremy Thompson

Les types d'enregistrement ne sont pas (encore) implémentés en C #. Voir la proposition dans le référentiel GitHub officiel:

https://github.com/dotnet/csharplang/blob/master/proposals/records.md

Discutez ou votez sur https://github.com/dotnet/csharplang/issues/39

36
DavidG

Les types d'enregistrement étaient sur la feuille de route pour C # 7.0, mais ont finalement été retardés jusqu'à une version ultérieure du langage.

Pour citer Mads Torgersen en réponse à cet article de blog ,

[Constructeurs principaux] sont toujours sur le radar, avec le concept connexe de types d'enregistrement (que nous avons considéré pour C # 7.0) , et j'espère que nous pouvons atterrir sur un meilleur design - peut-être un qui englobe les deux.

Depuis la sortie de C # 7, la proposition GitHub pour cette fonctionnalité de langage indique toujours que l'implémentation est "En cours".

8
BJ Myers

[ Réécrit pour refléter l'état actuel des choses ]

Pour ajouter aux autres réponses, vous pouvez facilement suivre quand les fonctionnalités C # sont crayonnées pour apparaître en C # ces jours-ci. Par exemple, le problème Champion "Records" montre l'état de la réflexion autour des enregistrements. Des enregistrements sont maintenant prévus pour C # 9. Mais cette fonctionnalité était auparavant présentée pour C # 6, C # 7 et C # 8, donc elle ne reste qu'une aspiration.

4
David Arno

Il existe un moyen si vous cherchez un moyen paresseux d'implémentation de constructeurs en utilisant la fonctionnalité C # 7 actuellement disponible:

class Lazystructor
{
    int a;
    float b;
    WebClient c;

    public Lazystructor(int a, float b, WebClient c)
        =>  (this.a, this.b, this.c) = (a, b, c);
}

n peu de considération si vous utilisez ceci sur un scénario sensible aux performances, car c'est un processus de création et d'extraction ValueTuple.

3
Star Helvanithri

Avant C # 7.0, vous déclarez des classes comme celle-ci:

Bien que les types d'enregistrement n'aient pas encore été implémentés dans C # 7.0 (comme détaillé par les autres réponses), vous pouvez raccourcir votre code en utilisant lire -only auto-properties , introduit dans C # 6.0:

public class studentInfo
{
    public string StudentFName { get; }
    public string StudentMName { get; }
    public string StudentLName { get; }

    public studentInfo(string strFN, string strMN, string strLN)
    {
        StudentFName = strFN;
        StudentMName = strMN;
        StudentLName = strLN;
    }
}
3
Heinzi