パターンは、従来のタイプベースのスイッチングよりも優れていますか?
は、「タイプごとに直接スイッチ」をサポートしていないC#などの言語で、通常、クラシック「if ... else ... else」構造を使用してタイプベースのスイッチングをシミュレートします。ただし、関連するタイプの数が増えると、このアプローチは長く脆弱になります。
パターンマッチングC#7以降
C#7から始めて、パターンマッチングは、よりエレガントで簡潔なタイプで切り替える方法を提供します。 「ケースタイプ」構文は、変数の種類を一致させ、「if」ステートメントを特定のパターンの場合に効果的に置き換えることができます。
例えば:
void Foo(object o)
{
switch (o)
{
case A a: // 匹配A类型
a.Hop();
break;
case B b: // 匹配B类型
b.Skip();
break;
default:
throw new ArgumentException("意外类型: " o.GetType());
}
}
c#6を使用してnameof()
を使用してC#6では、nameof()演算子を使用して、スイッチステートメントのタイプ名を動的に取得できます。パターンマッチングほど簡潔ではありませんが、ハードコーディングされたタイプ名を避けるための簡単な代替手段を提供します。
void Foo(object o)
{
switch (o.GetType().Name)
{
case nameof(A):
// 处理A类型
break;
case nameof(B):
// 处理B类型
break;
default:
// 处理其他类型
break;
}
}
C#5以前の
のタイプベースのスイッチ
C#5以前には、ハードコードされたタイプ名を持つ基本的な「if ... else ... else ... else ... else ... else」構造を使用する以外に選択肢がありません。このアプローチは不器用でエラーが発生しやすくなる可能性があります。void Foo(object o)
{
if (o is A)
{
// 处理A类型
}
else if (o is B)
{
// 处理B类型
}
else
{
// 处理其他类型
}
}
結論は
C#7以降のパターンマッチングは、タイプベースのスイッチングをシミュレートするための強力で簡潔な方法を提供します。条件付きチェーンの必要性を排除し、コードの読みやすさを向上させ、エラーの可能性を減らします。 c#の以前のバージョンの場合、nameof()とswitchステートメントを使用して、ハードコーディングされたタイプ名よりも柔軟な代替品が提供され、クラシックな「if ... else ... else ... else ... else」構造はまだ理想的ではありませんが、実行可能なオプションです。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3