ファイルとタイプのレイアウトパターンでメンバーを再配置する
ReSharper は、さまざまなパターンに従って C# ファイルの型および型メンバーを並べ替えることができます。 パターンは、ファイル内のアイテムを並べ替えたり、指定された領域でラップしたりするときに評価される多くの条件と制約を記述することができます。
レイアウトパターンの紹介
さまざまなコンテキストに適用されるように複数のレイアウトパターンを設定できます(たとえば、クラスとインターフェースにさまざまなパターンを設定できます)。 パターンには 2 種類あります。
ファイルパターン。 すべての C# ファイルに適用されます。 名前空間、型、デリゲートを整理したり、領域で囲んだり、グループにまとめたり、領域を削除したりできます。 型の内容は、さらにタイプパターンで整理できます。 ファイルパターンは一度に 1 つだけ適用できます。
タイプパターン。 存在する場合、パターンの制約に一致する型にのみ適用されます。 ファイルメンバーを配置したり、リージョンにまとめたり、グループにまとめたり、リージョンを削除したり、並べ替えなどを行うことができます。
パターン内では、希望の順序でマッチャーエントリやスニペット、そして一致した項目を囲む領域/グループを指定できます。
現在のパターンセットを適用するアルゴリズムは、次のように動作します。
ファイルパターンが存在する場合、ReSharper はファイル内の領域を削除するかどうかを確認し、その後、パターン内の各マッチャーエントリまたはスニペットがファイル内のコード項目と一致するかどうかを確認します。
一致するエントリがある場合、ファイル内の対応する正規表現アイテムの位置に従って、ファイル内の位置が変更されます。
同じコード項目が複数のマッチャーエントリと一致する場合、より高い優先度またはより強い制約を持つマッチャーが適用されます。 つまり、パブリックタイプに一致するパターン A およびパブリックスタティックタイプにマッチするパターン B が存在する場合、すべてのパブリックスタティックタイプはパターン B によって照合されます。 これを変更するには、パターン A の優先順位を上げることができます。
同じ制約のセットを有するマッチャーエントリが存在する場合、マッチするアイテムは、そのようなマッチャーエントリの最初の位置に従って移動されます。
リージョンまたはグループが指定されている場合、一致したアイテムはそれに応じてリージョンでグループ化またはラップされます。
グループまたはリージョンでは、優先度を指定できます。 例: グループ/リージョンが外部の他のマッチャーよりも優先度が高い場合、ReSharper は最初にグループ/リージョン内のマッチャーを処理し、その後で残りのマッチャーを処理します。 リージョンのグループ化の唯一の違いは、リージョンが一致したアイテムを
#region/#endregionにラップすることです。一致していないものはすべて、一致したアイテムの後に移動されます。 一致しないアイテムを別の場所に配置する必要がある場合は、制約なしでマッチャーを作成し、パターン内の目的の位置を設定できます。
その後、もしあればタイプパターンが適用されます。 ReSharper は、各型パターンがファイル内のいずれかの型と一致するかどうかを確認します。 型に一致するパターンが複数ある場合は、手順 3 と 4 と同様に競合が解決されます。
型の一致が確立されると、ReSharper は型内の領域を削除するかどうかを確認し、その後パターン内の各マッチャーエントリがファイル内のメンバーと一致するかどうかを確認します。
一致するメンバーがある場合、型の中の対応する正規表現の項目の位置に従って、型の位置が変更されます。
地域、グループ、比類のないメンバーは、手順 5 および 6 と同様に処理されます。
ファイルとレイアウトの環境設定
提供時の状態で、ReSharper はいくつかのターゲット型パターン(例: NUnit テストフィクスチャ用)およびその他の C# 型用のデフォルトパターンを用意しています。
デフォルトのメンバーレイアウトルールは、多数のベストプラクティスに基づいており、ほとんどの場合に推奨できます。 ただし、個人の環境設定や会社の標準が ReSharper のデフォルトと異なる場合は、デフォルトのパターンを基にコード並べ替えパターンを設定したり、特定ケース用に新しいパターンを作成することもできます。
レイアウトパターンへのすべての変更は、ReSharper オプション ページ Alt+R、O で行います。 編集が完了したら、オプション ダイアログで 保存 をクリックして変更を適用し、ReSharper に保存先を選ばせるか、 保存先 セレクターからレイヤーを選択して特定の設定レイヤーに変更を保存します。 詳細については、 resharper 設定の管理と共有 をご覧ください。
ファイルとタイプのレイアウトルールを視覚的に構成する
ReSharper では、専用のビジュアルエディターを使用してレイアウトルールのすべてのパラメーターを設定できます。 エディターページの項目は、次のいずれかのビューで表示できます。
パターン。 これは、現在のパターンセットで使用可能なすべてのパターンを表示するルートビューです。 このビューを開くには、ページの左上隅にある パターン をクリックします。 このビューから、パターンをダブルクリックして任意のパターンに移動できます。 セットに新しいパターンを追加するには、ファイルをドラッグアンドドロップするか、右側のツールボックスからパターンアイテムを入力します。 ドラッグアンドドロップを使用してパターンを並べ替えることもできます。 タイプパターンの順序は、複数のパターンが同じタイプに同じ優先度と制約で一致する場合に適用されるパターンを定義します。
構成。 このビューは、パターン、領域、グループ内のマッチャーエントリ、領域、グループの順序とグループ化を視覚化します。 下の図では、タイプパターンの構成ビューを確認できます:

