10
votes

Propriétés automatiques et structures

Je m'interroge sur le C # -Code suivant: xxx

Il ne compile pas avec une erreur "L'objet" Cet objet "ne peut pas être utilisé avant que tous ses champs ne soient attribués à". Pour la classe analogue, il s'agit de la compilation sans aucun problème.

On peut faire fonctionner en refactorisant les éléments suivants: xxx

mais, je pense que tout le point d'introduction de propriétés automatiques au C # était pour éviter d'écrire du code ultérieur. Cela signifie-t-il que les propriétés automatiques ne sont pas pertinentes pour les structures?


5 commentaires

Quelle version de .NET utilisez-vous?


Chaque fois que vous écrivez une structure mutable, quelqu'un pleure


@ TheguyofDoom - cela n'aura pas d'importance ... le comportement sera le même sur tout; Il s'agit d'une fonctionnalité C # 3.0 compilateur et de la "solution" est selon Stefan


Dupliqué possible de Les propriétés et les structures automatiques ne se mélangent pas?


Notez que cela cesse d'être un problème au C # 6


3 Réponses :


15
votes

Vous devez d'abord appeler le constructeur par défaut, comme vous le souhaitez:

struct Structure
{
    public Structure(int a, int b) : this()
    {
        PropertyA = a;
        PropertyB = b;
    }
    public int PropertyA { get; set; }
    public int PropertyB { get; set; }
}


1 commentaires

Notez que ce n'est plus le cas en C # 6



8
votes

Comme vous l'avez vu, lorsque vous vous référez à Propertycéta dans votre constructeur, vous accédez au Cet objet , que le compilateur ne permettra pas car vos champs 't été encore initialisé.

Pour contourner cela, vous devez trouver un moyen d'initialiser les champs. Une solution est votre exemple: si vous n'utilisez pas de propriétés automatiques, les champs sont explicites et vous pouvez les initialiser.

Un autre moyen est d'appeler votre constructeur un autre constructeur qui initialise les champs. Les structures ont toujours implicitement implicitement un constructeur sans paramètre qui initialise ses champs à zéro, d'utiliser cela: xxx


0 commentaires

21
votes

en C # 6, ce va simplement disparaître ; Le code dans la question compile bien.


tandis que Stefan a la réponse que de répondre à la question, je avez pour vous conseiller de ne pas utiliser une structure mutable - elle sera vous mordre. Les structures mutables sont diaboliques.

imo, le correctif "correct" ici est simplement: xxx


8 commentaires

J'utiliserais juste propertatua {obtenir; ensemble privé; } . Readonly vous gagne très peu - il est presque toujours trivial d'éviter de définir vos propriétés plus d'une fois. Et si vous n'utilisez pas Readonly , vous utilisez toujours des propriétés implémentées automatiquement. Le problème est donc toujours pertinent.


@Joren - il exprime notre intention;) et évite la gêne d'avoir à appeler : ceci ()


@Joren pour ceux qui pourraient trébucher à travers cela à l'avenir: votre suggestion ne compile pas si vous essayez de définir la propriété de l'intérieur du constructeur.


@Eric il fait en C # 6, en fait; Vous n'avez pas besoin du : ceci () plus


@Eric - il compile bien? struct foo {foo (int x): ceci () {x = x; } public int x {obtenir; ensemble privé; }


@MarcGravell: Heureusement, C # 6 vous permet également d'utiliser des accessoires autochtones, supprimant enfin la douleur de devoir déclarer et utiliser un champ de support explicite. J'ai toujours évité Readonly car la plupart de ce qu'il a fait était simplement de rendre mes objets moins propres.


@Joren Il compile parce que vous avez appelé le constructeur de base qui définit le champ de support de propriété automatique sur 0. Sans cela () il ne compilera pas.


@ERIC: Je ne vois pas ton point. Il y a beaucoup de choses que vous pourriez laisser sortir, ce qui permettrait de ne pas compiler, comme struct ou public ou le corps du constructeur. Je n'ai jamais suggéré que vous puissiez quitter le ceci () appelez, donc je ne sais pas pourquoi vous le dissipez.