类成员定义中的问号(?)代表什么含义?
类成员定义中
?的含义(C# 8.0+) 你说的这个Socket?里的?是可空引用类型的标记,是C# 8.0开始引入的特性,和你熟悉的空值访问运算符?.不是一回事。
简单来说:
- 在启用了可空引用类型的项目里(项目配置中添加
<Nullable>enable</Nullable>),默认所有引用类型(比如Socket、string)会被编译器视为非空——编译器会默认假设这些变量永远不会是null,如果代码逻辑可能让它变为null,就会抛出警告。 - 给引用类型加上
?后,就是明确告诉编译器:这个变量允许被赋值为null。
回到你的例子:
private Socket? newSocket;
这里的Socket?表示newSocket这个成员既可以存储有效的Socket实例,也可以被设为null。后续你使用这个成员时,编译器会基于这个标记提醒你做空值检查(比如用?.或者if (newSocket != null)),避免潜在的空引用异常。
如果没加?,在启用可空引用类型的项目里,编译器会因为你没有初始化这个非空引用类型成员而抛出警告——除非你在构造函数里已经给它赋了有效值。
内容的提问来源于stack exchange,提问作者Gabriele Troviso
相关产品推荐
相关产品推荐

