C#7.3の新機能

C#7.3のバージョンは、2つの主要なテーマを持っています。 最初のトピックは、パフォーマンスとセキュリティコード機能として良い、安全でないコードのパフォーマンスを提供します。 第二のトピックは、既存の機能への漸進的な改善を提供します。 また、このリリースでは、新しいコンパイラオプションが追加されます。

テーマのより良いパフォーマンスを得るために、セキュリティコードをサポートするために、次の新機能:

  • これは、固定されたフィールドにアクセスすることなく固定することができます。
  • あなたは、再割り当てすることができます  ref ローカル変数を。
  • あなたは使用することができ  stackalloc 、設定項目の配列の初期値を。
  • あなたはサポートモードのいずれかのタイプを使用することができ  fixed 文を。
  • あなたは他の一般的な制約を使用することができます。

既存に次の拡張機能が備わっています:

  • タプルはテストするために使用することができる  == と  !=
  • あなたは、複数の場所に変数式を使用することができます。
  • プロパティは、自動プロパティフィールドのサポートに取り付けることができます。
  • in 区別パラメータ解析の方法が改善されています。
  • オーバーロードの解決のあいまいな状況は今より少なくなってきています。

新しいコンパイラオプションは次のとおりです。

  • -publicsignオープンソースソフトウェア(OSS)を可能とするためのアセンブリに署名しました。
  • -pathmapソースディレクトリのマッピングを提供するため。
より効率的なセキュリティコードを有効にするには01
あなたは危険なコードの安全性能と優れたC#のコードが同じで書くことができるはずです。 セキュリティ・コード・エラー・クラスは、バッファオーバーフロー、及び他の浮遊ポインタメモリアクセスエラーとして、回避することができます。 これらの新機能は、機能検証、セキュリティコードを拡張します。より安全なコードを書くしようとする構造を使用しています。 これらの機能は実装することが容易になります。
1.1固定インデックスフィールドを修正する必要はありません
構造体の定義
安全でない 構造体S 
{ 
    パブリック 固定 INT myFixedField [ 10 ]。
}

C#の以前のバージョンでは、に属する固定変数にアクセスする必要が  myFixedField 整数のいずれかを。 さて、コードは変数せずに、コンパイルされた  p 単一の固定  fixed の文:

クラスC 
{ 
    静的 S S = 新しいS(); 

    危険な 公共 ボイドM()
    { 
        int型、P = s.myFixedField [ 5 ]。
    } 
}

変数  p アクセス  myFixedField 要素。 別の宣言する必要はありません  int* 変数を。 あなたはまだ必要があることに注意してください  unsafe コンテキストを。 C#の以前のバージョンでは、我々は、第2の固定のポインタを宣言します。

クラスC 
{ 
    静的 S S = 新しいS(); 

    危険な 公共 ボイドM()
    { 
        固定INT * PTR = s.myFixedField)
        { 
            int型、P = PTR [ 5 ]。
        } 
    } 
}

詳細については、を参照してください  fixed 声明記事の。

1.2は、参考文献のローカル変数を再割り当てすることができます
さて、のために  ref ローカル変数が初期化され、別のインスタンスを参照するために再割り当てすることができます。 ここで、次のコードをコンパイルします。
REF VeryLargeStruct refLocal = REF veryLargeStruct; // 初期化 
refLocal = REF anotherVeryLargeStructを;               // の再配置を、異なるメモリ参照を反映しています。

詳細については、を参照してください。  ref リターンおよび  ref ローカル変数、および  foreach 記事。

1.3は、配列初期化子をサポートstackalloc
あなたは、配列の要素の値の初期値を設定すると、あなたが値を指定することができます:
 ARR =   新しい INT [ 3 ] { 123 }。
編曲2 = 新しい INT [] { 123 }。

さて、あなたはするのに使用することができ  stackalloc 、同じ配列に宣言構文を実行します。

INT *パー= stackalloc  INT [ 3 ] { 123 }。
INT * pArr2 = stackalloc  INT [] { 123 }。
スパン < INT > ARR = stackalloc [] { 123 }。

詳細については、を参照してください。stackallocオペレータの記事を。

1.4は、固定された声明のより多くの種類をサポートしています

fixed 声明では、種類の限定セットをサポートしています。 C#7.3の起動、任意のリターンが含ま  ref T や   方法の種類がする可能性があります  。 この機能を追加することを意味する   と  System.Span <T>  の使用と関連するタイプです。ref readonly TGetPinnableReference()fixedfixed

詳細については、言語リファレンスを参照  fixed 文の記事を。

1.5強化された汎用的な制約

さて、タイプが可能  System.Enum  または  System.Delegate  基底クラスが制約パラメータタイプに指定されています。

