[英]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;
}
在 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.