繁体   English   中英

.NET 6.0 中的空行为

[英]Null behavior in .NET 6.0

我想知道处理我在 .net 6.0 项目中的 VS2022 中看到的警告的正确方法。 我在一个单独的方法中完成了一个类的初始化,即不直接在构造函数中。 但我收到一条警告:退出构造函数时,不可为空的字段“名称”必须包含非空值。 考虑将该字段声明为可为空。

我不希望 Name 字段可以为空,换句话说,此类的实例应该始终具有 Name 的值。 Init() 方法从两个构造函数中调用并设置这个值。 如果有帮助,警告编号是 CS8618。

似乎有不止一种解决方案,但是摆脱这个警告的正确方法是什么? 我想避免在我的代码中出现#pragma ignore warning ugliness,所以我不会认为这对我来说是一个有效的解决方案。

class ClassA {
  public string Name;

  public ClassA(int i) { 
    Init(i.ToString());
  }
  public ClassA(string s) {
    Init(s);
  }
  private void Init(string id) {
     Name = id;
     //lots of other stuff happening in this method
  } 
}

您还可以为您的属性使用get-only-property property。

public class ClassA
{
    public string Name { get; }

    public ClassA(int i)
    {
        Name = i.ToString();
    }
    public ClassA(string s)
    {
        Name = s ?? string.Empty;
    }
}

尽可能不要忽略可空性警告。 在这种特殊情况下,您可以使用MemberNotNullAttribute来帮助编译器:

指定方法或属性将确保列出的字段和属性成员具有不为null的值。

public class ClassA
{
    public string Name;

    public ClassA(int i)
    {
        Init(i.ToString());
    }

    public ClassA(string s)
    {
        Init(s);
    }

    [MemberNotNull(nameof(Name))]
    private void Init(string id)
    {
        Name = id;
    }
}

有关其他有用的可空性分析属性 - 请参阅此文档

或使用@Panagiotis Kanavos在评论中建议的方法 - 使用构造函数链接:

public class ClassA
{
    public string Name;

    public ClassA(int i) : this(i.ToString())
    {
    }

    public ClassA(string s)
    {
        Name = s;
    }
}

另请注意,通常建议将字段封装到属性中。

既然只设置了一个值,为什么不在构造函数中设置呢? 无论如何,解决方案很简单。 提供一个默认值。

选项 1

public string Name { get; set; } = string.Empty;

选项 2

private string _name = String.Empty;

public string Name
{ 
    get { return _name; }
    set { _name = value; }
}

选项 3

private string _name = String.Empty;

public string Name
{ 
    get => _name;
    set => _name = value;
}

根据Nullable 引用类型

在 C# 8.0 之前,所有引用类型都可以为空。

根据C# 类型的默认值(C# 参考)

在此处输入图像描述

并根据参考类型(C#参考)

C# 还提供以下内置引用类型:

在 .NET Framework 4.8 中,允许执行以下操作:

public string Name { get; set; } = null;

但是,在 .NET 6 中,这会导致以下警告: warning CS8625: Cannot convert null literal to non-nullable reference type.

在 .NET 6 中,需要指定一个默认(非空)值 - 可以使用String.Empty

public string Name { get; set; } = string.Empty;

在 .NET 6 中,如果希望允许String为空值,请执行以下操作:

public string? Name { get; set; } = null;

资源

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM