Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Valores y parámetros en cascada con Blazor
José María Aguilar - ¿Aún usas ToString() para obtener el nombre de los elementos de un enum?
José María Aguilar
.NET Core / .NET
- ICYMI C# 8 New Features: Asynchronous Streams
Jason Roberts - Debugging .NET Core memory issues (on Linux) with dotnet dump
Tess Ferrandez - Cloud-Native learning resources for .NET developers
Nish Anil - Creating Resilient Microservices in .NET with Polly
Marinko Spasojevic - Fusing await using and await foreach and await
Jiří Činčura - Rewriting git history using C# (git filter-branch alternative)
Gérald Barré - Two Decades of C#: A Reference: C# 5 and C# 6 & C# 7
Ben Bowen - Getting Started with the Roslyn APIs: Writing Code with Code - Steve Gordon
Steve Gordon - Testing Web Applications with PlayWright and C#
Anuraj Parameswaran - Easy generation of fake/dummy data in C# with Faker.Net
Kristoffer Strube - Easily Perform LINQ Mocking to Unit Test ASP.NET Core Application
Priyanka - Practical differences between C# vs Vb.Net
Michał Białecki - Loop alignment in .NET 6
Kunal Pathak - 4 Features Every Developer Must Know in C# 9.0
Prasanth R - Using Tuples in C# to Initialize Properties in the Constructor and to Deconstruct Your Object
Thomas Claudius Huber
Publicado por José M. Aguilar a las 8:05 a. m.
Etiquetas: enlaces
Como probablemente ya sabréis, NDepend es una de esas herramientas que están ahí de siempre, ayudando a desarrolladores y arquitectos a mejorar la calidad de nuestro software gracias a sus potentes y flexibles herramientas de análisis de proyectos.
Hace tiempo ya echamos por aquí un vistazo, pero creo que es interesante darle otra vuelta y refrescar conocimientos.
Publicado por José M. Aguilar a las 8:05 a. m.
Etiquetas: arquitectura, buenas prácticas, calidad, herramientas
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Cómo detectar navegadores que no soportan Blazor WebAssembly
José María Aguilar - Cómo incluir scripts en la página desde vistas parciales ASP.NET Core MVC con DynamicSections
José María Aguilar
.NET Core / .NET
- Referencias anulables en C# 8.0 y posteriores (II): el operador ! & Referencias anulables en C# 8.0 y posteriores (III): aplicaciones del operador !
Octavio Hernandez - .NET News Roundup - Week of Mar 8th, 2021
Arthur Casals - Unit Testing 101: Write your first unit test in C# with MSTest
Matthew Jones - Exploring the async/await State Machine – Concrete Implementation
Vasil Kosturski - CompactExifLib: Access to EXIF Tags in JPEG Files
Hans-Peter Kalb - Fix me!
Stéphane Gay - Use C# to upload files to a GitHub repository
Dave A. Brock - HelpMate.Core 2.1.0 Released!
Vincent Maverick Durano - Real Time WinUI Dashboard with SignalR Backend
Sam Basu - Visual Basic 16.9 in .NET 5
Jonathan Allen - OpenTelemetry .NET reaches v1.0
Sourabh Shirhatti - C# 9 records as strongly-typed ids - Part 5: final bits and conclusion
Thomas Levesque - C# 10 — 3 Candidate Features That Could Make the Final Cut
Matthew MacDonald - Strings Contain Empty Strings
Steve Fenton - The .NET Stacks #41: Your monthly preview fix has arrived
Dave Brock - C# 2, 3 and 4 (Two Decades of C#: A Reference) • Ben Bowen's Blog
Ben Bowen
Como decíamos hace unos días, los generadores de código C# nos brindan la posibilidad de crear al vuelo código C# e incluirlo en nuestros proyectos en tiempo de compilación.
Por no alargar demasiado el post, vimos un sencillísimo ejemplo de implementación, pero ahora vamos a crear algo más complejo que podría ayudarnos a solucionar un problema que tendría difícil solución de no contar con esta característica del compilador.
1. Definición de objetivos
El reto al que vamos a enfrentarnos ya lo expusimos en el post anterior como un caso de uso simple de los generadores de código, así que vamos a reproducir la descripción del escenario.
Imaginemos que en nuestra aplicación tenemos clases que representan operadores matemáticos como SumOperator
, MultiplyOperator
, DivideOperator
, SubtractOperator
. Imaginad también que nos interesa tener un tipo enum Operators
donde aparezca un miembro por cada operador disponible, algo como:
public enum Operators
{
Sum,
Multiply,
Divide,
Subtract
}
El problema que tiene enfocar esto de forma manual es que resultaría sencillo implementar una nueva clase operador y olvidar crear su correspondiente entrada en la enumeración Operators
. Aquí es donde vienen al rescate los generadores de código :)
Lo que implementaremos hoy es un generador de código C# que creará la enumeración por nosotros en tiempo de compilación, manteniéndola sincronizada en todo momento con las clases que tengamos definidas en el proyecto. Para ello, crearemos un generador llamado OperatorsEnumGenerator
que:
- En la fase de análisis de código recopilará las clases del proyecto a compilar cuyo nombre finalice por
Operator
. - En la fase de generación de código creará el enum con los miembros registrados anteriormente.
¡Vamos allá!
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Componentes genéricos (templated components) en Blazor
José María Aguilar - Redirecciones HTTP 303, 307 y 308: ¿las conoces?
José María Aguilar
.NET Core / .NET
- Announcing .NET 6 Preview 2
Richard Lander - ICYMI C# 8 New Features: Upgrade Interfaces Without Breaking Existing Code
Jason Roberts - First look at InferSharp: A C# version of Facebook’s Infer
Neel Bhatt - Language detection and words-in-sentence classification in C#
Dan - Getting started with Dapr for .NET Developers
Laurent Kempé - How to map IPs to country for free with .NET and IP2Location
Thomas Ardal - Generating Date of Birth values for .NET5.0 Record types using AutoFixture
Adam Storr - AutoWrapper 4.5.0 Released!
Vincent Maverick Durano - Unexpected finding about “await using var”
Jiří Činčura - Download the right ChromeDriver version & keep it up to date on Windows/Linux/macOS using C# .NET
Niels Swimberghe - Blinking LEDs with Raspberry Pi
Richard Lander - My Favorite C# Features Part 2: LINQ
Jeffrey T. Fritz - Five C# Features You Might Not Know
Andrea Chiarelli - ConfigureAwaitChecker with support for “await using” and “await foreach”
Jiří Činčura - 6 free tools for .NET developers
Thomas Ardal - C# 9.0: Covariant Return Types – Specify More Specific Return Types in Overridden Methods and Properties
Thomas Claudius Huber - Investigating a Linux CVE with .NET Images
Richard Lander
Seguramente muchos coincidiremos en que una de las novedades más interesantes de la última versión del compilador de C# es lo que oficialmente han denominado C# Source Generators, o generadores de código fuente de C#.
Muy resumidamente, esta característica añade un nuevo paso en la compilación en el cual los desarrolladores podemos introducir componentes propios (generadores) que inspeccionen el código de la aplicación que está siendo compilada y generen nuevos archivos, que a su vez pueden ser compilados e incluidos en los ensamblados resultantes. Su objetivo, tal y como se declara en su documento de diseño, es posibilitar la metaprogramación en tiempo de compilación.
Veámoslo con un ejemplo donde, además de explicarlo mejor, se puede mostrar su utilidad. Imaginad que en nuestra aplicación tenemos clases que representan operadores matemáticos como SumOperator
, MultiplyOperator
, DivideOperator
, SubtractOperator
, y todos ellos heredan de una clase base Operator
. Imaginad también que nos interesa tener un tipo enumerado enum Operators
donde aparezca un miembro por cada operador disponible, algo como:
public enum Operators
{
Sum,
Multiply,
Divide,
Subtract
}
Muy probablemente os habéis encontrado alguna vez con un escenario similar y habéis sufrido la dificultad de mantener sincronizada la enumeración con las clases que heredan de Operator
: cada vez que aparezca un operador nuevo e implementemos la clase operador que lo representa, tendremos que acordarnos de ir a Operators
y añadir el miembro.
Pues bien, aunque simple, esto sería un caso de uso bastante claro para los generadores de código fuente de C#. Gracias a ellos, podríamos crear un componente generador que examine nuestro código en busca de herederos de Operator
y genere al vuelo, siempre en tiempo de compilación, un archivo de código con la enumeración Operators
.
A todos los efectos, es como si esa enumeración la hubiéramos escrito a mano, porque podremos usarla con normalidad, aparecerá en intellisense, etc., pero la diferencia es que será generada cada vez que compilemos el proyecto, asegurando así que siempre será correcta y completa.
Publicado por José M. Aguilar a las 8:05 a. m.
Etiquetas: .net, c#, generadores, metaprogramación, novedades