带有“指定”标志的值对象

时间:2012-09-03 17:12:41

标签: c# .net class-design nullable

我需要将值传递给方法,并指示每个值是指定还是未指定,因为 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.

1 个答案:

答案 0 :(得分:1)

这是理论上最好的。为了区分常规T和“Tnull”,您需要一个可能的状态,而不是T类型的变量。

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

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