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和“Tnull”,您需要一个可能的状态,而不是类型变量T可以容纳的状态。

例如,一个 32 位的 int 可以保存2^32状态。如果您还想保存一个null值,则需要2^32 + 1不适合 4 字节位置的可能状态。

因此,您还需要一个bool值。(从理论上讲,您只需要log2(2^32 + 1) - 32一些位Omissible<int>,但存储它的一种简单方法是 a bool)。

于 2012-09-03T17:55:51.813 回答