我需要将值传递给方法,同时指示每个值是指定的还是未指定的,因为 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;
}
}
方法签名可能如下所示,允许调用者指示不应更新某些值(未指定),其他值应设置为空/另一个值(指定)。
public void BulkUpdate(int[] itemIds,
Omissible<int?> value1, Omissible<string> value2) // etc.
最佳答案
这是理论上可以做到的最好的。为了区分一般T
从“T
或 null
”你需要一个可能的状态而不是类型的变量 T
可以坚持。
例如,一个 32 位的 int 可以容纳 2^32
状态。如果你想保存一个null
另外你需要的值2^32 + 1
不适合 4 字节位置的可能状态。
所以你需要一个bool
另外的值(value)。 (从理论上讲,对于 log2(2^32 + 1) - 32
情况,您只需要 Omissible<int>
位,但存储它的简单方法是 bool
)。
关于c# - 带有 "specified"标志的值对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12251836/