Das ist neu in ReSharper 2021.3

ReSharper 2021.3 unterstützt das kürzlich veröffentlichte Visual Studio 2022. Die Codeanalyse bietet neben einer verbesserten allgemeinen C#-Unterstützung auch eine erweiterte C#10-Unterstützung, die unter anderem dateibezogene Namensräume, globale using-Direktiven und Nullable-Referenztypen umfasst. Weitere Neuerungen in dieser Version sind Find Usages nach benutzerdefinierten impliziten Umwandlungsoperatoren, neue Randleistenmarkierungen und eine umfassend verbesserte Copy Code Reference-Funktion.

Herunterladen

Kostenlose 30-Tage-Testversion verfügbar

Unterstützung für Visual Studio 2022

ReSharper unterstützt jetzt den Release-Build des neuen Visual Studio 2022. Sie können denselben umfangreichen Funktionsumfang nutzen, den Sie von anderen Visual-Studio-Versionen gewohnt sind. Da jedoch Visual Studio 2022 ein x64-Prozess ist, ist die Menge des nutzbaren Arbeitsspeichers nicht länger begrenzt. Dadurch arbeiten alle ReSharper-Funktionen schneller.

Um ReSharper mit dieser neuen Version von Visual Studio verwenden zu können, stellen Sie sicher, dass das VS2022-Symbol im Installationsprogramm von dotUltimate 2021.3 ausgewählt ist.

C# 10

C# 10 wurde kürzlich veröffentlicht, und ReSharper erweitert kontinuierlich die Unterstützung der neuen Sprachmerkmale. Wir freuen uns, Ihnen heute die Unterstützung folgender Merkmale vorzustellen: dateibezogene Namensräume, globales „using“, das CallerArgumentExpression-Attribut, Handler für interpolierte Zeichenfolgen und C#10-Lambdas.

Beginnen wir mit dateibezogenen Namensräumen. Zusätzlich zur Unterstützung der neuen Syntax haben wir unter ReSharper | Options | Code Editing | C# | Syntax Style | Code body | Namespaces eine neue Syntaxstil-Option hinzugefügt, damit Sie den gewünschten Stil auswählen können. Wenn Sie einen Stil auswählen, zeigt Ihnen ReSharper bei Codeabschnitten, die nicht dem Stil entsprechen, Inspektionen an und schlägt Quick-Fixes vor, um die entsprechenden Änderungen vorzunehmen. Sie können die Fixes mit einem Klick auf das ganze Projekt oder sogar die gesamte Projektmappe anwenden.

Mit zwei Kontextaktionen können Sie Ihren Code auf den vorherigen Syntaxstil zurücksetzen: Convert to file-scoped namespace und Convert to block-scoped namespace.

Weitere Informationen: Dateibezogene Namensräume

Werfen wir nun einen kurzen Blick auf globale „using“-Anweisungen. Die ReSharper-Codeanalyse erkennt using-Anweisungen, die mit dem Schlüsselwort global gekennzeichnet sind und löst Symbole in allen Codedateien im Projekt entsprechend auf. ReSharper lässt Sie auch wissen, wenn eine globale using-Direktive in einer Datei an der falschen Stelle platziert wurde.

ReSharper hebt globale using-Direktiven, die im Projekt nicht verwendet werden, als ungenutzt hervor und bietet einen Quick-Fix zum Entfernen an.

ReSharper bietet eine umfassende Unterstützung für das CallerArgumentExpression-Attribut, einschließlich Code-Completion und Inspektionen, die Sie bei der korrekten Verwendung unterstützen.

Weitere Informationen: CallerArgumentExpression

