Pero aunque indudablemente los tipos booleanos o flags son una fórmula muy compacta para almacenar información, el mundo suele ser mucho más complejo y estas simplificaciones son a menudo origen de problemas y trampas para nuestro yo del futuro.
En este post vamos a ver algunos escenarios en los que este tipo de dato puede llegar a complicarnos la vida.
Publicado por José M. Aguilar a las 8:05 a. m.
Etiquetas: buenas prácticas, conceptos, nivel básico
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Implementación por defecto en interfaces de C#8, un primer vistazo
José María Aguilar - Enumeraciones de campos de bits en .NET
José María Aguilar
.NET Core / .NET
- Mapperly: A .NET source generator for generating object mappings Riok
- Reentrant (Recursive) Async Lock is Impossible in C#
Max Fedotov - Differences Between != And Is Not Operators in C#
Code Maze - Global usings in C# 10
Gunnar Peipman - Build your own simple browser with WebView2
Mark Heath - Modelling workflows with Finite State Machines in .NET
Lloyd Atkinson - Profiling a .NET6 app running in a linux container with dotnet-trace, dotnet-dump, dotnet-counters, dotnet-gcdump and Visual Studio
Carlos Pons - Enabling High-Quality Code in .NET
Milan Milanović - PriorityQueue In .NET 6
Vicente Gerardo Guzman Lucio - Difference Between Task.Run and Task.Factory.StartNew
Code Maze - 13 C# NuGet packages every .NET Developer needs to know!
Claudio Bernasconi - LED Ticker Tape with .NET
Jim Bennett - Cancellation, Part 2: Requesting Cancellation
Stephen Cleary - Understanding the .NET Language Integrated Query (LINQ)
Ioannis Kyriakidis - Classes, Structures, and Records, Oh My!
David McCarter
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Tipos referencia anulables en C# 8
José María Aguilar - Concatenando un string multilínea en C#
José María Aguilar
.NET Core / .NET
- Introducing C# 10: Structs parameterless constructor and instance field initializer
Anthony Giretti - Improve C# code performance with Span<T>
Patrick Smacchia - The pain points of C# source generators: February 2022 Update
James Turner - Early peek at C# 11 features
Kathleen Dollard - Requiring two-factor authentication on NuGet.org
Claire Novotny - Please stop lying about .NET Standard 2.0 support!
Andrew Lock - Devs Sound Off on C# 11 Preview Features Like Parameter Null Checking
David Ramel - Using RestSharp To Consume APIs in C#
Marinko Spasojevic - Cancellation, Part 1: Overview
Stephen Cleary - Recommended container limits for dotnet-monitor
Mark Downie - Convert Country Name To Flag Emoji in C# & the .NET ecosystem
The First Prototype - Getting Started With .NET 7.0
Satya Karki - How to Upload a File to Azure Blob Storage
Claudio Bernasconi - Alias: An approach to .NET Assembly Conflict Resolution
Bruno Garcia & Simon Cropp
Aún no hemos terminado de asimilar las novedades de C# 10, cuando ya empiezan a llegar noticias de lo que encontraremos en la próxima versión, C# 11, que si todo va bien se lanzará en noviembre de este año.
Una de las que más me ha llamado la atención de momento es la llegada de raw string literals, una característica que mejorará bastante la posibilidad de escribir constantes de cadena multilínea en nuestro código.
Veamos en qué consiste.
Disclaimer: la nueva versión de C# está aún en desarrollo, y detalles de los que veamos aquí podrían cambiar antes de lanzarse definitivamente.
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Null coalescing assigment "??=", el nuevo operador de asignación en C# 8
José María Aguilar - Constantes string multilínea en C#
José María Aguilar
.NET Core / .NET
- Lenguaje C#: coincidencia de modelos - Parte 2: Uso de expresiones en el switch
Rubén Rubio - Announcing .NET 7 Preview 1
Jeremy Likness - .NET and C# Versions - 20th Anniversary
Niels Rasmussen - My 20 Years with .NET
Mark Rendle - Announcing ImageSharp 2.0.0
Six Labors - C# Nullable Features thru the times
Christian Nagel - AutoMapper, Nullable DateTime, and Selecting the Right Constructor
Travis Illig - Operator Overloading in C#
Marinko Spasojevic - Logging Trace Output Using ILogger in .NET Applications
Khalid Abuhakmeh - Introducing Compatible Packages on NuGet.org
Jon Douglas - Server-side JavaScript for .NET developers – Part I (Node.js fundamentals)
Daniel Jiménez García - C# 11.0 preview: parameter null checking
Ian Griffiths - 7 Improvements You Might Have Missed in .NET 6
Matthew MacDonald - C#11 Parameter Null Checking
Wade Gausden - Use a .NET Worker Service to run background services
David Grace
Seguimos descubriendo novedades aparecidas con .NET 6, y ahora le toca el turno a la nueva clase PeriodicTimer
, una fórmula para la ejecución de tareas periódicas en contextos asíncronos que evita el uso de los clásicos callbacks a los que nos tenía acostumbrados el framework.
Como recordaréis, .NET dispone de un buen número de formas de implementar temporizadores, o timers, para ejecutar tareas en intervalos periódicos. El más conocido probablemente sea el clásico System.Threading.Timer
, en el que especificábamos el callback o método que debía ejecutarse en cada intervalo de tiempo mediante un delegado (en el siguiente ejemplo, mediante una lambda):
var timer = new System.Threading.Timer(o =>
{
Console.WriteLine("Hey! " + DateTime.Now.ToLongTimeString());
}, null, 0, 1000);
Console.ReadKey();
Hey! 12:25:51
Hey! 12:25:52
Hey! 12:25:53
Hey! 12:25:54
Hey! 12:25:55
_
Pero también existía System.Timers.Timer
, que nos permitía lograr algo parecido, aunque esta el callback lo implementábamos mediante una suscripción al evento Elapsed
del objeto:
var timer = new System.Timers.Timer(1000);
timer.Elapsed += (sender, eventArgs) =>
{
Console.WriteLine("Hey! " + DateTime.Now.ToLongTimeString());
};
timer.Start();
Console.ReadKey();
Existían algunas fórmulas más específicas para plataformas concretas, como las clases System.Windows.Forms.Timer
, System.Web.UI.Timer
u otras. Sin embargo, todas coincidían en varias cosas:
- Utilizaban callbacks de alguna u otra forma, lo que implica un cierto riesgo de leaks de memoria y problemas con los tiempos de vida de objetos cuando la cosa se complica.
- Los callbacks no permitían código asíncrono, lo que podía llevarnos a luchar contra los engorrosos escenarios de ejecución de código asíncrono en entornos síncronos (async-over-sync).
- Podían darse casos de superposición u overlapping entre las distintas ejecuciones, cuando éstas tardaban en completarse más que el intervalo de definido en el timer.