在C#中创建非空类型

51

如何在C#中创建类似int、bool等非空值类型?


1
你会在什么情况下使用这个东西?我的意思是,你想要实现什么目标?在使用C#中创建的对象时,您可以始终检查是否为空。而且很奇怪你使用了“类型”这个术语。如果您在问题中添加一些上下文,那么解决方案就会更容易找到。 - stephenbayer
据我所知,如果赋值运算符可以重载,那么非空引用类型将是可能的。然而,在C#中并非如此。另一个问题是MyType type;在开始时将为null。 - Marino Šimić
9
空值是不好的。在运行时,空值检查本质上与类型检查没有什么不同。如果我给你一个字符串并调用其中的方法,你在运行时之前无法知道它是否可为空,只能等到程序崩溃了才知道。一些语言有非空引用类型;如果要表示空值,您需要使用不同的数据类型(类似于许多语言中找到的 option<string>),因此您可以通过编译时的类型系统来通信和强制执行空值检查。参见https://dev59.com/5kbRa4cB1Zd3GeqP4d1L#1451909。 - Juliet
1
@Juliet同意。我其实只是对术语感到困惑,他称之为“类型”,我不知道他是指类、结构体还是其他用户定义的类型,比如枚举等等。我习惯在使用之前检查所有内容是否为空。但我完全理解你在设计时的优势观点。 - stephenbayer
2
“fixed” 关键字创建一个值类型。在 C# 编程中并不算是一种通用的有用类型。 - Hans Passant
2
可能是如何在C#中接近非空类型?的重复问题。 - nawfal
3个回答

59

是的,这些被称为struct

struct是值类型,就像intbool和其他类型一样。

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

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

  • 在C#中,无法为结构体定义无参数构造函数。

  • 最好将struct定义为不可变类型,并且没有属性设置器。通过创建可变的结构体,可能会遇到真正的麻烦。

关于struct的其他规则可以在 Microsoft 文档中找到。

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


26

7年后,现在可以做到这一点了。

  • 安装.NET Core 3.0,其中包括C# 8。
  • 将语言版本设置为8.0:<LangVersion>8.0</LangVersion>添加到你的.csproj文件中。
  • 添加属性<NullableReferenceTypes>true</NullableReferenceTypes>(到你的.csproj文件中)

有关如何编写代码以及如何影响您现有代码的更多详细信息,请参见此处:

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


1
注意:这只是意图,编译器并不强制要求非空的事物永远不为空,它只会在每个可能将 null 放入非空对象的地方发出警告。 - Andrew Hill
3
如果该链接失效,您需要添加以下代码到您的.csproj文件中以启用可空引用类型:<LangVersion>8.0</LangVersion> <NullableReferenceTypes>true</NullableReferenceTypes> - deadlydog

14
你可以定义一个 struct

A struct type is a value type that is typically used to encapsulate small groups of related variables, such as the coordinates of a rectangle or the characteristics of an item in an inventory. The following example shows a simple struct declaration:

public struct Book
{
    public decimal price;
    public string title;
    public string author;
}
然而,您不能像为 System.Int32 定义 int 别名一样,需要使用完整名称 MyNamespace.Book(或使用 using MyNamespace; 后的 Book)来引用您的结构体。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接