私は、特にさまざまな型のコントロールを処理するコードを記述するときに、一般的なランタイム型識別パターンを使用していることに気づきました。パターンは次のとおりです。
if (ctrl is ControlTypeEtc)
(ctrl as ControlTypeEtc).SomeMethod();
これは、 as演算子が NULL を返す場合に NULL チェックを行う必要がないようにするためです。これを単一の操作に合理化する方法はありますか?
1回の操作でこれを行う方法はありません。
ただし、コード サンプルのようにケースが 2 つではなく 1 つしかないため、使用as
してチェックする方が安価です。null
私はそれを次のように書きます:
ControlTypeEtc ctrl2 = ctrl as ControlTypeEtc;
if (ctrl2 != null)
ctrl2.SomeMethod();
これにより、ダブルチェックが回避されます(1つに最適化される可能性がありますが、わかりません)。
別の方法:
try
{
ControlTypeEtc ctrl2 = (ControlTypeEtc)ctrl;
ctrl2.SomeMethod();
}
catch (InvalidCastException e)
{
}
肝心なのは、「全体像」です。インスタンスに対してコーディングを進める前に、インスタンスが null かどうかを知っておく必要があります。そのステップの周りに近道を見つける理由は本当にありません。
つまり、C# 3 以上を使用している場合は、コードのメイン ロジックからこの詳細を「隠す」ために使用できる拡張メソッドがあります。'SomeType' と 'SomeMethod' のサンプルの下にある 'SomeMethodSafe' という拡張メソッドを参照してください。エラーなしで Null 参照に対して 'SomeMethodSafe' を呼び出すことができます。
家でこれを試さないでください。
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
SomeType s = null;
//s = new SomeType();
// uncomment me to try it with an instance
s.SomeMethodSafe();
Console.WriteLine("Done");
Console.ReadLine();
}
}
public class SomeType
{
public void SomeMethod()
{
Console.WriteLine("Success!");
}
}
public static class SampleExtensions
{
public static void SomeMethodSafe(this SomeType t)
{
if (t != null)
{
t.SomeMethod();
}
}
}
}