Novedades en ReSharper 2021.3

ReSharper 2021.3 es compatible con la nueva versión Visual Studio 2022. El análisis del código mejora la compatibilidad con C# 10, incluyendo espacios de nombres con ámbito de archivo y directivas Using globales, tipos de referencias que aceptan valores null y compatibilidad general con C#. Esta versión también añade Find Usages para operadores de conversión implícita definidos por el usuario, nuevas marcas de medianil y una versión mejorada de la funcionalidad Copy Code Reference.

Descargar

Prueba gratuita de 30 días disponible

Compatibilidad con Visual Studio 2022

Ahora ReSharper es compatible con la nueva compilación de Visual Studio 2022. Tendrá acceso al mismo conjunto de funcionalidades avanzadas que ya conoce de otras versiones de Visual Studio. Pero, como Visual Studio 2022 es una aplicación de 64 bits, ya no existe el límite de la cantidad máxima de memoria que se puede asignar. Como resultado, las funcionalidades de ReSharper se ejecutan más rápido.

Para usar ReSharper con esta nueva versión de Visual Studio, asegúrese de que esté seleccionado el icono de VS2022 en el instalador de dotUltimate 2021.3.

C# 10

C# 10 se publicó recientemente y ReSharper sigue añadiendo funcionalidades de C# 10. Hoy nos complace añadir la compatibilidad con los espacios de nombres con ámbito de archivo, instrucciones Using globales, el atributo CallerArgumentExpression, el concepto de «controladores de cadenas interpoladas» y las expresiones lambda de C# 10.

