Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Verificar si una cadena de texto es un JSON válido
José María Aguilar - Uso de miembros estáticos en C# 6, ¿una buena idea?
José María Aguilar
.NET Core / .NET
- How to Check if a Number Is Positive or Negative in C#
Code Maze - Developing Optimized GitHub Actions with .NET and Native AOT
David Pine - Getting all exceptions thrown from Parallel.ForEachAsync
Gérald Barré - C# System.Text.Json
Karen Payne - How to Get the Number of Lines in a Text File in C#
Karthikeyan N. S. - A Detailed Guide to String Concatenation in .NET
Aleksei - The case for an application-level tracing API in .NET
Nicholas Blumhardt - WinForms in a 64-Bit world - our strategy going forward
Klaus Loeffelmann - AddConsole is obsolete: This method is retained only for compatibility
Bart Wullems - C# for Beginners – 5 Simplified Concepts in C#
Nick Cosentino - .NET JsonElement Error Handling
Ian Griffiths
Publicado por José M. Aguilar a las 8:05 a. m.
Etiquetas: enlaces
Hace poco, andaba enfrascado en el proceso de modernización de una aplicación antigua que, entre otras cosas, guardaba datos en formato JSON en un repositorio de archivos. Dado que se trataba de una aplicación creada con .NET "clásico", la serialización y deserialización de estos datos se realizaba utilizando la popular biblioteca Newtonsoft.Json.
Al pasar a versiones modernas de .NET, esta biblioteca ya no es la mejor opción, pues ya el propio framework nos facilita las herramientas necesarias para realizar estas tareas de forma más eficiente mediante los componentes del espacio de nombres System.Text.Json
. Y aquí es donde empiezan a explotar las cosas 😉.
Si habéis trabajado con este tipo de asuntos, probablemente habréis notado que, por defecto, los componentes de deserialización creados por James Newton-King son bastante permisivos y dejan pasar cosas que System.Text.Json
no permite. Por ejemplo, si tenemos una clase .NET con una propiedad de tipo string
y queremos deserializar un valor JSON numérico sobre ella, Newtonsoft.Json
lo hará sin problemas, pero System.Text.Json
nos lanzará una excepción. Esa laxitud de Newtonsoft.Json
es algo que en ocasiones nos puede venir bien, pero en otras puede puede hacer pasar por alto errores en nuestros datos que luego, al ser procesados por componentes de deserialización distintos, podrían ocasionar problemas.
Por ejemplo, observad el siguiente código:
var json = """
{
"Count": "1234"
}
""";
// Deserializamos usando Newtonsoft.Json:
var nsj = Newtonsoft.Json.JsonConvert.DeserializeObject<Data>(json);
Console.WriteLine("Newtonsoft: " + nsj.Count);
// Intentamos deserializar usando System.Text.Json
// y se lanzará una excepción:
var stj = System.Text.Json.JsonSerializer.Deserialize<Data>(json);
Console.WriteLine("System.Text.Json: " + stj.Count);
Console.Read();
// La clase de datos utilizada
record Data(int Count);
Para casos como este, nos vendrá bien conocer qué son los custom converters y cómo podemos utilizarlos.
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Cómo saber dónde se está gestionando una petición en ASP.NET Core
José María Aguilar - Inicialización de propiedades en C# 6.0
José María Aguilar
.NET Core / .NET
- .NET 9 Preview 1
Rich Lander - Announcing NuGet 6.9
Allie Barry - Our Vision for .NET 9
.NET Team - Hello, Redis - Getting Started with Redis and dotnet 8
Steve Smith - Garbage Collector (over)simplified & The garbage collector in .NET - Part 2: Compacting
Steven Giesel - Convert Between Hexadecimal and Decimal in C#
Martin Chege - Creating an HttpClient that uses DNS over Https
Gérald Barré - What Is the Difference Between Properties and Fields in C#
Code Maze - LINQ MindMap: .NET 9 Edition
Steven Giesel - Creating custom PowerToys Run plugins
Henrik Lau Eriksson - How to Overwrite DateTime.Now During Testing in .NET
Ivan Gechev - Is Random.GetItems the best way to get random items in C# 12?
Davide Bellone - New Features in C# 12
Bozo Spoljaric - How to Log a Class and Method Names Using Serilog
Muhammad Afzal Qureshi - Enumerating over Select’s index
Jiří Činčura - Weak Events in C# – How to Avoid Nasty Memory Leaks
Nick Cosentino - Polly Core Rate Limiter
Bryan Hogan - An Introduction to the World of Containers with .NET 8
James Montemagno
Como seguramente sabréis, Blazor es la gran apuesta de Microsoft para el desarrollo de aplicaciones web con .NET. Sólo hay que ver la cantidad de novedades que han introducido en la última versión para darse cuenta de que están poniendo toda la carne en el asador y, de alguna forma, está convirtiéndose en la opción preferida para el desarrollo de este tipo de aplicaciones.
Pues bien, es un placer anunciaros que, tras varios meses de preparación, hace unos días hemos puesto en marcha el nuevo curso de desarrollo de aplicaciones Web con Blazor en .NET 8, como siempre, en CampusMVP.
Ha sido un trabajo duro, porque esta última versión ha venida cargada de novedades (sobre todo en lo relativo al nuevo modelo unificado propuesto por las Blazor Web Apps) y hemos tenido que revisar en profundidad y reescribir parte del contenido del curso, rehacer ejemplos y regrabar material audiovisual, todo con el objetivo de seguir siendo el mejor y más completo curso de Blazor del mercado.
En este post voy a intentar responder a las siguientes preguntas:
- ¿Qué es Blazor?
- ¿Por qué es interesante aprender a desarrollar con Blazor?
- Si ya hemos trabajado con ASP.NET Core y MVC, ¿siguen valiendo estos conocimientos?
- ¿En qué consiste el curso de desarrollo con Blazor?
- ¿Cuáles son los contenidos del curso?
- ¿Qué conocimientos previos se necesitan para seguir el curso?
- Me convence, ¿cuándo empezamos?
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Evitar que código de pruebas llegue a producción usando directivas de compilación de C#
José María Aguilar - Ejecutar tareas en segundo plano en ASP.NET 4.5.2
José María Aguilar
.NET Core / .NET
- Volcados de memoria en Kubernetes para depurar aplicaciones .NET
CampusMVP - Enable the new TerminalLogger in .NET 8 SDK automatically
Gérald Barré - How to Correctly Implement IDisposable Interface in C#
Code Maze - General Performance Tip: Optimizing Attributes
David McCarter - Exploring .NET frozen segments
Kevin Gosse - Using default interface methods for performance gains in IHeaderDictionary
Andrew Lock - How to Pass Complex Parameters to Theory in xUnit
Code Maze - How to Get appsettings.json Content as a Dictionary in .NET Core
Code Maze - .NET 8–It’s time to get rid of these flaky tests!
Bart Wullems - Resilience and chaos engineering
Martin Tomka
Hace unos días, veíamos por aquí los constructores primarios de C#, una característica recientemente introducida en el lenguaje que permite omitir el constructor si en éste lo único que hacemos es asignar los valores de sus parámetros a campos de la clase.
Veamos un ejemplo a modo de recordatorio rápido:
// Clase con constructor tradicional
public class Person
{
private readonly string _name;
public Person(string name)
{
_name = name;
}
public override string ToString() => _name;
}
// La misma clase usando el constructor primario:
public class Person(string name)
{
public override string ToString() => name;
}
Como comentamos en el post, los parámetros del constructor primarios eran internamente convertidos en campos privados de la clase, generados automáticamente e inaccesibles desde el código.