ReSharper 2021.3 の新機能

ReSharper 2021.3 は、最近リリースされた Visual Studio 2022 をサポートしています。 コード解析では、ファイルスコープの名前空間とグローバル using ディレクティブなどの C# 10 の機能サポート、null 許容参照型、および全般的な C# サポートが改善されています。 このリリースでは、ユーザー定義の暗黙的な変換演算子に対応した Find Usages(使用箇所の検索)、新しいガターマーク、および大幅に強化された Copy Code Reference(コード参照のコピー)機能も追加されています。

ダウンロード

無料 30 日間体験版をご利用可能です

Visual Studio 2022 のサポート

ReSharper が新しい Visual Studio 2022 のリリースビルドをサポートするようになりました。 他の Visual Studio バージョンでこれまで使用してきたのと同じリッチな機能セットを使用できますが、 Visual Studio 2022 は x64 プロセスであるため、割り当てられる最大メモリ量に制限されることはありません。 そのため、すべての ReSharper 機能がこれまでよりも高速に動作するようになっています。

ReSharper をこの新しいバージョンの Visual Studio で使用するには、dotUltimate 2021.3 インストーラーで VS2022 アイコンを必ず選択してください。

C# 10

最近リリースされた C# 10 に合わせて、ReSharper はより多くの C# 10 の機能を追加するように継続的な開発が行なわれています。 このリリースでは、ファイルスコープの名前空間、グローバル using、CallerArgumentExpression 属性、「補完された文字列ハンドラー」の概念、および C# 10 のラムダを新たにサポートしています。