In C# 10 wurde das neue Konzept der „Interpolated String Handlers“ eingeführt. Aus der Benutzerperspektive bedeutet dies, dass Zeichenfolgen-Interpolationen in .⁠NET 6 generell schneller sind und die neuen Handler auch die Verwendung von Span<char>-Werten in Interpolationslücken ermöglichen. Bibliotheksautoren können mit dieser Funktion steuern, ob Interpolationsausdrücke in Zeichenfolgen umgewandelt werden. ReSharper 2021.3 erkennt das Muster „Interpolated String Handlers“ in Bibliothekscode und kann jetzt an mehr Stellen die Verwendung von Zeichenfolgen-Interpolationsausdrücken empfehlen.

ReSharper hilft Ihnen, die optimale Performance aus record-Structs herauszuholen, indem es Ihnen empfiehlt, sie als readonly zu markieren. Um Typdeklarationen nicht unnötig mit Modifikatoren zu überfrachten, wird diese Inspektion nur angezeigt, wenn der record-Typ nicht mutierende Instanzmember hat und in der Projektmappe keine Mutationen über Setter erfolgen. Die projektmappenweite Analyse (SWEA) muss dafür aktiviert sein.

Mit C# 10 können Sie die Pattern-Matching-Syntax etwas vereinfachen, indem Sie für Zugriffe den Punkt-Operator statt verschachtelte Objektmuster verwenden.

ReSharper bietet eine entsprechende Inspektion mit Quick-Fix sowie eine Kontextaktion zum Rückgängigmachen der vom Quick-Fix vorgenommenen Änderungen an.

Zu guter Letzt:

  • Wir haben die Unterstützung von C#10-Lambdas verbessert: In Projekten mit .⁠NET 6 Minimal API sollten Sie weder über roten Code noch über falsche Fehlerhinweise stolpern. Als Bonus hilft Ihnen ReSharper dabei, die korrekte Syntax zu verwenden und Klammern einzufügen, wenn diese vom Compiler erwartet werden.
  • ReSharper unterstützt jetzt „Program“ als gültigen generierten Klassennamen für Code mit Top-Level-Anweisungen.
  • Für static abstract Schnittstellenmember ist jetzt eine Erstunterstützung verfügbar. Die Codeanalyse erkennt diese Konstruktion als gültig an, sodass Sie sich nicht mehr mit rot eingefärbtem Code herumschlagen müssen. Die Funktion Generate missing members kann mit Membern, die static abstract sind, richtig umgehen. Diese Version weist zudem mit Randleistenmarkierungen auf Vererbung hin und ermöglicht die Navigation in der Vererbungshierarchie.

Nullable-Referenztypen (NRT)

Es ist nicht ungewöhnlich, dass jemand Code von anderswo kopiert – zum Beispiel von stackoverflow.com. Nullable-Referenztypen sind heute in C# enthalten, und es gibt bereits Codebeispiele, die die NRT-Syntax nutzen. Aber was passiert, wenn NRT in Ihrer Projektmappe nicht aktiviert ist? ReSharper bietet zwei neue Quick-Fixes, um diese Syntax aus eingefügtem Code zu entfernen: Replace with JetBrains.Annotations attributes und Remove nullable annotations without ‘#nullable’ context.

Von Zeit zu Zeit kann es zu Abweichungen zwischen der Nullability von Typargumenten und ihren Nullability-Einschränkungen kommen. Es gibt jetzt Quick-Fixes für solche Fälle, die unter anderem folgende Möglichkeiten bieten:

  • Nullable-Annotationen aus Typargumenten entfernen.
  • notnull-Einschränkungen aus Typargumenten entfernen.
  • Nullable-Werte in Typparametern zulassen.
  • Nullable-Werte in Typparametern, die als Typargumente verwendet werden, nicht zulassen.

Die Korrektur von Parameterannotationen mit Nullable-Standardwerten kann mittels Bulk-Quick-Fix in einer Datei, einem Projekt oder der gesamten Projektmappe erfolgen.

Es gibt auch einen neuen Bulk-Quick-Fix, der Parameter nullbar macht, wenn sie innerhalb der Methode auf null überprüft werden.

Codeanalyse

