3

nullはそれ自体が有効な値であり、したがって「未指定」として解釈できないため、各値が指定されているか指定されていないかを示すとともに、値をメソッドに渡す必要があります。

私は一般的なアプローチを取り、そのような値の単純なコンテナを作成しました(以下を参照)が、これは正しい方法ですか?この問題に取り組むためのより良い方法はありますか?たとえば、このようなクラスはフレームワークにすでに存在しますか?

public struct Omissible<T>
{
  public readonly T Value;
  public readonly bool IsSpecified;
  public static readonly Omissible<T> Unspecified;

  public Omissible(T value)
  {
    this.Value = value;
    this.IsSpecified = true;
  }
}

メソッドシグニチャは次のようになり、呼び出し元が特定の値を更新しない(指定しない)こと、他の値をnull /別の値(指定する)に設定する必要があることを示すことができます。

public void BulkUpdate(int[] itemIds, 
  Omissible<int?> value1, Omissible<string> value2) // etc.
4

1 に答える 1

1

これは、理論的に実行できる最善の方法です。Tジェネラルを "Tまたは"と区別するには、タイプの変数が保持できるnullよりも多くの可能な状態が 1 つ必要です。T

たとえば、32 ビットの int は2^32状態を保持できます。nullさらに値を保存する場合は2^32 + 1、4 バイトの場所に収まらない可能性のある状態が必要です。

boolしたがって、追加の値が必要です。(理論的に言えば、必要なのはケースlog2(2^32 + 1) - 32のビットだけですOmissible<int>が、これを格納する簡単な方法は ですbool)。

于 2012-09-03T17:55:51.813 に答える