Visual StudioおよびCodeRush for RoslynでのC#言語機能のサポートについて

C#は常に進化しています。 7番目のバージョンは春にリリースされました。 この記事では、CodeRush for Roslynの最新のC#機能のサポートを確認します。 C#7.0については、すでにハブ上にいくつかの出版物があります。そのため、主な注意は、これがCodeRush for Roslynでどのようにサポートされるかに正確に注目しています。







ボーナスとして、記事の最後に、何らかの理由で新しい言語機能を使用したくない人のためのレシピを提供します。













非同期メソッドのタスクのような戻り型



以前の非同期メソッドがTaskまたはTask <T>タイプのみを返すことができた場合、非同期メソッドの戻り値で使用できる独自のTaskのようなタイプを宣言できるようになりました。







最初に、 Taskのような型を返す非同期メソッド内で機能がどのように機能するかを確認しましょう。 たとえば、1つのパラメーターを持つメソッドの場合、 Exit Method Contractを呼び出してみてください:













ご覧のとおり、CodeRush for Roslynは、 returnステートメントを空にして式を含めるべきではないと正しく判断しました。 この場合、戻り値の型はユニバーサルではありません(型パラメーターは含まれません)。 returnステートメントを生成する他の機能も正常に機能します。 例として、非同期メソッド内でSmart Returnを呼び出す「r」 パターンがどのように機能するかを見てみましょう。













この場合、CodeRushはreturnステートメントに ArgumentKind型の式を含める必要があることを正しく認識し、対応するデフォルト値を挿入しました。







2番目のポイントは、 Taskのような型を返す非同期メソッド呼び出しでawait式を使用する機能です。 次のスクリーンショットでわかるように、CodeRushはそのようなawait-式のタイプを正しく定義しています。













値のタプル



おそらく、言語の仕様におけるこの革新は、最も人気があると主張しています。 便利な構文を使用して、いくつかの値のタプルである型を宣言できます。 単純な要素タイプとその名前の両方を指定できます。 将来のリリースでは、タプルの最も広範なサポートについていくつかのアイデアがあります:未使用アイテムの識別と削除、アイテムの交換、タプルへの変換のリファクタリングでのタプルの使用など。現在、既存の機能でタプルがサポートされています。 パラメータ追加リファクタリングの例を使用して、これを実証しましょう。













リファクタリングは、 SortingKindおよびSortingOrderから入力された値をタプルとして正しく解析し、これらのタイプのデフォルト値からタプルをデフォルト値として置き換えました。







別の例として、パターンrを展開することで生じるSmart Return機能の動作を示します。













ご覧のように、CodeRush for Roslynは、タプル変数が宣言されている場合、それらの名前を使用します。







ネストされたローカル関数



特定の方法に限定された、使用する補助関数を記述することが必要になる場合があります。 C#7では、メソッドの本体でローカル関数を直接宣言することができます。 ローカル関数はラムダ式に似ていますが、多くの場合、ローカル関数を使用したコードはより直感的で理解しやすいものです。







最初に、ローカル関数で動作するように名前付けアシスタント機能を更新しました。













また、おなじみのパラメーターの追加も新しい構文で機能するようになりました。













リファクタリングにより、宣言とすべてのリンクが正しく検出され、目的の位置にパラメーターが追加されました。







expression-bodyとthrow-expressionの使用を拡張する



C#6のexpression-bodyの使用が多くの人に好まれたと思います。プロパティアクセサ、コンストラクタ、デストラクタで拡張できる要素のリストがあります。 要素の使用リファクタリングは、新しい要素で使用できます。













また、新しい構文が使用される場合、このリファクタリングとは逆のExpand MethodおよびExpand Accessorが利用可能です。













メソッド/アクセッサ本体に実装がなく、例外呼び出しのみが存在する場合にも、 式ボディの使用が利用可能になりました。 throw-expressionの出現により、そのようなメソッド記録をより短く、より視覚的にすることができます。













