C#7.3のバージョンは、2つの主要なテーマを持っています。 最初のトピックは、パフォーマンスとセキュリティコード機能として良い、安全でないコードのパフォーマンスを提供します。 第二のトピックは、既存の機能への漸進的な改善を提供します。 また、このリリースでは、新しいコンパイラオプションが追加されます。
テーマのより良いパフォーマンスを得るために、セキュリティコードをサポートするために、次の新機能:
- これは、固定されたフィールドにアクセスすることなく固定することができます。
- あなたは、再割り当てすることができます
ref
ローカル変数を。 - あなたは使用することができ
stackalloc
、設定項目の配列の初期値を。 - あなたはサポートモードのいずれかのタイプを使用することができ
fixed
文を。 - あなたは他の一般的な制約を使用することができます。
既存に次の拡張機能が備わっています:
- タプルはテストするために使用することができる
==
と!=
。 - あなたは、複数の場所に変数式を使用することができます。
- プロパティは、自動プロパティフィールドのサポートに取り付けることができます。
in
区別パラメータ解析の方法が改善されています。- オーバーロードの解決のあいまいな状況は今より少なくなってきています。
新しいコンパイラオプションは次のとおりです。
-publicsign
オープンソースソフトウェア(OSS)を可能とするためのアセンブリに署名しました。-pathmap
ソースディレクトリのマッピングを提供するため。
安全でない 構造体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
声明記事の。
ref
ローカル変数が初期化され、別のインスタンスを参照するために再割り当てすることができます。 ここで、次のコードをコンパイルします。
REF VeryLargeStruct refLocal = REF veryLargeStruct; // 初期化 refLocal = REF anotherVeryLargeStructを; // の再配置を、異なるメモリ参照を反映しています。
詳細については、を参照してください。 ref
リターンおよび ref
ローカル変数、および foreach
記事。
た ARR = 新しい INT [ 3 ] { 1、2、3 }。 た編曲2 = 新しい INT [] { 1、2、3 }。
さて、あなたはするのに使用することができ stackalloc
、同じ配列に宣言構文を実行します。
INT *パー= stackalloc INT [ 3 ] { 1、2、3 }。 INT * pArr2 = stackalloc INT [] { 1、2、3 }。 スパン < INT > ARR = stackalloc [] { 1、2、3 }。
詳細については、を参照してください。stackalloc
オペレータの記事を。
fixed
声明では、種類の限定セットをサポートしています。 C#7.3の起動、任意のリターンが含ま ref T
や 方法の種類がする可能性があります 。 この機能を追加することを意味する と System.Span <T> の使用と関連するタイプです。ref readonly T
GetPinnableReference()
fixed
fixed
詳細については、言語リファレンスを参照 fixed
文の記事を。
さて、タイプが可能 System.Enum または System.Delegate 基底クラスが制約パラメータタイプに指定されています。
今、あなたは新しい使用することができ unmanaged
なければなりませんタイプを指定するには、制約パラメータを「管理されていないタイプ。」 「非管理型」は、参照型ではなく、ネストの任意のレベルで任意の参照タイプが含まれていません。
詳細については、を参照してください where
一般的な制約との制約タイプのパラメータ記事。
既存のタイプに追加されますこれらの制約はある互換性のない変更。 クローズジェネリック型制約は、もはやこれらの新たな要件を満たしていないかもしれません。
[フィールド:SomeThingAboutFieldAttribute] パブリック int型の SomeProperty { 取得します。セット ; }
プロパティは SomeThingAboutFieldAttribute
、コンパイラが生成に使用される SomeProperty
サポートフィールド。 詳細については、C#プログラミングガイド参照のプロパティを。
in
パラメータ修飾子を、これらの2つの方法は、あいまいさにつながります。
静的 ボイドM(Sの引数); 静的 ボイド(M で Sの引数);
今、リロード値によってより良好過負荷によって参照の読み取り専用バージョン(最初の前の例)です。 バージョンと呼ばれる読み取り専用の参照パラメータを使用するには、メソッドの呼び出しの前に追加する in
修飾子を。
詳細については、を参照してください in
パラメータ修飾記事。
out
変数宣言の構文は、フィールド初期化子、属性初期化子、コンストラクタ初期化子とクエリ句を含むように拡張されました。 これは、次の例に示すコードの使用を可能にします。
パブリック クラスB { 公共 B(int型 I、アウト INT J) { J = I。 } } パブリック クラスD:B { 公共 D(int型のI):塩基(I、アウト するvar J) { Console.WriteLineを($ " 'J'の値は、{J}です" )。 } }
各バージョンでは、オーバーロード解決の規則は、方法は、「明白な」選択肢の状況で呼び出すあいまいさを解決するために更新されました。このリリースでは、コンパイラは当然の選択を選ぶ手助けするために、3つの新しいルールを追加します。
- プロセスインスタンスとグループは、静的メンバが含まれている場合、受信機またはコンテキストインスタンスの非存在下でのメソッドが呼び出された場合、コンパイラは、インスタンスメンバーを廃棄します。 この方法は、レシーバのインスタンスを含む場合に呼び出された場合、コンパイラは、静的メンバを破棄する。 受信機の非存在下では、コンパイラは、同時に静的およびインスタンスメンバを追加し、そうでない場合は、静的メンバの静的なコンテキストを追加します。 受信機が不明または実施例の型である場合、コンパイラは、同時に両方を添加しました。 (暗黙的に静的コンテキスト
this
インスタンスの受信機が使用できない)が未定義含まthis
本体部材(例えば、静的メンバ)、および使用することができないthis
位置(例えば、フィールドの初期化とコンストラクタ初期化子)があります。 - パラメータのセットを含むタイプの方法は、特定の制約をジェネリックメソッドを満たさない場合、メンバーは、候補セットから除去されます。
- グループ変換方法のために、戻り型の不一致から代表候補メソッドの戻り型は除去濃縮しました。
あなたが優れている方法を決定するとき、あなたは少ないコンパイルエラーと曖昧オーバーロードされたメソッドがありますので、あなたは、この変更に気づくでしょう。
-publicsign
コンパイラオプションは、アセンブリに署名する公開鍵を使用するようにコンパイラに指示します。 アセンブリが署名としてマークされますが、署名は公開鍵から取得されます。 このオプションは、オープンソースプロジェクトにおける組立棟に署名する公開鍵を使用することができます。
詳細については、 -publicsignコンパイラオプションの記事を。
-pathmap
コンパイラオプションは、ソースパス環境代替ソースパスのマップを生成するようにコンパイラーに指示します。 -pathmap
オプションには、PDBファイルを制御したり、コンパイラによって調製されるよう CallerFilePathAttribute 書かれたソース・パス。
詳細については、 -pathmapコンパイラオプションの記事を。