2016-01-28 47 views
0

我想要一个类,它将所有“允许的语言”存储在列表中。代码方应该能够修改列表。但在第一次使用时,列表应该用一些默认值“初始化”。使用默认值初始化列表

我有下面的类:

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

+4

哪里有列表被初始化/创建。 – ckv

回答

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"); 
     //... 
    } 
} 
0

你应该与List<string>第一新实例初始化AllowedLanguages。您可以使用c# 6.0中的initializers for auto-propertiesc#的旧版本的静态构造函数。

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" }; 
3

你可以让你的静态构造函数为好,但我更喜欢懒加载。通过这种方式,每当ApiLanguages创建对象时,您都不会一次又一次地填充列表,

public class ApiLanguages 
{ 
    private static IEnumerable<string> _allowedLanguages; 
    public static IEnumerable<string> AllowedLanguages 
    { 
     get 
     { 
      return _allowedLangues ?? (_allowedLangues = new List<string>{ "EN", "AR"}); 
     } 
    }  
}