Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- El Tao de la Programación
José María Aguilar - Generación de rutas con parámetros de query string en Blazor 6
José María Aguilar
.NET Core / .NET
- .NET 8 Top 10 New Features
Patrick Smacchia - What′s new in C# 12: overview
Konstantin Volohovsky - Customizing the behavior of record copy constructors
Gérald Barré - Ignore Null Values With AutoMapper
Code Maze - Open-Sourcing Metalama Compiler, a Roslyn Branch with Source Transformers
Gael Fraiteur - How To Handle Exceptions in CSharp – Tips and Tricks for Streamlined Debugging
Nick Cosentino - C# Tip: How to create Unit Tests for Model Validation
Davide Bellone - A Generic Timeout Helper
Ricardo Peres - Interfaces can have private methods
Steven Giesel - Source Code Generators, DIY
Bnaya Eshet - C# Record Explained
Patrick Smacchia
Publicado por José M. Aguilar a las 8:05 a. m.
Etiquetas: enlaces
Pues hoy vamos con un truquillo rápido ;)
Como sabemos, cuando usamos Razor Pages para construir aplicaciones sobre ASP.NET Core, la convención por defecto obliga a que nuestras páginas se encuentren en la carpeta /Pages del proyecto.
¿Pero qué ocurre si somos algo tiquismiquis y no nos gusta esa ubicación o no podemos usarla por cualquier motivo? En este post vamos a ver cómo cambiar esta convención para que nuestras páginas Razor se encuentren en otra carpeta.
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- ¿Por qué no compila este código C#?
José María Aguilar - ASP.NET MVC: obtener id y nombre de un control de formulario
José María Aguilar
.NET Core / .NET
- Customizing the name of embedded resources in .NET
Gérald Barré - Updates to Docker images in .NET 8: Exploring the .NET 8 preview
Andrew Lock - Source Generator playground
Bart Wullems - C# Overtaking Java in Popularity Index
David Ramel - Using Keyed Services to Resolve Dependencies in .NET
Code Maze - Pre-commit hooks with Husky.NET - build, format, and test your .NET application before a Git commit
Davide Bellone - .NET 6 - Parallel.ForEachAsync
Bart Wullems - Microsoft .NET Code Analysis: Remove Unnecessary Lambda Expressions
David McCarter - 3 Reasons to Delay Adopting .NET 8 and 10 to do it ASAP
Uno Platform Team
Sabemos que está feo y no sea especialmente recomendable en muchos casos, pero hay veces en las que es totalmente necesario acceder a miembros privados de una clase. Por ejemplo, sería un requisito imprescindible si fuéramos a implementar un serializador o deserializador personalizado, o necesitásemos clonar objetos, o simplemente realizar pruebas unitarias a una clase que no ha sido diseñada para ello.
Para conseguirlo, siempre hemos utilizado los mecanismos de introspección de .NET, conocidos por todos como reflexión o por su término en inglés reflection. Por ejemplo, imaginemos una clase como la siguiente, virtualmente inexpugnable:
public class BlackBox
{
private string _message = "This is a private message";
private void ShowMessage(string msg) => Console.WriteLine(msg);
public override string ToString() => _message;
}
Aunque a priori no podemos hacer nada con ella desde fuera, usando reflexión podríamos acceder sin problema a sus miembros privados, ya sean propiedades, campos, métodos o cualquier tipo de elemento, como podemos ver en el siguiente ejemplo:
var instance = new BlackBox();
// Obtenemos el valor del campo privado _message:
var field = typeof(BlackBox)
.GetField("_message", BindingFlags.NonPublic | BindingFlags.Instance);
var value = field!.GetValue(instance);
// Ahora llamamos al método privado ShowMessage():
var method = typeof(BlackBox)
.GetMethod("ShowMessage", BindingFlags.NonPublic | BindingFlags.Instance);
method.Invoke(instance, [value]);
// Al ejecutar, se nuestra en consola: "This is a private message"
Sin embargo, de todos es sabido que la reflexión es un mecanismo muy lento, a veces farragoso en su implementación y, sobre todo, incompatible con tree-shaking, que es como se suele llamar la técnica que usan los compiladores de eliminar del código final todas las clases, métodos y propiedades que no se utilizan en el código final. Esta técnica va tomando cada vez más relevancia conforme los compiladores son capaces de crear directamente ejecutables nativos puros, porque permiten reducir de forma considerable el peso de los artefactos creados.
Por esta razón, en .NET 8 se ha incluido una nueva fórmula para acceder a miembros privados, mucho más eficiente y amistosa con AOT, porque se lleva a tiempo de compilación algo que antes obligatoriamente se resolvía en tiempo de ejecución.
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- El veloz murciélago hindú…
José María Aguilar - Implicit usings en C#10
José María Aguilar
.NET Core / .NET
- Announcing .NET 8 RC2
Jon Douglas - OpenSilver 2.0 released
Userware - Full precision floating-point summation in C#
Anthony Lloyd - Get the default value of a type at runtime
Gérald Barré - Replace Line Breaks in a String in C#
Code Maze - Getting Started With NServiceBus in .NET
Milan Jovanović - Padding for Overlaid Structs
Stephen Cleary - How To Use Embedded Resources in .NET
Khalid Abuhakmeh - Revisiting Various Change Feeds Consumption in .NET
Tomasz Pęczek - xUnit And Moq – How To Master Unit Testing In C#
Nick Cosentino - Lessons learned from building a static code analyzer for C#
Daniel Genezini - Primary constructors changes initialisation behaviour in C# 12
David Grace - Structured Concurrency in C#
Steven Giesel - .NET 8 New and Efficient Way to Check IP is in Given IP Range
Sibeesh Venu - ConcurrentQueue in C#
Michal Kaminski - Simplify Source Generator creation the RoslynGenerator template
Bart Wullems
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Lo que ocurre cuando desarrolladores diseñan interfaces de usuario (II)
José María Aguilar - Directivas using globales en C# 10
José María Aguilar
.NET Core / .NET
- Logs en .Net
Fernando Escolar - How to test the logs from ILogger in .NET
Gérald Barré - Testing Time-Dependent Code With TimeProvider in .NET
Code Maze - Performance Improvements in .NET 8
Rico Mariani - Rolling Forward to Major Versions in .NET
Rick Strahl - How To Display .NET Collections with the Oxford Comma
Khalid Abuhakmeh - Selecting Xml Nodes With XPath in C#
Code Maze - Effortlessly Resolving Circular Dependencies in .NET with SmartInject
Daan Acohen - Arm64 Performance Improvements in .NET 8
Kunal Pathak - Don't Use "Task.WhenAll" for Interdependent Tasks
Jeremy Clark - Tales from the .NET Migration Trenches - Our First Views
Jimmy Bogard - The convenience of System.Text.Json
Richard Lander - Looking at Producer/Consumer Dependencies: Bounded vs. Unbounded Channels & Producer/Consumer Exception Handling
- Jeremy Clark