Empecemos con los espacios de nombres con ámbito de archivo. Además de admitir la nueva sintaxis en sí, hemos añadido una nueva opción «Syntax style», que le permite seleccionar el estilo deseado (ReSharper | Options | Code Editing | C# | Syntax Style | Code body | Namespaces). Al elegir un estilo, ahora ReSharper mostrará las inspecciones del código que tienen que cambiarse para seguir el estilo y le sugerirá los arreglos rápidos adecuados. Puede propagar con un solo clic las correcciones a todo el proyecto, o incluso a toda la solución.

Hay dos acciones contextuales que le permiten restablecer el código al estilo de sintaxis anterior: Convert to file-scoped namespace y Convert to block-scoped namespace.

Más información: Espacios de nombres con ámbito de archivo

Ahora echemos un vistazo rápido a las instrucciones Using globales. La funcionalidad de análisis del código de ReSharper detecta las instrucciones Using marcadas con la palabra clave global y las usa para resolver correctamente símbolos en todos los archivos de código del proyecto. ReSharper también le avisará si se ha colocado una instrucción Using global en una ubicación incorrecta de un archivo.

ReSharper resaltará las instrucciones Using globales que no se usen en el proyecto y ofrecerá un arreglo rápido para eliminar la declaración.

ReSharper ofrece compatibilidad avanzada con el atributo CallerArgumentExpression, incluyendo la finalización de código de inspecciones de código para ayudarle a usarlo correctamente.

Más información: CallerArgumentExpression

C# 10 introdujo el nuevo concepto de «controladores de cadenas interpoladas». Para los usuarios finales, esto quiere decir que las expresiones de interpolación de cadena se ejecutarán más rápido en .NET 6 y, además, los nuevos controladores permitirán usar los valores Span<char> en los marcadores de interpolación. Para los autores de bibliotecas, esta funcionalidad permite controlar si las expresiones de interpolación de cadena se convierten en cadenas. ReSharper 2021.3 reconoce el patrón «controladores de cadenas interpoladas» en el código de biblioteca y ahora puede sugerir de forma segura el uso de expresiones de interpolación de cadena en más lugares.

ReSharper le permite obtener el mejor rendimiento de structs record al sugerirle que se marquen como readonly. Para evitar saturar las declaraciones de tipos con modificadores innecesariamente, esta inspección solo se muestra cuando el tipo de record tiene miembros de instancia no mutantes y no hay mutaciones a través de setters en la solución (requiere un análisis habilitado en toda la solución).

C# 10 le permite simplificar la sintaxis de coincidencia de patrones al permitir el acceso con puntos, en lugar del anidamiento con patrones de objetos.

ReSharper ofrece la inspección correspondiente con un arreglo rápido, así como una acción contextual para deshacer el arreglo rápido.

Por último, pero no menos importante:

  • Hemos mejorado la compatibilidad con expresiones lambda de C# 10: no se mostrará código rojo ni errores de falsos positivos en los proyectos de la API Minimal de .NET 6. Además, ReSharper ahora le ayuda a usar la sintaxis correcta y añade paréntesis donde el compilador espera que aparezcan.
  • Ahora ReSharper admite «Program» como un nombre de clase generado válido para código con declaraciones de nivel superior.
  • Ya está disponible la compatibilidad inicial para miembros del tipo static abstract en interfaces. El análisis del código considera esta construcción como válida, lo que quiere decir que ya no se mostrará código rojo. La funcionalidad Generate missing members detecta miembros del tipo static abstract y los gestiona correctamente. Esta versión también incluye marcas de medianil de herencia y la capacidad de navegar a símbolos base/derivados.

Tipos de referencias que aceptan valores null

Es habitual que los usuarios copien fragmentos de código de otros recursos, como stackoverflow.com. Actualmente, con los tipos de referencias que aceptan valores null disponibles en C#, algunos ejemplos de código ya incluyen la sintaxis NRT. Pero ¿y si no tiene NRT habilitado en su solución? Ahora ReSharper cuenta con dos nuevos arreglos rápidos para ayudarle a reemplazar esa sintaxis después de pegar el código del proyecto: Replace with JetBrains.Annotations attributes y Remove nullable annotations without ‘#nullable’ context.

De vez en cuando, puede que haya errores de coincidencia de nulabilidad entre argumentos de tipo y sus restricciones de nulabilidad. Ahora hay disponibles correcciones rápidas para dichos casos, por ejemplo:

  • Quitar anotaciones que aceptan valores null de argumentos de tipo.
  • Quitar restricciones notnull de argumentos de tipo.
  • Permitir valores que aceptan valores null en parámetros de tipo.
  • No permitir valores que aceptan valores null en parámetros de tipo usados como argumentos de tipo.

Hay disponible un arreglo rápido masivo para corregir anotaciones en parámetros con valores predeterminados que aceptan valores null en un archivo o proyecto, o bien en toda la solución.

También hay un nuevo arreglo rápido masivo que hace que un parámetro acepte valores null en un método.

Análisis del código

Hemos añadido un par de arreglos rápidos y una acción contextual para funciones static anónimas/locales con clausuras:

  • El arreglo rápido Allow closures quita los modificadores static de una función local o anónima si contiene clausuras.
  • El arreglo rápido Pass closure as a parameter convierte las clausuras en funciones locales estáticas en parámetros.
  • La acción contextual Pass closure as a parameter convierte las clausuras de funciones locales no estáticas en parámetros.

Hay una nueva inspección (Simplify string interpolation) con un arreglo rápido correspondiente que reemplaza las llamadas de método .PadLeft() y .PadRight() por expresiones de alineación dentro de marcadores de posición de cadenas interpoladas.

Además de añadir el nuevo struct de registros record struct de C# 10, también hemos mejorado la compatibilidad con structs normales. Muchos desarrolladores aún usan clases con inicializadores de objetos para sus DTO. Ahora puede transformar rápidamente todos estos usos en constructores con parámetros. Esto puede hacerse desde la declaración del registro record en sí, o bien desde un inicializador de objeto. Además, tenga en cuenta que los DTO que definen un constructor con asignaciones de propiedad se pueden convertir.

Desde hace algún tiempo, ReSharper muestra advertencias sobre bloqueos incoherentes en campos. En esta versión, añadimos una inspección complementaria que también tiene en cuenta el orden de varios recursos bloqueados y le informa sobre posibles ciclos de punto muerto.

Ahora ReSharper analiza la plausibilidad de las expresiones aritméticas integrales para comprobar si hay tipos de enteros adicionales, como byte, sbyte, short, ushort, uint, long, ulong y enum. Esto le permite evitar ramas de código inalcanzables.

Para mejorar la legibilidad de las condiciones largas y complejas, hemos añadido el resaltado para los elementos de las condiciones. Resalta grupos de operadores lógicos (por ejemplo, cadenas && y || en C#).

Rendimiento del análisis del código

Hemos reducido el tiempo necesario para las correcciones rápidas y las acciones contextuales que se implementarán cuando se invoquen para una carpeta, proyecto o solución.

Si se habilita Solution-Wide Error Analysis (SWEA) con la función Monitor warnings, ReSharper ahora usará los resultados de SWEA para omitir fácilmente los archivos sin problemas correspondientes, lo que reduce en gran medida el tiempo empleado en encontrar posibles problemas.

También tenemos buenas noticias para aquellos que no ejecuten SWEA en su solución. Ahora ReSharper usa todos los núcleos de CPU disponibles para ejecutar el análisis del código en paralelo. Esto reduce el tiempo global necesario para ejecutar arreglos rápidos de ámbito y acciones contextuales.

 

Hemos mejorado considerablemente el rendimiento del daemon para archivos que contienen métodos de gran tamaño, como los siguientes:

  • Métodos con expresiones condicionales anidadas o de gran tamaño, expresiones de tupla o expresiones switch.
  • Métodos con un gran número de comprobaciones de tipo (cuando están deshabilitados los tipos de referencias que aceptan valores null).
  • Métodos con una gran cantidad de accesos de indexador (cuando están habilitados los tipos de referencias que aceptan valores null).
  • Métodos con un gran número de clausuras (cuando están habilitados los tipos de referencias que aceptan valores null).

Navegación y Find Usages

Nuevas marcas de medianil

Hemos añadido algunas marcas más de medianil para ayudarle a navegar rápidamente por la estructura de herencias de una clase, interfaz o struct. Los nuevos iconos ↑O y ↑I ahora muestran una entidad de código que hereda o implementa otra clase o interfaz, respectivamente. Si la herencia de la entidad de código es compleja, al seleccionar un icono, se mostrará un menú con todos sus ascendientes, hasta la parte superior de la jerarquía de herencia. Si una clase implementa o hereda una interfaz y una clase a la vez, ReSharper mostrará el icono ↑IO en el medianil.

Además, en esta versión hemos habilitado de forma predeterminada la marca de medianil para los miembros de clase. ReSharper añadirá el icono ↓O en el margen izquierdo junto a un miembro de clase si este se ha reemplazado en las clases derivadas. Al hacer clic en el icono:

  • Navegará a un miembro en una clase derivada que reemplace al miembro.
  • Se mostrará un menú con una lista de miembros de clase de otras clases que reemplazan al miembro.

Find Usages para operadores de conversión implícita definidos por el usuario

Ahora puede llamar a Find Usages para operadores de conversión implícita definidos por el usuario. La implementación de esta funcionalidad se basa en el mecanismo usado para las sugerencias de conversión de tipos.

Esto le permite determinar si se usan los operadores de conversión implícita definidos por el usuario y, a continuación, navegar a bloques de código con conversiones.

Tenga en cuenta que este algoritmo no es rápido y puede tardar bastante tiempo en calcular y mostrar los resultados.

Navegar a implementaciones de la interfaz en el modo de depuración

Al invocar Go to Type of Symbol en una variable o parámetro de un tipo de interfaz en el modo de depuración, ReSharper le llevará a la implementación exacta donde se usa en el marco actual, en lugar de la declaración de interfaz.

Inyección de lenguaje

Ahora puede marcar cualquier parámetro, campo o propiedad de la función con el atributo de anotación [LanguageInjection]. ReSharper considerará un valor de cadena de una entidad de código marcado como un fragmento de código en un lenguaje especificado. Pueden insertarse los lenguajes siguientes: CSS, HTML, JavaScript, JSON o XML. Nada más añadir el atributo, obtendrá el resaltado de sintaxis adecuado, finalización de código y otras funcionalidades dentro de la cadena. Tiene que añadir la última versión de JetBrains.Annotations al proyecto para usar el atributo LanguageInjection.

Copy Code Reference

En esta versión, se incluyen muchos cambios en la funcionalidad Copy FQN. En primer lugar, la funcionalidad tiene un nuevo nombre: Copy Code Reference. Creemos que este nombre refleja mejor la acción de la funcionalidad.

Hemos añadido una nueva funcionalidad que es útil si usa Git como sistema de control de versiones. De forma predeterminada, se muestran elementos relacionados con GitHub en la ventana emergente Copy Code Reference para proyectos clonados desde GitHub. Generan un enlace correcto a un repositorio de GitHub que se puede compartir de inmediato.

En el caso de los repositorios que no sean de GitHub, ahora puede añadir plantillas de URI personalizadas en los ajustes de ReSharper. Todas estas plantillas aparecerán en la ventana emergente Copy Code Reference. Una plantilla de URI puede estar formada por varios marcadores de posición predefinidos, como Current Branch Name, File Name, Current Line Number, etc.

Por último, la ventana emergente en sí se ha renovado por completo. El diseño, los iconos y el formateo son nuevos.

Formateo

  • Hemos añadido una opción para aplicar la sangría en llaves de patrones de propiedad o expresiones lambda dentro de condiciones de declaraciones (por ejemplo, dentro de if(), while(), etc.).
  • Hemos añadido una opción para alinear condiciones de declaraciones dentro de los paréntesis en if(), foreach(), etc., y está activada de forma predeterminada.
  • Hemos añadido opciones para aplicar ajuste de línea, recortar, alinear y aplicar sangría izquierda a patrones binarios (por ejemplo, x is Foo or Bar or Baz).

Crear nuevas clases de Unreal Engine

Con ReSharper C++ 2021.3, ya no necesita cambiar a Unreal Editor para crear una clase: todas las plantillas predefinidas para clases de Unreal Engine ya están disponibles en la lista de plantillas de archivos de ReSharper.

Para crear una clase, vaya a Solution Explorer y haga clic con el botón derecho en la carpeta de proyecto que prefiera para abrir el menú Add (o bien use Ctrl+Alt+Insertar). Después de elegir de la lista una plantilla de Unreal Engine y asignar un nombre a la nueva clase, ReSharper C++ generará el encabezado y los archivos de código fuente con el código de plantilla en las carpetas adecuadas (según si el contexto es privado o público).

Novedades de ReSharper C++ 2021.3

Mejor compatibilidad incluso con C++20

Puede usar inicializadores de C++ 20 designados para generar rápidamente código reutilizable para la inicialización de agregados. Solo tiene que seleccionar el elemento correspondiente de la lista de finalización para insertar designadores para los miembros de datos y, a continuación, proporcionar los valores iniciales.

Además, ReSharper C++ 2021.3 incluye inspecciones para ayudarle a adoptar nuevas funciones de la biblioteca para borrar elementos de cualquier contenedor estándar, comprobar si un elemento existe en un contenedor asociativo y crear punteros inteligentes con inicialización predeterminada.

Novedades de ReSharper C++ 2021.3

Compatibilidad con archivos AnalyzerConfig

A partir del SDK .NET 5, puede usar archivos AnalyzerConfig globales para configurar las opciones del analizador de Visual Studio. ReSharper 2021.3 puede leer información de estilo del código de estos archivos AnalyzerConfig globales y usarla para ajustar las reglas de ReSharper en consecuencia.

Muestreo de datos de memoria asignada dotUltimate

Ahora dotMemory puede obtener datos de muestreo de memoria asignada basándose en eventos ETW. En comparación con la forma tradicional (estadística) de recopilar datos de asignación, el muestreo es menos preciso, pero ofrece varias ventajas:

  • Los datos de asignación de muestreo se recopilan sin afectar al rendimiento.
  • No es necesario habilitar esta recopilación de datos de forma explícita, ya que siempre está activada.
  • Los datos de asignación de muestreo también se pueden recopilar al conectar el generador de perfiles a una aplicación que esté ejecutándose.

Tenga en cuenta que esta funcionalidad solo está disponible en Windows.

Novedades de dotMemory 2021.3

Descargar

Prueba gratuita de 30 días disponible