ファイルスコープの名前空間から説明しましょう。 新しい構文自体のサポートのほかに、ユーザーが希望するスタイルを選択できる新しい構文スタイルオプションを追加しました(ReSharper | Options(オプション)| Code Editing(コード編集)| C# | Syntax Style(構文スタイル) | Code body(コード本体)| Namespaces(名前空間))。 スタイルを選択すると、ReSharper がそのスタイルに合わせて変更する必要のあるコードのインスペクションを表示し、適切なクイックフィックスを提案します。 この修正は、プロジェクト全体だけでなくソリューション全体にもワンクリックで反映させることができます。

コードを以前の構文スタイルに戻すための Convert to file-scoped namespace(ファイルスコープの名前空間に変換)および Convert to block-scoped namespace(ブロックスコープの名前空間に変換)という 2 つのコンテキストアクションが追加されました。

詳細: ファイルスコープの名前空間

では、グローバル using を簡単に見てみましょう。 ReSharper コード解析は global キーワードが付いた using を認識し、それを使用してプロジェクト内のすべてのコードファイルにあるシンボルを正しく解決します。 また、ReSharper はグローバル using がファイル内で誤った場所に配置されている場合にそれをユーザーに通知します。

ReSharper はプロジェクトで使用されていないグローバル using を未使用としてハイライトし、そのステートメントを除去するためのクイックフィックスを提供します。

ReSharper は CallerArgumentExpression 属性を手厚くサポートしており、この属性の適切な使用を支援するコード補完とコードインスペクションも備えています。

詳細: CallerArgumentExpression

C# 10 には「補完された文字列ハンドラー」という新しい概念が導入されています。 エンドユーザー側では、これは文字列補間式が全般的に .NET 6 でより高速に動作し、新しいハンドラーによって補間の中で Span<char> 値を使用できるようになることを意味しています。 ライブラリ作成者側では、この機能を使用して文字列補間式が文字列に変換されるかどうかを制御できます。 ReSharper 2021.3 はライブラリコード内の「補間された文字列ハンドラー」パターンを認識し、より多くの場所で文字列補間式を使用して安全に提案できるようになりました。

ReSharper は record 構造体を readonly としてマークすることを提案することで、それらのパフォーマンスを最大限に引き出せるようにします。 型宣言が修飾子によって無駄に読みにくくならないように、このインスペクションは record 型に変更されないインスタンスメンバーがあり、setter による変更がソリューションにない場合にのみ表示されます(ソリューション全体解析が有効である必要があります)。

C# 10 では、オブジェクトパターンのネストの代わりにドットアクセスを許可することで、パターンマッチング構文をわずかに単純化できます。

ReSharper は、これに対応するクイックフィックス付きのインスペクションと、クイックフィックスを元に戻すコンテキストアクションを提供します。

その他の重要な変更点:

  • C# 10 ラムダのサポートを改善しました。.NET 6 Minimal API プロジェクトでは、赤文字のコードや誤検出エラーのいずれも発生しないと思われます。 さらに、ReSharper では正しい構文を使用しやすくなり、コンパイラーが期待する場所に丸括弧を追加できるようになっています。
  • ReSharper がトップレベルのステートメントを含むコードの有効な生成クラス名として「Program」をサポートするようになりました。
  • インターフェースで静的抽象メンバーの初期サポートが提供されています。 コード解析はこの構造を有効とみなすため、赤文字のコードを処理する必要はもうありません。 Generate missing members(欠落しているメンバーの生成)機能は、静的抽象メンバーを認識し、それらを正しく処理します。 このリリースには継承ガターマークも含まれており、基本/派生シンボルに移動できるようになっています。

null 許容参照型

stackoverflow.com のような外部リソースからコードをコピーすることはよくあります。 最近では、null 許容参照型を C# で利用できるため、一部のコードサンプルにはすでに NRT 構文が含まれています。 しかし、ソリューションで NRT が有効になっていない場合はどうでしょうか。 ReSharper には、このようなコードをプロジェクトに貼り付けた後に、この構文を取り除きやすくする Replace with JetBrains.Annotations attributes(JetBrains.Annotations 属性に置換)と Remove nullable annotations without ‘#nullable’ context(‘#nullable’ コンテキストのない null 許容アノテーションの除去)という 2 つの新しいクイックフィックスが用意されています。

型の引数と null 許容性制約で null 許容性が一致しないことがあります。 このような場合のために、以下を含むクイックフィックスが追加されました。

  • null 許容アノテーションを型引数から除去する。
  • notnull 制約を型引数から除去する。
  • 型パラメーターで null 許容値を許可する。
  • 型引数として使用される型パラメーターで null 許容値を許可しない。

ファイル、プロジェクト、またはソリューション全体で null 許容のデフォルト値を使用してパラメーターのアノテーションを修正するための一括クイックフィックスを使用できます。

また、メソッド内の null がチェックされる場合に、パラメーターを null 許容にする新しい一括クイックフィックスも追加されています。

コード解析

クロージャ付きの静的なローカル/匿名関数に対応する新しいクイックフィックスとコンテキストアクションをいくつか追加しました。

  • Allow closures(クロージャを許可)クイックフィックスは、ローカルまたは匿名関数にクロージャが含まれる場合に、クロージャから static 修飾子を除去します。
  • Pass closure as a parameter(クロージャをパラメーターとして渡す)クイックフィックスは静的なローカル関数のクロージャをパラメーターに取り出します。
  • Pass closure as a parameter(クロージャをパラメーターとして渡す)コンテキストアクションは静的でないローカル関数のクロージャをパラメーターに取り出します。

新しい Simplify string interpolation(文字列補間の単純化)インスペクションと、それに対応するクイックフィックスが追加されています。クイックフィックスは、補間文字列プレースホルダー内にある .PadLeft() および .PadRight() メソッドの呼び出しを位置合わせ式に置換します。

新しい C# 10 の record struct に加えて、通常の構造体のサポートも改善しました。 多くの開発者は依然として、DTO にオブジェクトイニシャライザーを使ったクラスを使用しています。 このような使用箇所をすべてパラメーター付きのコンストラクターに素早く変換できるようになりました。 この操作は、record 宣言自体か任意のオブジェクトイニシャライザーから行えます。 プロパティ代入を含むコンストラクターを定義する DTO も変換可能です。

すでに少し前から、ReSharper はフィールドの矛盾したロックについて警告を表示してきました。 このバージョンでは、複数のロックされたリソースの順序も考慮して潜在的なデッドロック循環を通知する補完的なインスペクションを追加しています。

ReSharper が bytesbyteshortushortuintlongulongenum などの追加整数型に対し、整数算術式の妥当性をチェックするようになりました。 このため、到達不能なコード分岐を回避しやすくなります。

長く複雑な条件を読みやすくするために、条件要素のハイライト機能を追加しました。 C# の連鎖した &&|| などの論理演算子グループをハイライトします。

コード解析のパフォーマンス

クイックフィックスとコンテキストアクションがフォルダー、プロジェクト、またはソリューションに対して呼び出される際の実行時間を短縮しました。

Solution-Wide Error Analysis(SWEA)(ソリューション全体のエラー解析)が Monitor warnings(警告の監視)で有効になっている場合、ReSharper は SWEA の結果を使用して対応する問題のないファイルをスキップするため、修正する問題の検索に掛かる時間が大幅に短縮されるようになりました。

また、ソリューションで SWEA を実行しないユーザーにも朗報があります! ReSharper が使用可能なすべての CPU コアを活用し、並行してコード解析を実行できるようになりました。 これにより、範囲対象のクイックフィックスとコンテキストアクションの全体的な実行時間が短縮されます。

 

以下のように大きなメソッドを含むファイルにおけるデーモンのパフォーマンスを大幅に改善しました。

  • 複雑で長い条件式やネストした条件式、タプル式、または switch 式を含むメソッド。
  • null 許容参照型が無効になっている状態で大量の型チェックを含んでいるメソッド。
  • null 許容参照型が有効になっている状態で大量のインデクサーアクセスを含んでいるメソッド。
  • null 許容参照型が有効になっている状態で大量のクロージャを含んでいるメソッド。

ナビゲーションと Find Usages(使用箇所の検索)

新しいガターマーク

クラス、インターフェース、または構造体の継承構造内を素早く移動しやすくするため、さらにガターマークをいくつか追加しました。 新しい ↑O および ↑I アイコンは、コードエンティティが別のクラスまたはインターフェースを継承または実装していることを示します。 このコードエンティティの継承が複雑である場合にアイコンを選択すると、その上のすべての祖先が継承階層のトップまでメニューに表示されます。 クラスがインターフェースとクラスを同時に実装または継承している場合、ReSharper はガターに ↑IO アイコンを表示します。

また、このリリースではクラスメンバーのガターマークをデフォルトで有効にしています。 クラスメンバーが派生クラスでオーバーライドされている場合、ReSharper はクラスメンバーの横の左ガターに ↓O アイコンを追加します。 アイコンをクリックすると、以下が行われます。

  • このメンバーをオーバーライドしている派生クラスのメンバーに移動します。
  • このメンバーをオーバーライドしている他のクラスのクラスメンバーのリストがメニューに表示されます。

ユーザー定義の暗黙的な変換演算子に対応した Find Usages(使用箇所の検索)

ユーザー定義の暗黙的な変換演算子に対し、Find Usages(使用箇所の検索)を呼び出せるようになりました。 この機能の実装は、型変換ヒントに使用されているメカニズムに基づいています。

このため、ユーザー定義の暗黙的な変換演算子の使用状況を調べ、変換のあるコードブロックに移動することができます。

ただし、このアルゴリズムは高速ではないため、計算と検索結果の表示にしばらく時間が掛かる場合がありますのでご注意ください。

デバッグモードでのインターフェース実装への移動

デバッグモードでインターフェース型の変数またはパラメーターに Go to Type of Symbol(シンボルの型に移動)を呼び出すと、ReSharper はインターフェース宣言ではなく現在のフレームで使用されているその実際の実装に移動します。

言語インジェクション

関数のパラメーター、フィールド、またはプロパティに [LanguageInjection] アノテーション属性でマークできるようになりました。 ReSharper はマークされたコードエンティティの文字列値を指定された言語のコードと見なします。 言語としては、CSS、HTML、JavaScript、JSON、または XML を注入できます。 属性を追加するとすぐに、適切な構文ハイライト、コード補完、およびその他の機能を文字列内で使用できるようになります。 LanguageInjection 属性を使用するには、プロジェクトに最新バージョンの JetBrains.Annotations を追加する必要があります。

コード参照のコピー

このリリースでは、Copy FQN(FQN のコピー)機能に多数の変更が行われています。 まず、この機能には新しい Copy Code Reference(コード参照のコピー)という名前が付けられています。 この名前のほうが機能をよく表していると思われます。

Git をバージョン管理システムとして使用する場合の新機能を追加しました。 Copy Code Reference(コード参照のコピー)ポップアップには、GitHub からクローンされたプロジェクトの GitHub 関連のアイテムが初期状態で表示されるようになっています。 誰とでもすぐに共有できるように、GitHub リポジトリへの適切なリンクが生成されます。

GitHub 以外のリポジトリでは、ReSharper 設定にカスタム URI テンプレートを追加できるようになりました。 すべてのテンプレートは、Copy Code Reference(コード参照のコピー)ポップアップに表示されます。 URI テンプレートは、Current Branch Name(現在のブランチ名)、File Name(ファイル名)、Current Line Number(現在の行番号)などのさまざまな定義済みプレースホルダーで構成できます。

最後に、ポップアップ自体のデザインが大幅に変更されています。 デザイン、アイコン、フォーマットすべてが一新されています。

フォーマット

  • if()while() 内など、ステートメント条件内にあるラムダまたはプロパティパターンの波括弧をインデントするオプションを追加しました。
  • if()foreach() などの丸括弧内のステートメント条件を整列するオプションを追加し、デフォルトでオンにしました。
  • x is Foo or Bar or Baz のようなバイナリパターンの折り返し、切り捨て、整列、およびインデント解除を行なうオプションを追加しました。

新しい Unreal Engine クラスの作成

ReSharper C++ 2021.3 より、新しいクラスを作成する際に Unreal Editor に切り替える必要がなくなりました。Unreal Engine クラスのすべての定義済みテンプレートを、ReSharper ファイルテンプレートのリストから使用できるようになっています。

新しいクラスを作成するには、Solution Explorer(ソリューションエクスプローラー)に移動し、希望するプロジェクトフォルダーを右クリックしてAdd(追加)メニューを開きます(または Ctrl+Alt+Insert を使用します)。 リストから Unreal Engine テンプレートを選択して新しいクラスに名前を付けると、ReSharper C++ が private または public のコンテキストに応じた適切なフォルダーにヘッダーとテンプレートコードを含むソースファイルを生成します。

ReSharper C++ 2021.3 の新機能

C++20 サポートのさらなる改善

C++20 の指示付きイニシャライザーを使用して、集約初期化のボイラープレートコードを素早く生成できます。 補完リストから対応する項目を選択し、データメンバーの指示子を挿入してから初期値を指定するだけです。

また、ReSharper C++ 2021.3 には、標準コンテナーから要素を削除する、要素が関連コンテナーに存在するかどうかをチェックする、およびデフォルトの初期化でスマートポインターを作成するなどの、新しいライブラリ関数を採用しやすくするインスペクションが用意されています。

ReSharper C++ 2021.3 の新機能

AnalyzerConfig ファイルのサポート

.NET 5 SDK より、グローバル AnalyzerConfig ファイルを使用して Visual Studio のアナライザーオプションを構成できるようになりました。 ReSharper 2021.3 はこれらのグローバル AnalyzerConfig ファイルからコードスタイル情報を読み取り、それを使用して ReSharper のルールを調整することができます。

メモリ割り当てデータのサンプリング dotUltimate

dotMemory が ETW イベントに基づいて、メモリの割り当てに関するサンプリングデータを取得できるようになりました。 従来の(統計的な)割り当てデータの収集方法と比べると、サンプリング精度は劣るものの以下のような数多くのメリットがあります。

  • サンプリングした割り当てデータは、パフォーマンスに悪影響を及ぼすことなく収集されます。
  • このデータ収集は常に動作しているため、明示的に有効化する必要はありません。
  • サンプリングした割り当てデータは、プロファイラーをすでに実行中のアプリケーションに接続する際にも収集されます。

この機能は Windows でのみ提供されていることに注意してください。

dotMemory 2021.3 の新機能

ダウンロード

無料 30 日間体験版をご利用可能です