Wir haben einige neue Quick-Fixes und eine Kontextaktion für static lokale/anonyme Funktionen mit Closures eingeführt:

  • Der Quick-Fix Allow closures entfernt den Modifikator static von einer lokalen oder anonymen Funktion, wenn sie Closures enthält.
  • Der Quick-Fix Pass closure as a parameter verschiebt Closures aus statischen lokalen Funktionen in Parameter.
  • Die Kontextaktion Pass closure as a parameter verschiebt Closures aus nicht statischen lokalen Funktionen in Parameter.

Die neue Inspektion Simplify string interpolation mit entsprechendem Quick-Fix ersetzt Aufrufe von .PadLeft() und .PadRight() in den Platzhaltern von interpolierten Zeichenfolgen durch Ausrichtungsausdrücke.

Neben dem Hinzufügen der neuen C# 10-Datensatzstruktur record struct haben wir auch die Unterstützung regulärer Structs erweitert. Viele verwenden für ihre DTOs immer noch Klassen mit Objektinitialisierern. Jetzt können Sie all diese Verwendungen schnell in Konstruktoren mit Parametern umwandeln. Dies kann entweder über die record-Deklaration oder über einen beliebigen Objektinitialisierer erfolgen. Beachten Sie, dass auch DTOs konvertiert werden können, die einen Konstruktor mit Eigenschaftszuweisungen definieren.

ReSharper warnt Sie schon seit einiger Zeit vor uneinheitlichen Locks auf Feldern. In dieser Version fügen wir eine ergänzende Inspektion hinzu, die auch die Reihenfolge mehrerer gesperrter Ressourcen berücksichtigt und Sie über mögliche Deadlock-Zyklen informiert.

ReSharper hat die Plausibilitätsprüfungen für ganzzahlarithmetische Ausdrücke auf weitere Ganzzahltypen wie byte, sbyte, short, ushort, uint, long, ulong und enum erweitert. Dadurch wird es leichter, unerreichbare Verzweigungen zu vermeiden.

Um lange und komplexe Bedingungen leichter lesbar zu machen, haben wir eine Hervorhebung für Bedingungselemente hinzugefügt. Es werden Gruppen von logischen Operatoren hervorgehoben, z. B. Verkettungen von && und || in C#.

Codeanalyse-Performance

Quick-Fixes und Kontextaktionen benötigen jetzt weniger Zeit bei der Anwendung auf einen Ordner, ein Projekt oder eine Projektmappe.

Wenn Solution-Wide Error Analysis (SWEA) (Projektmappenweite Fehleranalyse) mit Monitor warnings aktiviert ist, überspringt ReSharper jetzt anhand der SWEA-Ergebnisse die Dateien, in denen das gesuchte Problem nicht vorhanden ist. Dadurch wird der Zeitaufwand für das Finden der zu behebenden Probleme erheblich reduziert.

Auch für diejenigen, die SWEA in ihren Projekten nicht aktiviert haben, haben wir eine gute Nachricht: ReSharper nutzt jetzt alle verfügbaren CPU-Kerne, um die Codeanalyse parallel durchzuführen. Dies reduziert die Gesamtzeit beim Ausführen von Quick-Fixes und Kontextaktionen.

 

Wir haben die Leistung des Daemons für Dateien mit riesigen Methoden erheblich verbessert. Dies gilt insbesondere für:

  • Methoden mit großen oder verschachtelten Bedingungsausdrücken, Tupelausdrücken oder switch-Ausdrücken.
  • Methoden mit vielen Typprüfungen, wenn Nullable-Referenztypen deaktiviert sind.
  • Methoden mit vielen Indexzugriffen, wenn Nullable-Referenztypen aktiviert sind.
  • Methoden mit vielen Closures, wenn Nullable-Referenztypen aktiviert sind.

Navigation und Find Usages

Neue Randleistenmarkierungen

