Je m'interroge sur le C # -Code suivant: 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. p> On peut faire fonctionner en refactorisant les éléments suivants: p> 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? p> p>
3 Réponses :
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; } }
Notez que ce n'est plus le cas en C # 6
Comme vous l'avez vu, lorsque vous vous référez à 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. P> 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: p> Propertycéta code> dans votre constructeur, vous accédez au
Cet objet CODE>, que le compilateur ne permettra pas car vos champs 't été encore initialisé.
en C # 6, ce va simplement disparaître em>; Le code dans la question compile bien. tandis que Stefan a la réponse que de répondre à la question, je avez em> pour vous conseiller de ne pas utiliser une structure mutable - elle sera fort> vous mordre. Les structures mutables sont diaboliques. P> imo, le correctif "correct" ici est simplement: p>
J'utiliserais juste propertatua {obtenir; ensemble privé; } code>. 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 code>, 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 () code>
@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 () code> plus
@Eric - il compile bien? struct foo {foo (int x): ceci () {x = x; } public int x {obtenir; ensemble privé; } code>
@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 Code> car la plupart i> 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 code> ou
public code> ou le corps du constructeur. Je n'ai jamais suggéré que vous puissiez quitter le
ceci () code> appelez, donc je ne sais pas pourquoi vous le dissipez.
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