9

ベストプラクティスのガイダンスを探しています。次のようなコード行があるとします。

Color color = someOrder.Customer.LastOrder.Product.Color;

ここで、Customer、LastOrder、Product、および Color は、null通常の状態である可能性があります。ただし、パス内のオブジェクトのいずれかが null の場合、色を null にしたいと思います。null 参照の例外を回避するために、オブジェクトごとに null 条件をチェックする必要があります。

Color color = someOrder == null ||
              someOrder.Customer == null || 
              someOrder.Customer.LastOrder == null ||
              someOrder.Customer.Product == null ? 
              null : someOrder.Customer.LastOrder.Product.Color;

または私はこれを行うことができます

Color color = null;
try {color = someOrder.Customer.LastOrder.Product.Color}
catch (NullReferenceException) {}

最初の方法は明らかに機能しますが、コーディングがやや面倒で読みにくいようです。2 番目の方法は少し簡単ですが、これに例外処理を使用することはお勧めできません。

null をチェックし、必要に応じて null を色に割り当てる別のショートカット方法はありますか? または、そのようなネストされた参照を使用するときに NullReferenceExceptions を回避する方法について何か考えはありますか?

4

6 に答える 6

13

null セーフな逆参照演算子を探しています。

Color color = someOrder?.Customer?.LastOrder?.Product?.Color;

残念ながら、C# ではサポートされていません。後で追加されるかもしれませんが、現時点ではその予定はありません。

関連している

于 2012-04-28T08:27:40.220 に答える
2

ベスト プラクティスは、次のように聞こえるデメテルの法則に従うことです。見知らぬ人と話をしないでください。つまり、オブジェクトは、別のメソッドによって返されたメンバー オブジェクトのメソッドを呼び出さないようにする必要があります。これにより、結合が少なく、保守しやすく、読みやすいコードを書くことができます。

someOrder.Customer.LastOrder.Product.Colorしたがって、デメテルの法則に完全に違反するため、のような「列車事故」の使用は避けてください。このコードが持つビジネス上の意味を理解することさえ困難です。現在のものではない別の注文の製品の色が表示されるのはなぜですか?

列車の残骸を取り除く可能な方法 - 機能を残骸の興味深い終点に近づけます。あなたの場合、何らかの順序を使用する代わりに、最後の製品をメソッドに渡すことも検討してください。

于 2012-04-28T09:50:37.477 に答える
1

これを達成する必要がある場合は、これを行います。

使用法

Color color = someOrder.ComplexGet(x => x.Customer.LastOrder.Product.Color);

また

Color color = Complex.Get(() => someOrder.Customer.LastOrder.Product.Color);

ヘルパー クラスの実装

public static class Complex
{
    public static T1 ComplexGet<T1, T2>(this T2 root, Func<T2, T1> func)
    {
        return Get(() => func(root));
    }

    public static T Get<T>(Func<T> func)
    {
        try
        {
            return func();
        }
        catch (Exception)
        {
            return default(T);
        }
    }
}
于 2014-03-31T09:58:15.277 に答える
0

ネストされたプロパティにアクセスするための独自のメソッドを定義します。たとえば、このように

private Customoer GetCustomer(Order order)
{
  return order != null ? order.Customer : null;
}

private Order GetLastOrder(Customer customer)
{
   return customer != null ? customer.LastOrder : null;
}

定義されたメソッドを使用して、アプリケーション全体のプロパティにアクセスします

于 2012-04-28T08:50:11.930 に答える
0

私は間違いなく最初の方法を好みます... 2番目の方法は、プログラムフローの例外メカニズムを悪用しますが、これは私見の悪い習慣です...

私の知る限り、C#にはショートカットや「ヌルセーフ逆参照演算子」はありません。

于 2012-04-28T08:29:13.117 に答える
0

if ステートメントで Null 条件演算子を使用することもできます。ネストされた値がたくさんある場合に非常に便利です。

例:

public class DummyDto
{
    public string Name { get; set; }

    public DummyDto Parent { get; set; }
}

class Program
{
    static void Main(string[] args)
    {

        var dummyDto = new DummyDto();

        //Both if statements will be true below
        if(dummyDto.Parent?.Name == null)
        {
            Console.WriteLine("DummyDto is null");
        }

        if (dummyDto.Parent == null || dummyDto.Parent.Name == null)
        {
            Console.WriteLine("DummyDto is null");
        }
    }
}
于 2020-01-14T15:17:52.177 に答える