使用默认值初始化列表

时间:2016-01-28 12:31:01

标签: c#

我希望有一个课程,可以存储所有允许使用的语言"在列表中。代码方应该能够修改列表。但在第一次使用时,列表应该是"初始化"有一些默认值。

我有以下课程:

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;)。我在这里做错了什么?

3 个答案:

答案 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" };