制約。 このビューでは、パターンまたはマッチャーエントリの制約、つまりどの修飾子や属性を持つコード項目が一致するか・しないかなどを可視化します。 パターンおよびマッチャーは、すべての制約に一致する項目にのみ適用されます。 すべての制約は、これらの制約間の関係を表す論理コンテナーごとにグループ化されます。 下の図では、マッチャーエントリの制約ビューを確認できます:

既存のレイアウトパターンを編集する
メインメニューから を選択するか、 Alt+R O を押してから、左側の を選択します。
現在のセットのすべてのパターンを表示するには、ページの左上隅にある パターン をクリックします。 この要素のプロパティでは、 静的フィールド並べ替えポリシー セレクタを使用して、イニシャライザーで静的フィールドの順序を変更するかどうか、およびその順序を変更する方法を定義できます。 オプションは次のとおりです。
厳格 — プログラムの動作に影響を与える可能性がある場合、静的フィールドは並べ替えられません。 例: 同じクラスの静的メンバーへの参照を持つ初期化子を持つ静的フィールドがある場合、そのクラスの すべての静的フィールドは並べ替えられません。
寛容 — イニシャライザーで他の静的フィールドを明示的に使用している静的フィールドや、それらが参照する静的フィールドの並べ替えは禁止されています。
無制限 — 並べ替えは常に許可されています(推奨されません)。
選択した動作がすべてのパターンに適用されます。
イニシャライザー付きで並べ替えされていない静的フィールドの場合、ReSharper は相対的な順序を保持しつつ、他の宣言と一緒に並べ替えます。
必要に応じて、デフォルトのパターンセットのいずれかをロードするには、ページの右上隅にある ロード をクリックし、パターンセットを選択します。
目的のパターンをダブルクリックし、制約ビューの場合は構成ビューに切り替えてください(パターンヘッダー右側のアイコンをクリックして表示を切り替え)。 ファイルパターンは常に構成ビューで表示されるため、制約は指定できません。
コンポジションビューでは、次の方法でパターンを変更できます。
項目の順序を変更するには、パターンの内側にドラッグします。
特定のアイテムを削除するには、選択して 削除 を押します。 リージョンまたはグループを削除する場合は、その中のすべてのアイテムも削除されます。 削除する前にリージョン / グループからアイテムをドラッグすることができます。
新しいアイテムを追加するには、 Toolbox エリアからパターンの目的の場所にアイテムをドラッグします。 地域 または グループ をドラッグしてグループ化項目として使用するか、 Entry をドラッグしてターゲットコード内の何かと一致させます。
また、 依存関係プロパティ マッチャーを使用して WPF 依存関係プロパティのすべての部分を照合および配置し、 バッキングフィールドを持つプロパティ マッチャーを使用して、対応するプロパティの宣言の直前または直後にプロパティのバッキングフィールドを配置することもできます。
パターンまたはその内部の項目のプロパティを設定するには、その項目を選択し、右下の部分のプロパティを変更します。
- 表示名
このプロパティは、パターンおよびマッチャーエントリで利用可能で、利便性のためだけに使われ、一致する項目の説明を記載します。
- 名前の指定
リージョンのこのプロパティは、リージョンの作成時にリージョンに名前を付ける方法を指定します。
領域が グループ化 オプションに従って生成された場合、名前に
${0}パラメーターを使用して、領域のシーケンス番号を挿入できます。名前付きパラメーターを使って、リージョン名にグループ化オプションを挿入することもできます。 例えば、
${Access}パラメーターを使用すると、対応するリージョン名でprivate、publicなどに置き換えられます。 もちろん、このパラメーターはそのリージョンの グループ化 プロパティに同じ値を使用している場合に意味があります。 このパラメーターの有効な値は、スペースなしの グループ化 プロパティの値と同じです。 つまり、実装しているインターフェース名をリージョン名に挿入したい場合は、${ImplementsInterface}パラメーターを使います。アイテム名の部分一致によってリージョン名を生成することもできます。
- リージョンの除去
ファイルおよび型パターンのこのプロパティは、一致したコード内の既存の領域をどう扱うかを指定します。 Except generated 値は、この機能をデフォルトパターンで適用して生成したリージョンだけを削除したい場合に使えます。
- 優先度
このプロパティは、マッチャーエントリの相対的な優先度を設定します。 つまり、ひとつのコードが複数のマッチャーエントリで一致した場合、一番優先度の高いエントリの位置に移動します。
- 並べ替え条件
このエントリのプロパティは、複数一致したコード項目がある場合の並べ替え環境設定を指定します。 None 以外の並べ替え環境設定を選択すると、並べ替え順序をさらに詳細に指定できる Then By 句が表示されます。
- グループ化
リージョンまたはグループのこのプロパティは、指定されたグループ化に従ってリージョン/グループを生成するかどうかを指定します。 例えば、値として Kindを選択した場合、フィールド・プロパティ・その他メンバー種別ごとに複数のリージョン/グループが作成されます。 None 以外のグループ化環境設定を選択すると、一致したコード項目をさらに分離できる Then By 句が表示されます。
特定のタイプパターンやマッチャーエントリがコード項目とどう一致するかを定める制約を設定するには、制約ビューに切り替えます。 タイプパターンのこのビューを開くには、ヘッダー上の対応するアイコンをクリックします。マッチャーエントリの場合はダブルクリックしてください。
制約ビューでは、選択した項目は条件のコンテナーとして表されます。 これらの条件を設定するには、 Toolbox エリアから編集したパターンまたはエントリにアイテムをドラッグします。
論理コンテナー の項目は、複数の条件を適用する方法を定義するため、最初に追加する必要があります。 これらのコンテナーの名前は、これらのコンテナー内で条件がどのように関連しているかをかなり明確に説明しています。 論理コンテナーがない状態で制約を追加すると、それらは And コンテナーでグループ化されます。
制約 グループの項目を使用すると、一致する項目を定義する必要があります(ない コンテナーにラップされている場合)。
名前の指定 制約の値に正規表現を利用でき、例えば
MyTest.*は名前がMyTest_One、MyTest_Two、MyTest_Threeなどの項目にマッチします。このグループからアイテムを論理コンテナーにドラッグし、右下の部分でそれらのプロパティを構成します。
項目を 修飾子 グループからドラッグして、ターゲット項目に含めるべきかどうかを指定します。
例: 非プライベートな静的フィールドとプロパティに一致するエントリは、次のようになります。

