C# 解决警告编译“CS8618”的最佳方法是什么

问题描述 投票:0回答:1

如果我们这样声明财产:

public class Cat
{
    public string Name { get; set; }
}

我们收到警告编译:

CS8618 - 不可空变量必须包含非空值 退出构造函数。考虑将其声明为可为空。

因为

Name
属性未初始化。

想象一下,这是强制性属性(业务规则是这么说的)。我们可以尝试通过多种方式来解决:

  1. 构造函数声明:

a) 直接导演:

public class Cat
{
    public Cat()
    {
        Name = string.Empty;
    }
    public string Name { get; set; }
}

b) 在财产方面:

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

确实,这两个选项是相同的(语法糖)。

优点:我们可以像

Cat cat = new ();

一样使用类的init

缺点:属性在创建对象时由“虚拟”值初始化,并将被重写。或者(更主要)不会因某些未知原因而被重写(例如,我们使用自动映射器,并且源对象的该字段为空值,或者我们忘记映射该字段),并且结果对象将具有无效值(通过业务规则属性可以不能为空,猫必须有名字)

  1. 将字段声明为可为空:
公开课猫
{
    公共字符串?名称{获取;放; }
}

对我来说,这是无效的方法(尽管它被描述为here作为替代方案),我们的业务规则说,

Name
是强制性的,如果没有这个属性,模型就不会有效(所以,在最好的条件下,它不应该甚至被创造)

  1. 使用
    required
    关键字:
公开课猫
{
    公共必需的字符串名称 { get;放; }
}

所以,它看起来是最好的(没有

Name
字段的显式初始化就无法创建类),但只是乍一看,因为它也是“语法糖”,仅用于编译。因此,当我们使用自动映射器映射属性时,我们面临同样的问题:可以在没有此属性的情况下映射对象(或使用源对象中的 null 值)。

因此,所有这些方法都只能掩盖问题(避免警告编译):可以使用假(默认)值创建对象!

有什么办法可以解决这个问题吗?

谢谢

c# .net compiler-warnings required c#-12.0
1个回答
0
投票

如果属性不能为空,只需将其放入构造函数中,这样就不会出现警告并且必须使用有效值初始化类。

public class Cat
{
    public Cat(string name)
    {
        Name = name;
    }
    public string Name { get; set; }
}
© www.soinside.com 2019 - 2024. All rights reserved.