使用默认值初始化列表

本文关键字:列表 初始化 默认值 | 更新日期: 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" };