C# 8 不可空引用和隐式使用
C# 8 non nullable references and implicit usage
在 Resharper 和 Rider 中,有 Jetbrains.Annotations 属性可以应用于隐式使用的类型和字段。
例如如果您定义某种数据 contract/DTO,您可以用 [UsedImplicitly]
修饰它,Resharper 将知道不要将此字段标记为未使用。
但是,在 C# 8 中,如果您使用 Nullable Ref Types 功能。
如果您未明确将这些字段设置为非空值,则此类任何不可空字段将被标记为 "Never initialized"。
有什么方法可以告诉 C#8 编译器 "hey, ignore this, just trust me on this one" 吗?
例如
假设我们有这样的请求消息,它可能被传递到 ASP.NET 端点或类似的端点。
class LoginRequest
{
public string UserName {get; set;}
}
编译器会抱怨 UserName 从未被初始化,这不是因为它是由 Web 客户端初始化的。例如SPA 应用程序。
抑制此类警告的正确方法是什么?
您可以在上下文中使用 #nullable disable
。
您可以使用标记为非空的 null
值对其进行初始化:
public string UserName { get; set; } = null!;
乍一看这似乎很奇怪,但它是一种非常简单的声明方式,可以声明某些东西在技术上可能 null
短时间,但已知在实际使用时不会。
在 Resharper 和 Rider 中,有 Jetbrains.Annotations 属性可以应用于隐式使用的类型和字段。
例如如果您定义某种数据 contract/DTO,您可以用 [UsedImplicitly]
修饰它,Resharper 将知道不要将此字段标记为未使用。
但是,在 C# 8 中,如果您使用 Nullable Ref Types 功能。 如果您未明确将这些字段设置为非空值,则此类任何不可空字段将被标记为 "Never initialized"。
有什么方法可以告诉 C#8 编译器 "hey, ignore this, just trust me on this one" 吗?
例如 假设我们有这样的请求消息,它可能被传递到 ASP.NET 端点或类似的端点。
class LoginRequest
{
public string UserName {get; set;}
}
编译器会抱怨 UserName 从未被初始化,这不是因为它是由 Web 客户端初始化的。例如SPA 应用程序。
抑制此类警告的正确方法是什么?
您可以在上下文中使用 #nullable disable
。
您可以使用标记为非空的 null
值对其进行初始化:
public string UserName { get; set; } = null!;
乍一看这似乎很奇怪,但它是一种非常简单的声明方式,可以声明某些东西在技术上可能 null
短时间,但已知在实际使用时不会。