ソース XAML を編集してファイルとタイプレイアウトを構成する
必要に応じて、ファイルとタイプのパターンのセットを記述するソース XAML を編集できます。 これを行うには、 ファイルレイアウト ページの上部にある XAML をクリックします。 このビューは、パターンセットをコピーして貼り付ける場合にも役立ちます。
デフォルトパターンの 1 つをロードして、このフォーマットで使用されているタグを確認することをお勧めします。 たとえば、 Entry タグは照合項目を定義し、 Entry.Match はどのコード項目を一致させるべきかを指定します。 Entry.SortBy タグは、一致したアイテムをどのようにソートするかを指定します。 以下の例を考えてみましょう。

この XAML コードはコンストラクターと一致し、最初に静的コンストラクターに移動するようにコンストラクターを並べ替えます。
シナリオ: 部分的な名前の一致によってリージョン内のアイテムをグループ化する
すべてのメソッドが test で始まり、一部のメソッドに 1 つの共通の部分文字列があり、他のメソッドには別の部分文字列があるクラスを考えてみます。
タイプレイアウトを使用して、リージョン内のメソッドの各セットをラップし、リージョン名として共通の部分文字列を使用できます。
これを行うには、領域名フィールドに ${Name} を指定し、次の正規表現値を使用して 名前の指定 制約をエントリに追加します: test\w+?_.*

