オリジナル:https://blogs.msdn.microsoft.com/mazhou/2017/06/27/c-7-series-part-4-discards/
時々、私たちは特にoutパラメータ、メソッドの戻り値を無視する、典型的な例は、文字列を別の型に解析することが可能かどうかをチェックすることです:
BOOL parsedValue; IF(BOOL .TryParse(" TRUE "、OUT parsedValue)){ / * 他のコード* / }
ここでは、parsedValueを無視します。我々はまた、開発者はそれを参照することができないので、ということは、この変数にアクセスできないようにしたいです。
C#7.0は破棄(:公式翻訳:翻訳放棄し元)と呼ばれた新機能、このシナリオでは、私たちの目標を達成するために使用することができます。
放棄された元
放棄された元を割り当てることができますが、ローカル変数から読み取ることができません。言い換えれば、彼らは「書き込み専用」のローカル変数です。彼らは何の名前を持っていませんが、_(アンダースコア)で表されます。_文脈キーワード、およびVARと非常に類似しており、_(すなわち、割り当ての右側に表示されません)読むことができません。
我々は上記のコードに適用される要素を放棄した場合、それは次のようになります。
IF(BOOL .TryParse(" TRUE "、OUT BOOL _)){ / * 他のコード* / }
それはIDEでのIntelliSenseには表示されませんので、_、読めないので、コードをコンパイルしません。
放棄された元該当シーン
- など:. BOOL修飾、外との声明を表現TryParse(「文字列」、アウト_)
- 例えば句パターンマッチング、またはケースINT _場合(xは_文字列です)
- 解体:
- 声明の中で:VAR(、_、C)=このmyobj
- ; AのVAR、B:割り当てに(A、B、_)=このmyobj
- 値タプル解体:例えばVAR(_、_)=(1,2,3)
キーワード_
常に、あなたは現在のコンテキスト内のローカル変数_を宣言しているし、それがスコープ内に配置されている場合、それは放棄さ_元されないことを意味VARのような_であるコンテキスト関連するキーワードを、覚えていますそれはローカル変数のスコープを参照します。
さらに興味深いのは、次のコードを確認することです。
BOOL _ = falseを、V = 偽; もし(BOOL .TryParse(" TRUE "、アウト VAR _)) { V = _。 }
V値は、数ありますか?
答えはfalseです。条件がtrueの場合、文字列は「真」真のブール値に解決することができますが、ここでは変数が以前_スコープを宣言カバーする、_ VARを取り出したので、それは捨てられた元です。vは偽であるので、次に、代入文vは、IF = _、_のみ最初のローカル変数を宣言(偽)が値を読み、そしてVに割り当てられています。私たちは_のコードを変更するには、VARを削除する場合は、_もはや捨てられた元(翻訳:普通の変数)であるため、vの値は、真でないだろう、それが解析されたブール値を保持します。
結論
C#で見捨てられた元は、ローカル変数のいくつかを無視することができました。これは設計上の特徴である、まだローカル変数を実行する必要があり、コンパイラはそれの名前を生成してもよいです。_あなたがコード化されたの使用を回避するための戦略を設定する必要がありますので、キーワードは、コンテンツキーワードであるため、_混乱を低減するために、ローカル変数宣言の名前として。この機能と互換性のある.NETの以前のバージョンでは、それは、CLRを変更する必要はありませんので。
シリーズ: