Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- PeriodicTimer: Temporizadores asíncronos en .NET 6
José María Aguilar - 101 nuevas citas célebres del mundo de la informática (¡y van 404!)
José María Aguilar
.NET Core / .NET
- GitHub - praeclarum/1brc: The One Billion Row Challenge
Frank A. Krueger - Making primary constructor parameters read-only
Gérald Barré - Consistent Byte Representation of Strings in C# Without Encoding
Code Maze - Throw ThrowIfCancellationRequested in a Method that Returns a Value when Using a Cancellation Token
Bryan Hogan - Coravel - Easy task scheduling for your .NET web apps
Jon Hilton - A brief look at StringValues
Andrew Lock - Const strings are not so const after all
Steven Giesel - Some Stream.Read Guidelines
Mark Heath - Using implicit conversion operators in C# to improve readability
Henrique Dalcin Dalmas - When to Use Thread.Sleep, When to Use Task.Delay?
Code Maze - How to Distribute Roslyn Analyzers via NuGet
Aaron Stannard
Publicado por José M. Aguilar a las 8:05 a. m.
Etiquetas: enlaces
Primero, espero que hayáis disfrutado las fiestas y que el 2024 que acabamos de estrenar venga bien cargado de cosas buenas 🙂
Y para inaugurar el año, como cada primer post de enero, aprovecharemos para revisar las diez publicaciones más leídas durante los últimos 365 días.
Ante todo, aprovecho para desearos felices fiestas y, como no nos veremos por aquí hasta enero, un grandioso 2024.
Y, por supuesto, ahí van los enlaces recopilados durante la semana pasada que, como siempre, espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Cómo recibir un JSON como string en una acción ASP.NET Core MVC
José María Aguilar - ¿Por qué separamos los directorios con la barra invertida?
José María Aguilar
.NET Core / .NET
- FluentResults: Simplificando el Manejo de Resultados y Errores en Aplicaciones .NET
Isaac Ojeda - Customize the HttpClient logging
Josef Ottosson - Using the CLI to Build and Run .NET Applications
Dusko Mirkovic - Validating appsettings becomes much faster with .NET 8
David Grace - Custom Naming Policy for JSON in C#
Tomas Bak - Top 6 Performance Tips when dealing with strings in C# 12 and .NET 8
Davide Bellone - Updates to the StronglyTypedId library - simplification, templating, and CodeFixes: Using strongly-typed entity IDs to avoid primitive obsession
Andrew Lock - MemoizR - Declarative Structured Concurrency for C#
Khalid Abuhakmeh - Introduction to Autofac FakeItEasy Package
Ainea Wabwoba - What User Interface Framework Should You Choose for .NET Desktop Applications?
Claudio Bernasconi - Discriminated Unions in C#
Ian Russell - Debugging and Profiling Multithreaded .NET Applications
Code Maze - 5 Serilog Best Practices For Better Structured Logging
Milan Jovanović - What Is String Interpolation In C# – What You Need To Know
Nick Cosentino - What's New in Our Code Coverage Tooling?
Jakub Chocholowicz - The first possible new feature of C# 13: Params collection
Steven Giesel - Execute JavaScript Using Selenium WebDriver in C#
Vadzim Zylevich - Integrating OpenAI Image Generation into a .NET Application
Rick Strahl - A Practical Tour of MoreLINQ
Atif Aziz
Poco a poco vamos haciéndonos con las novedades de C# 12, y en esta ocasión nos centraremos en una nueva sintaxis que proporciona una forma concisa y rápida para declarar los elementos de una colección.
Ya os adelanto que si sois de los que siempre han envidiado otros lenguajes por la facilidad con la que se declaran los elementos de un colección o array, estáis de enhorabuena ;) Porque, sin duda, hay formas de hacerlo menos verbosas que las que hemos tenido hasta ahora en C#:
// JavaScript:
let numbers = [1, 2, 3];
// Python:
numbers = [1, 2, 3]
// PHP:
$array = [1, 2, 3];
// Rust:
let array = [1, 2, 3];
En C# 11 y anteriores, la creación de un array es normalmente más farragosa, porque de alguna forma u otra requiere que especifiquemos que se trata de un nuevo array y, si la inferencia no lo permite, el tipo de los elementos que contendrá:
// Forma verbosa y redundante:
int[] arr1 = new int[3] { 1, 2, 3 };
// Forma clásica, usando 'var' y especificando número y tipo elementos:
var arr2 = new int[3] { 1, 2, 3 };
// Dejamos que el compilador detecte el número de elementos:
var arr3 = new int[] { 1, 2, 3 };
// Dejamos que la inferencia de tipos determine el tipo de los elementos:
var arr4 = new [] { 1, 2, 3 };
// O bien, la más concisa, usando la sintaxis con llaves (sólo válida para arrays):
int[] arr5 = { 1, 2, 3 };
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Archivos JavaScript independientes por componente en Blazor
José María Aguilar - Las 20 mejores tiras cómicas sobre desarrollo de software
José María Aguilar
.NET Core / .NET
- Hardware Intrinsics in .NET 8
Tanner Gooding - Tuple Aliases in C#
Aditi Saxena - Where C# Primary Constructors Make Sense
Steve Smith - A Generic Implementation of Dijkstra’s Smoothsort in C#
Jorge Luis Orejel - 5 Things You Need to Know About Aspire and .NET 8
Growth Acceleration Partners - Redacting sensitive data in logs with Microsoft.Extensions.Compliance.Redaction
Andrew Lock - Hosted service has a major update to its lifecycle events
David Grace - 4 ways to create Unit Tests without Interfaces in C#
Davide Bellone - Build Performance Evaluation Workflow with WorkflowEngine in .NET
Aram Tchekrekjian - How to Decode JWT Tokens in .NET
Muhammad Afzal Qureshi - Generic Type Construction With Static Virtual Interface Members
Brant Burnett - Select a Dropdown Option Using Selenium WebDriver in C#
Semir Teskeredzic - C#– Record types copy constructor
Bart Wullems - All Purpose Object Updater
James Curran
Los records son una interesante fórmula para definir tipos en C# de forma rápida gracias a su concisa sintaxis, además de ofrecer otras ventajas, entre las que destacan la inmutabilidad o la implementación automática de métodos como Equals()
, GetHashCode()
o ToString()
.
Por si no tenéis esto muy fresco, aquí va un ejemplo de record y la clase tradicional equivalente en C#:
// Record:
public record Person(string FirstName, string LastName);
// Clase equivalente (generada automáticamente):
public class Person
{
public string FirstName { get; init; }
public string LastName { get; init; }
public Person(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}
public override bool Equals(object obj)
{
return obj is Person person &&
FirstName == person.FirstName &&
LastName == person.LastName;
}
public override int GetHashCode()
{
return HashCode.Combine(FirstName, LastName);
}
public Person With(string FirstName = null, string LastName = null)
{
return new Person(FirstName ?? this.FirstName, LastName ?? this.LastName);
}
public void Deconstruct(out string firstName, out string lastName)
{
firstName = this.FirstName;
lastName = this.LastName;
}
}
Como podéis comprobar, hay pocas características de C# que ofrezcan una relación código/funcionalidad tan bárbara como los records. Por ello, poco a poco van ganando popularidad y comenzamos a verlos ya de forma habitual en código propio y ajeno.
Sin embargo, su concisa sintaxis hacen que a veces no sea fácil intuir cómo resolver algunos escenarios que, usando las clases tradicionales, serían triviales.
Por ejemplo, hoy vamos a centrarnos en un escenario muy concreto pero frecuente, cuya solución seguro que veis que puede ser aplicada en otros casos: ya que en los records no definimos propiedades de forma explícita, ¿cómo podríamos aplicarles atributos?