【问题标题】:What is different between "string" and "string?" in new version of c#?我应该在 C# 中使用“字符串吗?”?
【发布时间】:2022-10-14 22:31:02
【问题描述】:

String 已经可以为空。我们应该使用string? 吗?

例如:

public class ClassA
{
                 // should we use here?
   public void Method(string? name)
   {
                        // should we use here?
      var dic = new Dictionary<string,string?>();
      // logic here
   }
}

重构工具进行了这些更改。

【问题讨论】:

  • ……反对?
  • 你为什么要..?
  • String 已经可以为空”-不,不是(除非您禁用了 NRT)。 String 不可为空,String? 可空。使用 String 参数时,您还应该添加一个前提条件:if( name is null ) throw new ArgumentNullException(nameof(name)); 或使用 !!,如果您使用的是 .NET 7。
  • 您的 .csproj 项目中有 &lt;Nullable&gt;enable&lt;/Nullable&gt; 吗?

标签: c# string


【解决方案1】:

关于如何使用可为空的引用类型的问题似乎以前会被问过,但我在 stackoverflow 上找不到一个好的现有答案来引用。


什么是可为空的引用类型?

添加了可空引用类型以帮助避免空引用异常。与可空值类型不同,这些完全是“编译时”分析。这一点很重要,因为可空引用类型的type 与它所引用的类型相同,例如stringstring?。这与intint? 是不同类型的值类型不同(分别为System.Int32Nullable&lt;System.Int32&gt;)。

什么时候应该使用可为空的引用类型?

当您想要静态代码分析来帮助避免空引用异常时。如果您使用“标准”引用类型,则不会有运行时差异,因为分析仅在编译时执行(或者当您在 Visual Studio 中编写代码时)。

如何启用可为空的引用类型?

自 C#8.0 起,可空引用类型可用。

这些可以通过将以下内容添加到您的 .csproj 文件来启用:

<Nullable>enable</Nullable>

从 .NET 6 开始,新的 Visual Studio 项目在所有项目模板中都包含 &lt;Nullable&gt;enable&lt;/Nullable&gt; 元素。


有关详细信息,请参阅the documentation

【讨论】:

  • 作为社区 wiki 发布,我可能弄错了一些技术细节,我没有附加任何内容,请在您认为合适的情况下进行改进!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-12
  • 2021-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多