Java 1.8 ではOptional<T>
、メソッドが null 値を返す可能性がある場合を明示的に指定し、isPresent()
使用前にそのメソッドの消費者に null ( ) でないかどうかを確認するように「強制」できるクラスが提供されます。
C# にはNullable<T>
、基本的な型で同様のことを実行する があります。これは、値が存在し 0 の場合と、値が存在せず null の場合を区別するために、DB クエリに使用されるようです。
しかし、C# はNullable<T>
オブジェクトには機能せず、基本型にのみ機能するのに対し、Java はOptional<T>
オブジェクトには機能し、基本型には機能しないようです。
C# には、オブジェクトを抽出して使用する前に、オブジェクトが存在するかどうかを強制的にテストする Nullable/Optional クラスがありますか?
ベストアンサー1
私の意見では、プロパティOption
を公開する実装は、HasValue
アイデア全体の失敗です。オプション オブジェクトのポイントは、コンテンツが存在するかどうかをテストせずに、そのコンテンツへの無条件呼び出しを行うことができることです。
オプションのオブジェクトに値が含まれているかどうかをテストする必要がある場合、一般的なnull
テストと比較して何も新しいことを行ったことにはなりません。
オプション オブジェクトについて詳しく説明した記事は次のとおりです。C# での Option/Maybe 型のカスタム実装
コードと例を含む GitHub リポジトリは次のとおりです。https://github.com/zoran-horvat/option
重いオプション ソリューションの使用に抵抗がある場合は、軽量のソリューションを簡単に構築できます。インターフェイスを実装する独自のOption<T>
型を作成しIEnumerable<T>
、LINQ 拡張メソッドを活用して呼び出しをオプションにすることができます。以下は、最も簡単な実装です。
public class Option<T> : IEnumerable<T>
{
private readonly T[] data;
private Option(T[] data)
{
this.data = data;
}
public static Option<T> Create(T value)
{
return new Option<T>(new T[] { value });
}
public static Option<T> CreateEmpty()
{
return new Option<T>(new T[0]);
}
public IEnumerator<T> GetEnumerator()
{
return ((IEnumerable<T>)this.data).GetEnumerator();
}
System.Collections.IEnumerator
System.Collections.IEnumerable.GetEnumerator()
{
return this.data.GetEnumerator();
}
}
このOption<T>
型の使用は LINQ 経由で行われます。
Option<Car> optional = Option<Car>.Create(myCar);
string color = optional
.Select(car => car.Color.Name)
.DefaultIfEmpty("<no car>")
.Single(); // you can call First(), too
オプション オブジェクトの詳細については、次の記事を参照してください。
Option
型やその他の手段を使用して制御フローを簡素化する方法の詳細については、私のビデオ コースを参照してください。C# コードをより機能的にするそして.NET の戦術的デザイン パターン: 制御フロー
最初のビデオコース(C# コードをより機能的にするEither
) では、 型とOption
型の使用方法、およびそれらを使用してオプション オブジェクトを管理し、例外的なケースやエラーを処理する方法など、鉄道向けプログラミングについて詳しく紹介しています。