今、あなたは新しい使用することができ  unmanaged なければなりませんタイプを指定するには、制約パラメータを「管理されていないタイプ。」 「非管理型」は、参照型ではなく、ネストの任意のレベルで任意の参照タイプが含まれていません。

詳細については、を参照してください  where 一般的な制約の制約タイプのパラメータ記事。

既存のタイプに追加されますこれらの制約はある互換性のない変更。 クローズジェネリック型制約は、もはやこれらの新たな要件を満たしていないかもしれません。

既存の機能を強化する02
次の機能は、言語機能に改良を提供します。 これらの機能は、C#の製造における効率を高めます。
2.1元グループのサポート==と!=
C#のタプル型がサポートされるようになりました  == と  !=。 詳細については、を参照してくださいタプルのテキスト変換式の部分を。
2.2は、フィールドをサポートし、自動実装プロパティに機能を追加します
今、この構文はサポートされています。
[フィールド:SomeThingAboutFieldAttribute]
 パブリック int型の SomeProperty { 取得しますセット ; }

プロパティは  SomeThingAboutFieldAttribute 、コンパイラが生成に使用される  SomeProperty サポートフィールド。 詳細については、C#プログラミングガイド参照のプロパティを

決定的な解像度特性を過負荷にする方法2.3
追加  in パラメータ修飾子を、これらの2つの方法は、あいまいさにつながります。
静的 ボイドM(Sの引数);
静的 ボイド(M  Sの引数);

今、リロード値によってより良好過負荷によって参照の読み取り専用バージョン(最初の前の例)です。 バージョンと呼ばれる読み取り専用の参照パラメータを使用するには、メソッドの呼び出しの前に追加する  in 修飾子を。

詳細については、を参照してください  in パラメータ修飾記事。

2.4拡張表現変数初期化子で
C#7.0でできるように追加された  out 変数宣言の構文は、フィールド初期化子、属性初期化子、コンストラクタ初期化子とクエリ句を含むように拡張されました。 これは、次の例に示すコードの使用を可能にします。
パブリック クラスB 
{ 
   公共 B(int型 I、アウト INT J)
   { 
      J = I。
   } 
} 

パブリック クラスD:B 
{ 
   公共 D(int型のI):塩基(I、アウト するvar J)
   { 
      Console.WriteLineを($ " 'J'の値は、{J}です" )。
   } 
}
2.5改良されたヘビーデューティー候補

各バージョンでは、オーバーロード解決の規則は、方法は、「明白な」選択肢の状況で呼び出すあいまいさを解決するために更新されました。このリリースでは、コンパイラは当然の選択を選ぶ手助けするために、3つの新しいルールを追加します。

  1. プロセスインスタンスとグループは、静的メンバが含まれている場合、受信機またはコンテキストインスタンスの非存在下でのメソッドが呼び出された場合、コンパイラは、インスタンスメンバーを廃棄します。 この方法は、レシーバのインスタンスを含む場合に呼び出された場合、コンパイラは、静的メンバを破棄する。 受信機の非存在下では、コンパイラは、同時に静的およびインスタンスメンバを追加し、そうでない場合は、静的メンバの静的なコンテキストを追加します。 受信機が不明または実施例の型である場合、コンパイラは、同時に両方を添加しました。 (暗黙的に静的コンテキスト  this インスタンスの受信機が使用できない)が未定義含ま  this 本体部材(例えば、静的メンバ)、および使用することができない  this 位置(例えば、フィールドの初期化とコンストラクタ初期化子)があります。
  2. パラメータのセットを含むタイプの方法は、特定の制約をジェネリックメソッドを満たさない場合、メンバーは、候補セットから除去されます。
  3. グループ変換方法のために、戻り型の不一致から代表候補メソッドの戻り型は除去濃縮しました。

あなたが優れている方法を決定するとき、あなたは少ないコンパイルエラーと曖昧オーバーロードされたメソッドがありますので、あなたは、この変更に気づくでしょう。

03新しいコンパイラオプション
C#プログラムとDevOpsチームのプログラムの新しいバージョンをサポートするための新しいコンパイラオプション。
3.1パブリックまたはオープンソースの署名

-publicsign コンパイラオプションは、アセンブリに署名する公開鍵を使用するようにコンパイラに指示します。 アセンブリが署名としてマークされますが、署名は公開鍵から取得されます。 このオプションは、オープンソースプロジェクトにおける組立棟に署名する公開鍵を使用することができます。

詳細については、  -publicsignコンパイラオプションの記事を。

3.2パスマップ

-pathmap コンパイラオプションは、ソースパス環境代替ソースパスのマップを生成するようにコンパイラーに指示します。 -pathmap オプションには、PDBファイルを制御したり、コンパイラによって調製されるよう  CallerFilePathAttribute  書かれたソース・パス。

詳細については、  -pathmapコンパイラオプションの記事を。

おすすめ

転載: www.cnblogs.com/SavionZhang/p/11201364.html