Wir haben einige weitere Randleistenmarkierungen hinzugefügt, damit Sie schnell durch die Vererbungsstruktur einer Klasse, Schnittstelle oder Struct navigieren können. Die neuen Symbole ↑O und ↑I zeigen an, dass eine Codeentität eine andere Klasse oder Schnittstelle erbt bzw. implementiert. Wenn die Vererbungslinie komplex ist, wird durch Auswahl des Symbols ein Menü mit allen übergeordneten Elementen bis hin zum Anfang der Vererbungshierarchie angezeigt. Wenn eine Klasse eine Schnittstelle und eine Klasse gleichzeitig implementiert bzw. erbt, zeigt ReSharper dies durch das ↑IO-Symbol in der Randleiste an.

Darüber hinaus ist in dieser Version das Randleistensymbol für Klassenmember standardmäßig aktiviert. ReSharper zeigt in der linken Randleiste neben einem Klassenmember das Symbol ↓O an, wenn der Klassenmember in abgeleiteten Klassen überschrieben wird. Durch Anklicken des Symbols können Sie:

  • Zu einem überschreibenden Member in einer abgeleiteten Klasse navigieren.
  • Ein Menü mit einer Liste von Klassenmembern aus anderen Klassen anzeigen, die diesen Member überschreiben.

Find Usages für benutzerdefinierte implizite Umwandlungsoperatoren

Find Usages kann jetzt Verwendungen von benutzerdefinierten impliziten Umwandlungsoperatoren finden! Diese Funktion basiert auf demselben Mechanismus, der für die Typkonvertierungs-Hints verwendet wird.

Mit einer solchen Suche können Sie feststellen, ob benutzerdefinierte implizite Umwandlungsoperatoren verwendet werden und gegebenenfalls zu den Codeblöcken mit den Umwandlungen navigieren.

Bitte beachten Sie, dass dieser Algorithmus einige Zeit benötigt, bis die Ergebnisse vorliegen und angezeigt werden können.

Navigation zu Schnittstellenimplementierungen im Debug-Modus

Wenn Sie im Debug-Modus Go to Type of Symbol für eine Variable oder einen Parameter aufrufen, der einen Schnittstellentyp hat, zeigt Ihnen ReSharper nicht die Schnittstellendeklaration, sondern die im aktuellen Frame verwendete Implementierung an.

Sprachinjektionen

Sie können jetzt alle Parameter, Felder oder Eigenschaften einer Funktion mit dem Annotationsattribut [LanguageInjection] markieren. ReSharper interpretiert dann eine Zeichenfolge im entsprechenden Element als Codefragment der angegebenen Sprache. Die Injektion folgender Sprachen ist möglich: CSS, HTML, JavaScript, JSON und XML. Sobald Sie das Attribut hinzufügen, stehen für die Zeichenfolge eine korrekte Syntaxhervorhebung, Code-Completion und andere Funktionen zur Verfügung. Um LanguageInjection nutzen zu können, müssen Sie die neueste Version von JetBrains.Annotations zu Ihrem Projekt hinzufügen.

Codereferenz kopieren

In dieser Version haben wir grundlegende Änderungen an der Funktion Copy FQN vorgenommen. Zunächst einmal wurde das Feature in Copy Code Reference umgetauft. Wir glauben, dass dieser Name die Funktionalität besser widerspiegelt.

Wir haben auch neue Funktionen hinzugefügt, die Sie verwenden können, wenn Sie Git als Versionsverwaltung verwenden. Bei Projekten, die aus GitHub geklont wurden, enthält das Copy Code Reference-Popup standardmäßig GitHub-bezogene Einträge. Diese generieren einen korrekten Link zu einem GitHub-Repository, um ein sofortiges Teilen zu ermöglichen.

Für Nicht-GitHub-Repositories können Sie jetzt in den ReSharper-Einstellungen selbst definierte URI-Vorlagen hinterlegen. All diese Vorlagen werden im Copy Code Reference-Popup angezeigt. Eine URI-Vorlage kann verschiedene vordefinierte Platzhalter enthalten: den aktuellen Branchnamen, den Dateinamen, die aktuelle Zeilennummer usw.

