C# 带“的值对象”;“指定”;旗帜

C# 带“的值对象”;“指定”;旗帜,c#,.net,class-design,nullable,C#,.net,Class Design,Nullable,我需要将值传递给一个方法,并指示每个值是指定的还是未指定的,因为null本身是一个有效值,因此不能解释为“未指定” 我采用了通用方法,为这些值创建了一个简单的容器(见下文),但这是正确的方法吗?是否有更好的方法来解决这个问题?例如,框架中是否已经存在这样的类 public struct Omissible<T> { public readonly T Value; public readonly bool IsSpecified; public static readon

我需要将值传递给一个方法,并指示每个值是指定的还是未指定的,因为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结构可省略
{
公共只读T值;
指定了公共只读布尔值;
公共静态只读未指定;
公共可省略(T值)
{
这个。值=值;
this.IsSpecified=true;
}
}
方法签名可以如下所示,允许调用方指示某些值不应更新(未指定),其他值应设置为null/另一个值(已指定)

public更新(int[]itemIds,
可省略值1,可省略值2)//等。

这是理论上最好的方法。为了将常规
T
与“
T
null
区分开来,您需要一种可能的状态,而不是
T
类型的变量所能保持的状态

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


因此,您还需要一个
bool
值。(理论上讲,对于
不可能的
情况,您只需要
log2(2^32+1)-32
位,但存储它的一个简单方法是
bool
)。

您的第二个构造函数是不是要接受
T
参数而不使用它?看起来很适合我。我建议您使用
结构
而不是
。还要检查第二个
构造函数
,没有使用
参数。我还将覆盖GetHashCode、ToString和Equals(就像NullableT一样)
可忽略的
非常奇怪-知道你有一个
int值有用吗?
值,但它的值是null值?你有两个层次的“可选性”,听起来像是一个混乱的配方。我甚至会考虑制作属性而不是字段,从<代码>值>代码>如果<代码>指定是错误的,并且在设置<代码>值时设置<代码>指定为< />代码。
null
且未指定。这可能需要一个
字节
和一个
int
public void BulkUpdate(int[] itemIds, 
  Omissible<int?> value1, Omissible<string> value2) // etc.