使用默认值初始化列表
本文关键字:列表 初始化 默认值 | 更新日期: 2023-09-27 18:32:20
我想要一个类,将所有"允许的语言"存储在一个列表中。代码方应该能够修改列表。但是在第一次使用时,应该使用一些默认值"初始化"列表。
我有以下课程:
public class ApiLanguages
{
public static List<string> AllowedLanguages { get; set; }
public ApiLanguages()
{
AllowedLanguages.Add("de");
//AllowedLanguages.Add("en");
//AllowedLanguages.Add("es");
//AllowedLanguages.Add("fr");
//AllowedLanguages.Add("it");
}
}
当我现在在代码中访问该类时
foreach (var language in ApiLanguages.AllowedLanguages)
{
// do something here...
}
ApiLanguages.AllowedLanguages
为空。但我期待一个条目("de")。我在这里做错了什么?
public ApiLanguages()
是一个实例构造函数。它仅在您创建ApiLanguages
的新实例(通过 new ApiLanguages()
)时运行(并且每次)。其目的是初始化实例变量,而不是静态变量。通常不应初始化实例构造函数中的静态属性或字段。
您需要使用静态构造函数来初始化静态列表,如下所示:
public class ApiLanguages
{
public static List<string> AllowedLanguages { get; set; }
static ApiLanguages()
{
AllowedLanguages = new List<string>();
AllowedLanguages.Add("de");
//...
}
}
你也可以让你的构造函数静态,但我更喜欢延迟加载。这样,您将不会在创建ApiLanguages的对象时一次又一次地填充列表,
public class ApiLanguages
{
private static IEnumerable<string> _allowedLanguages;
public static IEnumerable<string> AllowedLanguages
{
get
{
return _allowedLangues ?? (_allowedLangues = new List<string>{ "EN", "AR"});
}
}
}
您应该首先使用List<string>
的新实例初始化AllowedLanguages
。您可以使用 c# 6.0
中自动属性的初始值设定项或在旧版本的 c#
的静态构造函数中执行此操作。
public class ApiLanguages
{
// c# 6.0 syntax
public static List<string> AllowedLanguages { get; set; } = new List<string>();
static ApiLanguages()
{
// c# < 6.0 (old style) syntax
AllowedLanguages = new List<string>();
}
public ApiLanguages()
{
AllowedLanguages.Add("de");
}
}
另外,我确定您无需将新值添加到 ApiLanguages 类的每个实例的列表中,那么您也应该AllowedLanguages.Add(...)
移动到静态构造函数。您可以将对象创建和初始化加入到一行代码中:
public static List<string> AllowedLanguages { get; set; } = new List<string>() { "de", "en", "ru" };