Auch das Popup-Fenster selbst wurde gründlich überarbeitet. Design, Symbole, Formatierung – alles ist neu.

Formatierung

  • Eine neue Option ermöglicht das Einrücken von Lambda- oder Eigenschaftsmuster-Klammern in Anweisungsbedingungen – zum Beispiel in if() und while().
  • Wir haben eine Option hinzugefügt, um Bedingungen innerhalb der Klammern von Anweisungen wie if(), foreach() usw. auszurichten. Diese Option ist standardmäßig aktiviert.
  • Neue Optionen ermöglichen das Umbrechen, Aufteilen, Ausrichten und Ausrücken von Binärmustern wie x is Foo or Bar or Baz.

Erstellung neuer Unreal-Engine-Klassen

Mit ReSharper C++ 2021.3 müssen Sie nicht mehr zum Unreal Editor wechseln, um eine neue Klasse zu erstellen – alle vordefinierten Vorlagen für Unreal-Engine-Klassen sind jetzt in der Liste der ReSharper-Dateivorlagen verfügbar.

Um eine neue Klasse zu erstellen, gehen Sie zum Solution Explorer und öffnen Sie das Add-Menü mit einem Rechtsklick auf den gewünschten Projektordner (oder mit Strg+Alt+Einfg). Nachdem Sie eine Unreal-Engine-Vorlage von der Liste ausgewählt und der neuen Klasse einen Namen gegeben haben, generiert ReSharper C++ in den richtigen Ordnern – je nachdem, ob private oder public – die Header- und Quellcode-Dateien mit dem Vorlagencode.

Das ist neu in ReSharper C++ 2021.3

Noch bessere C++20-Unterstützung

Sie können designierte Initialisierer gemäß C++20 verwenden, um unkompliziert Boilerplate-Code für die Aggregatinitialisierung zu generieren. Wählen Sie einfach das entsprechende Element aus der Completion-Liste aus, um Designatoren für die Datenmember einzufügen, und geben Sie dann die Initialisierungswerte ein.

Darüber hinaus bietet ReSharper C++ 2021.3 Inspektionen, die Ihnen helfen, neue Bibliotheksfunktionen einzuführen – zum Beispiel um Elemente aus einem beliebigen Standardcontainer zu löschen, die Existenz eines Elements in einem assoziativen Container zu prüfen und Smart-Pointer mit Standardinitialisierung zu erstellen.

Das ist neu in ReSharper C++ 2021.3

Unterstützung für AnalyzerConfig-Dateien

Beginnend mit dem .⁠NET-5-SDK können Sie globale AnalyzerConfig-Dateien zum Konfigurieren der Analyzer-Optionen von Visual Studio verwenden. ReSharper 2021.3 kann Codestilinformationen aus diesen globalen AnalyzerConfig-Dateien auslesen und die ReSharper-Regeln entsprechend anpassen.

Sampling von Speicherallokationsdaten dotUltimate

dotMemory kann jetzt gesampelte Daten zur Speicherallokation basierend auf ETW-Ereignissen abrufen. Im Vergleich zur traditionellen (statistischen) Erfassung von Allokationsdaten ist die Sampling-Methode zwar weniger genau, bietet aber eine Reihe von Vorteilen:

  • Die Erfassung der Allokationsdaten hat keine Auswirkung auf die Leistung.
  • Sie müssen diese Datenerfassung nicht explizit aktivieren; sie ist immer aktiv.
  • Das Sampling von Allokationsdaten ist auch möglich, wenn Sie den Profiler an eine bereits ausgeführte Anwendung anhängen.

Bitte beachten Sie, dass diese Funktion nur unter Windows verfügbar ist.

Das ist neu in dotMemory 2021.3

Herunterladen

Kostenlose 30-Tage-Testversion verfügbar