または、XAML ビューに次のパターンを追加します。
レイアウトをクラスに適用した後、メソッドはソートされ、対応する領域にラップされます。
ファイルの並べ替えとメンバーの入力
ファイルや型レイアウト設定を目的のスコープで適用するには、 ビルトイン: フルクリーンアッププロファイルで コードのクリーンアップを実行するか、下記の通り特定タスクのみをターゲットにした カスタムプロファイルを作成し実行してください。
カスタムコードクリーンアッププロファイルでファイルとタイプレイアウトを適用する
メインメニューから を選択するか、 Alt+R O を押します。
クリーンアッププロファイル設定ページに移動します: 。
新しいカスタムクリーンアッププロファイルを作成する セクションの説明に従って、新しいプロファイルを作成します。 右側のプロファイル設定で、 チェックボックスが選択されていることを確認してください。 必要に応じて、このプロファイルで他のコードクリーンアップタスクを有効にすることもできます。
オプション ダイアログで 保存 をクリックして変更内容を適用し、ReSharper に保存場所を任せるか、 保存先 セレクターから特定のレイヤーを選択して変更を保存します。 詳細については、 resharper 設定の管理と共有 をご参照ください。
ファイルレイアウトを適用する範囲を選択します。
ファイル内の任意の場所にキャレットを配置して、ファイルレイアウトをファイルに適用します。
ソリューションエクスプローラー の 1 つまたは複数の項目を選択して、これらのノードおよびその子項目のファイルにファイルレイアウトを適用します。
次のいずれかを実行します。
Control+Alt+F を押すか、メインメニューから を選択してください。
テキストエディターの任意の場所を右クリックするか、選択項目を右クリックし、コンテキストメニューで コードのクリーンアップ を選択します。
表示された コードのクリーンアップ ダイアログで、新しく作成したプロファイルを選択します。
実行 をクリックします。 ReSharper は、選択したスコープでファイルレイアウトを適用します。
コードのクリーンアップ ダイアログを開いてプロファイルを選ばずにファイルレイアウトを適用したい場合は、作成したプロファイルを サイレントクリーンアップにバインドし、 Control+Shift+Alt+F を押して実行できます。 ファイルレイアウトの適用と他のコードスタイルタスクを組み合わせた カスタムクリーンアッププロファイルを作成することもできます。
特定のタイプでのメンバーの並べ替えを無効にする
クリーンアップ中にメンバーの順序を変更したいが、特定の型では元のメンバーの順序を保持したい場合は、これらの型を JetBrains.Annotations の [NoReorder] 属性でマークします。
この機能は、次の言語とテクノロジーで サポートされています。