C#新版本中string与string?的区别及使用场景解惑
C#中
string与string?的核心差异 1. 编译时语义与检查逻辑
string:当项目启用**可为空引用类型(Nullable Reference Types)**时,编译器将其视为非空引用类型。默认不允许直接赋值null,若未初始化就使用或赋值null,会触发编译警告,强制开发者保证变量非空。string?:明确标记为可为空引用类型,编译器允许其被赋值为null,同时会在你使用该变量时,提示必须做空值检查(比如name?.Length或if (name != null)),避免潜在的NullReferenceException。
2. 运行时行为
两者在运行时完全没有区别——string本身就是引用类型,运行时原本就可以为null。可为空引用类型只是编译阶段的静态分析机制,不会改变类型的运行时本质。
示例代码的具体判断
方法参数string? name
是否加?取决于业务逻辑:
- 如果允许调用方传入
null(比如该参数是可选的,无值时传null),必须用string?,既明确告知编译器和其他开发者参数可空,也能借助编译器强制你在方法内部做空值校验。 - 如果业务要求参数必须是非空字符串,就用
string,此时调用方传入null会触发编译警告,你在方法内可安全使用该参数,无需额外空检。
字典值类型string?
同样看业务场景:
- 如果字典中部分键对应的值允许为
null(比如用null表示“无对应值”),就用string?,明确声明值的可空性,编译器会提醒你取值时做空值判断。 - 如果字典的所有值都必须是非空字符串,就用
string,避免意外存入null值。
内容的提问来源于stack exchange,提问作者Pradeep Kumar
相关产品推荐
相关产品推荐

