我希望有一个课程,可以存储所有允许使用的语言"在列表中。代码方应该能够修改列表。但在第一次使用时,列表应该是"初始化"有一些默认值。
我有以下课程:
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
为空。但我希望有一个条目(&#34; de&#34;)。我在这里做错了什么?
答案 0 :(得分:5)
public ApiLanguages()
是一个实例构造函数。当您创建ApiLanguages
的新实例(通过new ApiLanguages()
)时,它仅运行(并且每次都运行)。它的目的是初始化实例变量,而不是静态变量。通常不应该在实例构造函数中初始化静态属性或字段。
您需要使用静态构造函数来初始化静态列表,如下所示:
public class ApiLanguages
{
public static List<string> AllowedLanguages { get; set; }
static ApiLanguages()
{
AllowedLanguages = new List<string>();
AllowedLanguages.Add("de");
//...
}
}
答案 1 :(得分:3)
您也可以将构造函数设置为静态,但我更喜欢延迟加载。这样,无论何时创建ApiLanguages对象
,都不会一次又一次地填充列表public class ApiLanguages
{
private static IEnumerable<string> _allowedLanguages;
public static IEnumerable<string> AllowedLanguages
{
get
{
return _allowedLangues ?? (_allowedLangues = new List<string>{ "EN", "AR"});
}
}
}
答案 2 :(得分:1)
您应首先使用AllowedLanguages
的新实例初始化List<string>
。您可以使用c# 6.0
中的initializers for auto-properties或旧版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" };