2

私は、特にさまざまな型のコントロールを処理するコードを記述するときに、一般的なランタイム型識別パターンを使用していることに気づきました。パターンは次のとおりです。

if (ctrl is ControlTypeEtc)
    (ctrl as ControlTypeEtc).SomeMethod();

これは、 as演算子が NULL を返す場合に NULL チェックを行う必要がないようにするためです。これを単一の操作に合理化する方法はありますか?

4

3 に答える 3

4

1回の操作でこれを行う方法はありません。

ただし、コード サンプルのようにケースが 2 つではなく 1 つしかないため、使用asしてチェックする方が安価です。null

于 2013-02-09T20:59:46.223 に答える
1

私はそれを次のように書きます:

ControlTypeEtc ctrl2 = ctrl as ControlTypeEtc;
if (ctrl2 != null)
    ctrl2.SomeMethod();

これにより、ダブルチェックが回避されます(1つに最適化される可能性がありますが、わかりません)。

別の方法:

try
{
    ControlTypeEtc ctrl2 = (ControlTypeEtc)ctrl;
    ctrl2.SomeMethod();
}
catch (InvalidCastException e)
{
}
于 2013-02-09T21:03:13.080 に答える
1

肝心なのは、「全体像」です。インスタンスに対してコーディングを進める前に、インスタンスが 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();
            }
        }
    }
}
于 2013-02-09T21:07:52.747 に答える