返回空数组而不是null

时间:2017-05-04 11:33:31

标签: c#

我创建了Settings类,用于通过.ini文件编辑我的应用程序。我的Settings.ini文件如下所示:

[ACCOUNT]
login=xyz
password=xyz
locations=1,2,5,8

现在我正在获得这样的值:

class Settings {
    public static IniFile Config = new IniFile(Directory.GetCurrentDirectory() + @"\Settings.ini");
    public static string Login { get { return Config.Read("login", "ACCOUNT"); } set { Config.Write("login", "ACCOUNT"); } }
    public static string Password { get { return Config.Read("password", "ACCOUNT"); } set { Config.Write("password", "ACCOUNT"); } }
    public static int[] Locations { get { return Array.ConvertAll(Config.Read("locations", "ACCOUNT").Split(','), s => int.Parse(s)); } set { Config.Write("locations", "ACCOUNT"); } }
}

问题是,当我的Settings.ini文件有空位置时:

locations=

我的变量Settings.Locations返回null而不是空数组。我尝试过这样的事情:

public static int[] Locations 
{ 
    get { return new int[] {Array.ConvertAll(Config.Read("locations", "ACCOUNT").Split(','), s => int.Parse(s))}; } 
    set { Config.Write("locations", "ACCOUNT"); } 
}

但这不起作用。我不能将int []转换为int。你有什么想法我怎么能返回空阵列?

2 个答案:

答案 0 :(得分:9)

您可以这样明确地执行此操作:

public static int[] Locations
{
    get
    {
        string locations = Config.Read("locations", "ACCOUNT");
        if (locations == null)
        {
            return new int[0];
        }
        return locations
                .Split(',')         // split the locations separated by a comma
                .Select(int.Parse)  // transform each string into the corresponding integer
                .ToArray();         // put the resulting sequence (IEnumerable<int>) into an array of integers
    }
    set
    {
        Config.Write("locations", "ACCOUNT");
    }
}

答案 1 :(得分:5)

首先,你过多地干扰了一行,所以它很难阅读,更不用说排除故障了。你需要的是这样的:

public static int[] Locations 
{ 
    get 
    { 
        int[] values = Array.ConvertAll(Config.Read("locations", "ACCOUNT").Split(','), 
            s => int.Parse(s)) ?? new int[] { };
        return values; 
    } 
    set 
    { 
        Config.Write("locations", "ACCOUNT"); 
    } 
}

注意我已将?? new int[] { }添加到第一个语句的末尾,称为the null coalescing operator。如果另一个数组为空,它将返回一个空数组。

这是一个偏好问题,但我将getter分成两行的原因是我可以在它返回之前调试和中断以观察返回值。您也可以在最后一个括号中断,并在Locals窗口中观察返回值。