throw-expressionがコードの可視性を向上させるもう1つのケースは、三項演算子を使用する場合です。 現在、/ elseが式であり、条件に応じて、例外がスローされるか値が返されるか割り当てられる場合、1つの式を3項演算子で置き換えることができます。 Compress to Ternary Expressionのリファクタリングは、これに役立ちます。













Expand Ternary Expressionのリバースリファクタリングは、 throw-expressionを使用した式でも使用できます。













パターンマッチング



また、非常に強力な技術革新は、多くのユーザーにすでに愛されていると確信しています。 if case文で、変数が特定の型のオブジェクトであることを確認し、この型の変数をすぐに宣言して、不必要なキャストを回避できます。 caseステートメントでは、これに加えて、 whenステートメントで追加のチェックを実行できます。







このセクションでは、すべてのアイデアをまだ実装していません。 すでに存在するものの例として、新しい構文を使用するケース式でのクラス宣言機能の動作を説明しましょう。













この場合、RoslynのCodeRushは、ここで型テンプレートが使用されていることを正しく判断し、また、 when式で使用されるプロパティをすぐに宣言しまし 。 このメソッドをデバッグして、 CodeRush Debug Visualizerをオンにしましょう。













デバッガーがswitchステートメントに達すると、 Debug Visualizerはすべてのcase-noteの式を計算し、この場合に実行される式を表示して、他のブランチのコードをフェードさせます。 これにより、コードのデバッグがより視覚的で便利になり、次のステップで実行されるコードが示されます。







リンクで戻る



これで、変数への参照をパラメーターだけでなく、メソッドの戻り値の型でも使用できます。 変数への参照を含むローカル変数を宣言することもできます。







スマートリターンメソッド宣言の2つの機能を既に知っているので、参照によって値を返すメソッドでどのように機能するかを見てみましょう。













この場合、returnステートメントにはref式を含める必要があるため、Smart Returnはキーワードrefを置き換えました。 メソッドがref式で呼び出されていることを確認すると、 Methodを宣言し、正しいref SyntaxNode型を宣言しました。







バイナリリテラル



これで、コード内のいくつかの定数の値をバイナリコードを使用して設定できます。 乗り換えに便利です。 CodeRushには、新しい要素であるSmart Duplicate Lineを追加するタスクを高速化および簡素化できる機能があります。 Shift + Enterを押すと、CodeRushは新しい要素を追加し、変更が必要な要素をテキストフィールドで強調表示します。













そして約束のボーナス



知っている人はほとんどいませんが、プロジェクトレベルでは、言語バージョンを選択できます。 RoslynのCodeRushはBuildを尊重します| 高度な | 言語バージョン













たとえば、C#4.0をインストールすると、C#6.0で線補間が考案されたため、コンテキストメニューが変更されます。













ただし、サポートされていないメニュー項目を条件ごとに非表示にするだけでなく、コード生成のレベルを含め、目的のバージョンの言語の完全なサポートを実装します。







たとえば、プロジェクトのバージョンがC#6.0の場合、 宣言メニューの 比較宣言メンバーは次の方法でコード生成します。







// ... Class1 other = obj as Class1; if (other == null) { throw new ArgumentException(nameof(obj) + " is not a " + nameof(Class1)); } // ...
      
      





また、C#3.0では、たとえば、 nameof()は存在せず、コードは次のようになります。







 // ... Class1 other = obj as Class1; if (other == null) { throw new ArgumentException("obj is not a Class1"); } // ...
      
      





RoslynのCodeRushは、通常のスタジオパーサーを使用することで、新しいC#機能と古い機能の両方を同様にサポートします。 CodeRushは、速度を落とすことなくVisual Studioの機能を大幅に拡張します。 これは、大量のコードを使用する深刻なエンタープライズプロジェクトで特に顕著です。







RoslynCodeRushの試用版を当社のWebサイトからダウンロードできます。








All Articles