Jan 21, 2026

Les structures en C# sont amusantes - Partie 9/9: Conclusion

Leia este post em Português.

Read this post in English.

Dans les articles précédents de cette série, nous avons découvert que, dans certains scénarios, les constructeurs des types valeur (structs) peuvent ne pas être exécutés, malgré une syntaxe qui pourrait laisser penser le contraire.

Être conscient de ce comportement est essentiel, et une attention particulière doit être portée lors de la définition d'API publiques (surtout dans les bibliothèques en raison de leur portée potentielle) afin d'éviter de créer des API contre-intuitives et/ou sujettes aux erreurs, car les développeurs pourraient facilement tomber dans le piège de l'utilisation de membres non initialisés1.

Cela dit, ce comportement n'est pas nouveau ; les problèmes évoqués dans les articles #5, #6 et #7 existent depuis les premières versions du langage. Cependant, l'introduction, en C# 10, de la possibilité de définir des constructeurs sans paramètre dans les structs ajoute une couche de complexité supplémentaire et augmente les chances que les développeurs soient exposés à de tels types2.

Ainsi, si vous consommez des types struct, soyez vigilant afin de ne pas utiliser d'instances non initialisées1. D'un autre côté, faites particulièrement attention lorsque vous définissez de nouveaux types struct, en particulier si vous ajoutez des constructeurs sans paramètres ou un constructeur dont tous les paramètres sont optionnels.

Donc nous arrivons au dernier article de cette série. J'espère que vous avez apprécié ce parcours, que vous y avez appris quelque chose de nouveau et que vous vous sentez désormais mieux préparé(e) à utiliser/définir vos propres structs.

Comme toujours, tout retour est bienvenu.

Amusez-vous bien et à bientôt !


  1. Note de clarification : Du point de vue du runtime, les structs sont garantis d’être initialisés (par une mise à zéro complète de la structure) avant d’être utilisés. Le terme initialisation dans cette série d’articles signifie que tous les champs/propriétés du struct ont reçu des valeurs significatives, laissant ainsi l’instance dans un état cohérent.

  2. Avant C# 10, la seule façon pour un développeur d'être exposé à de tels types était de consommer des assemblages compilés avec un langage prenant en charge cette fonctionnalité, comme IL ; personnellement, je n’ai jamais rencontré un seul exemple de ce genre.

Structs in C# are fun - Part 9/9: Conclusion

Leia este post em Português.

Lire cet post en français.

In the previous posts of this series we've learned that in some scenarios, despite the syntax leading us to believe the contrary, struct constructors may not be executed.

Being aware of this behavior is important and special care should be taken when defining public APIs (specially in libraries due to the potential reach of those) to avoid ending up with APIs that are unintuitive and/or error prone due to developers easily falling into the trap of using uninitialized struct1 members.

That said, this behavior is not new; problems like the ones discussed in post #5, #6 and #7 existed since the first versions of the language; however the introduction, in C# 10, of the ability to define parameterless constructors in structs adds more complexity and makes it more likely that developers will be exposed to such types2.

So, if you are consuming struct types be careful to not end up using uninitialized1 instances. By the other hand, take special care when defining new struct types, specially those with parameterless constructors or a constructor with all of its parameters being optional.

And so we reach the final post in this series. I hope you’ve enjoyed the journey, possibly have learned something new, and now feels better prepared to use and define your own structs.

As always, all feedback is welcome.

Have fun and see you in the next post!


  1. Note of clarification: From the perspective of the runtime, structs are guaranteed to be initialized (by zeroing out the whole struct) before being used. Initialization in the context of this series means that all struct fields/properties have been assigned meaningful values leaving the instance in a consistent/valid state.

  2. Prior to C# 10, the only way a developer would be exposed to such types would be by consuming assemblies built with a language supporting that feature, such as IL; personally I am not aware of a single instance of such types.

Structs em C# - diversão garantida - Parte 9/9: Conclusão

Read this post in English.

Lire cet article en français.

Nos posts anteriores desta série nós aprendemos que, em alguns cenários, construtores de estruturas (structs) podem não ser executados apesar da sintaxe nos levar a acreditar o contrário.

Ter consciência desse comportamento bem como tomar especial cuidado ao definir APIs públicas (principalmente em bibliotecas, já que as mesmas possuem grande potencial de alcance) é essencial para evitar criar APIs contraintuitivas e/ou propensas a erros uma vez que desenvolvedores podem facilmente ser supreendidos ao usar membros de structs não inicializadas1 introduzindo bugs e/ou falhas de segurança em seus programas.

Dito isso, esse comportamento não é novo, e problemas como os discutidos nos posts #5, #6 e #7 existem desde as primeiras versões da linguagem. No entanto, a introdução da capacidade de definir construtores sem parâmetros em structs na versão 10 do C# adiciona uma camada extra de complexidade e torna mais provável que desenvolvedores sejam expostos a tais tipos2.

Portanto, se você usa tipos struct, garanta que todas as instâncias das mesmas sejam corretamente inicializadas1. Por outro, lado preste especial atenção ao definir novos tipos struct, principalmente se os mesmos possuirem construtores sem parâmetros ou um construtor cujos parâmetros sejam todos opcionais.

Com este post chegamos ao último da série; espero que você tenha gostado da mesma e que possa ter aprendido algo novo na jornada e que agora se sinta mais capacitado para utilizar e expor tais estruturas de forma mais eficiente e segura.

Como sempre, qualquer feedback é bem-vindo.

Divirta-se! Nos vemos no próximo post.


  1. Nota de esclarecimento: Do ponto de vista da runtime, structs são sempre inicializadas (zerando toda a estrutura) antes de serem usadas. No contexto desta série de posts o termo inicialização significa que todos os campos/propriedades da struct receberam valores significativos, deixando a instância em um estado consistente/válido.

  2. Antes do C# 10, a única forma de um desenvolvedor ser exposto a esses tipos era consumindo assemblies compilados com uma linguagem que suportasse esse recurso, como IL; pessoalmente, nunca encontrei um exemplo desse tipo.