【问题标题】:Create Non-Nullable Types in C#在 C# 中创建不可为空的类型
【发布时间】:2011-09-15 23:10:49
【问题描述】:

如何在 C# 中创建 int、bool 等不可为空的值类型?

【问题讨论】:

  • 你会在什么情况下使用这样的东西?我的意思是,你想要完成什么?使用使用 C# 中的类创建的对象时,您始终可以检查 null。奇怪的是您使用的是“类型”一词。如果您在问题中添加了一些上下文,则更容易找到解决方案。
  • @stephenbayer:空值是坏的。运行类型空值检查与运行类型类型检查根本没有区别。如果我给你一个字符串并且你在它上面调用方法,你不会知道它是否可以为空,直到它在运行时爆炸。某些语言具有不可为空的引用类型;如果要表示空值,则使用不同的数据类型(相当于许多语言中的option<string>),因此您可以在编译时通过类型系统进行通信并强制执行空值检查。见stackoverflow.com/questions/641328/…
  • @Juliet 同意了。实际上,我只是对使用的术语感到困惑,将其称为类型,我不知道他是指类、结构还是其他用户定义的类型,例如枚举..等等等等。我已经习惯了在使用它们之前检查所有内容是否为空。但我完全理解您关于设计时间优势的观点。
  • fixed 关键字创建一个值类型。不完全算作 C# 编程中普遍有用的类型。

标签: c# non-nullable


【解决方案1】:

是的,这些被称为struct

结构是值类型,就像intbool 等一样。

他们有一些与之相关的规则/建议:(我认为这些是最重要的)

  • 当不使用 ref 或 out 关键字时,结构是按值传递和分配的……这意味着在将结构分配或传递给方法时,将复制您放入结构中的所有内容。这就是为什么你不应该制作大型结构。

  • 您不能在 C# 中为结构定义无参数构造函数

  • 结构最好是不可变的,并且没有属性设置器。制作可变结构可能会遇到真正的麻烦。

可以在 Microsoft 文档中找到有关结构的其他规则。

至于不可为空的引用类型...这是不可能。您必须手动检查代码中的空值。

【讨论】:

    【解决方案2】:

    7 年后,现在这成为可能

    • 安装包含 C# 8 的 .NET Core 3.0。
    • 将语言版本设置为 8.0:将 8.0 设置为您的 .csproj 文件。
    • 添加属性 true (.to your csproj)

    有关他的更多详细信息,这会影响编写代码和您现有的代码:

    https://praeclarum.org/2018/12/17/nullable-reference-types.html

    【讨论】:

    • 注意:这只是意图,编译器不会强制非空的东西永远为空,只会在它认为可能将 null 放入非空的每个地方发出警告- 可空对象。
    • 如果链接脱机,您需要添加到 .csproj 文件以启用可空引用类型的代码是:<LangVersion>8.0</LangVersion> <NullableReferenceTypes>true</NullableReferenceTypes>
    【解决方案3】:

    你可以定义一个struct:

    结构类型是一种值类型,通常用于封装一小组相关变量,例如矩形的坐标或库存中物品的特征。下面的例子展示了一个简单的结构声明:

    public struct Book
    {
        public decimal price;
        public string title;
        public string author;
    }
    

    但是,您不能为 System.Int32 定义像 int 这样的别名,并且需要将全名 MyNamespace.Book(或 Bookusing MyNamespace;)引用到您的结构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-20
      • 1970-01-01
      • 2016-05-04
      • 1970-01-01
      • 1970-01-01
      • 2020-04-19
      • 1970-01-01
      • 2021-02-17
      相关资源
      最近更新 更多