我需要将值传递给方法,并指示每个值是指定还是未指定,因为 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.
答案 0 :(得分:1)
这是理论上最好的。为了区分常规T
和“T
或null
”,您需要一个可能的状态,而不是T
类型的变量。
例如,32位int可以保存2^32
个状态。如果您想另外保存null
值,则需要2^32 + 1
个可能不适合4字节位置的状态。
此外,您还需要bool
值。 (从理论上讲,log2(2^32 + 1) - 32
案例只需要Omissible<int>
位,但存储它的简单方法是bool
。