c# - 带有 "specified"标志的值对象

标签 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;
  }
}

方法签名可能如下所示,允许调用者指示不应更新某些值(未指定),其他值应设置为空/另一个值(指定)。

public void BulkUpdate(int[] itemIds, 
  Omissible<int?> value1, Omissible<string> value2) // etc.

最佳答案

这是理论上可以做到的最好的。为了区分一般T从“Tnull ”你需要一个可能的状态而不是类型的变量 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/

相关文章:

C++ 序列化 : overloading insert operator with write()

c# - 如何查看邮件是否发送成功或取消?

c# - HTTPS GET API 调用错误 - 无法创建 SSL/TLS 安全通道。 - 无法连接到远程服务器

.net - 如何可靠地确定 WPF 应用程序中是否正在使用 `ControlTemplate`?

c# - 带有 linq2twitter/tweetinvi 的 Twitter 流媒体 api

.net - 在单元测试 HttpClient 时如何模拟 GetDiscoveryDocumentAsync?

.net - 取消异步操作

c# - 访问 Visual Studio 2017 的私有(private)注册表配置单元

c# - 按钮事件不会在 FileUpload 的更新面板内触发

c# - 创建将由桌面应用程序和网站使用的对象模型时,我应该考虑哪些特殊注意事项?