我有这个项目:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.0</TargetFramework>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Hosting" Version="3.0.1" />
</ItemGroup>
</Project>
这是主类:
namespace CSharp8
{
using System;
using Microsoft.Extensions.Configuration;
internal class Program
{
private static void Main()
{
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", false, true)
.Build();
var appSettings = configuration.Get<AppSettings>();
}
public class AppSettings
{
public string SourceServer { get; set; }
public string TargetServer { get; set; }
}
}
}
这是appsettings.json文件:
{
"SourceServer": "prodtools",
"TargetServer": "qatools"
}
在AppSettings属性上,我收到了以下警告:
我可以通过不同的方式来解决这个问题。警告 CS8618 非可空属性“SourceServer”未初始化。 考虑将该属性声明为可空。
1.
public class AppSettings
{
#pragma warning disable CS8618 // Non-nullable field is uninitialized. Consider declaring as nullable.
public string SourceServer { get; set; }
public string TargetServer { get; set; }
#pragma warning restore CS8618 // Non-nullable field is uninitialized. Consider declaring as nullable.
}
我不喜欢这个,因为我认为规则必须在整个项目中保持一致。
2. (待翻译)
public class AppSettings
{
public string SourceServer { get; set; } = "";
public string TargetServer { get; set; } = "";
}
我不喜欢这个,因为空字符串是错误的值。属性似乎被初始化了,但是值是没有意义的,如果我没有正确地初始化它们,它们将破坏我的程序。
3.
public class AppSettings
{
public string SourceServer { get; set; } = null!;
public string TargetServer { get; set; } = null!;
}
这是有道理的,实例被创建时是空值,但这些值会立即初始化。但我无法确保这段代码在将来不会出现问题,因为属性是非空的。
4.
public class AppSettings
{
public string? SourceServer { get; set; }
public string? TargetServer { get; set; }
}
这也是有道理的。在一微秒内,属性将保持为空。但是在我的程序中它们必须具有一个值。所以我也不喜欢这种方法。
你认为哪种方式更合适呢?还有其他建议吗?谢谢!
更新 现在我更喜欢这个方案。
#nullable disable warnings
public class AppSettings
{
public string SourceServer { get; set; }
public string TargetServer { get; set; }
}
我仍然会在非空属性中得到null值,这是无法避免的,但至少它让我免于写很多无意义的代码,例如 = null!;