C#默认的bool型都是小写字母,即truefalse,但是bool型默认的ToString()方法生成的字符串会自动将首字母大写。

private static async Task<bool> LoadStartupOnFromSettingsAsync()
{
    bool cacheSetting = false;
    string settingName = await ApplicationData.
                               Current.
                               LocalSettings.
                               ReadAsync<string>(SettingsKey);

    if (!string.IsNullOrEmpty(settingName))
    {
        cacheSetting = settingName == "true";
    }

    return cacheSetting;
}

private static async Task SaveStartupOnInSettingsAsync(bool settings)
{
    await ApplicationData.
          Current.
          LocalSettings.
          SaveAsync(SettingsKey, settings.ToString());
}

上面的两个函数是C#中实现有关存储用户设置和读取用户设置方法的函数。乍一看读取函数好像没有什么问题,逻辑正确,语法也正确。但是当你运行的时候你会发现这个读取函数读出来的结果永远都是false,问题出在哪里呢?这个隐秘的bug就出在这句话上。

cacheSetting = settingName == "true";

这句话里是settingName与bool型的ToString()相比较。而bool型ToString()方法会自动将首字母大写,即true=>Truefalse=>False。所以只要将这句话改为

cacheSetting = settingName == "True";

问题就迎刃而解了。 不明白为什么C#会这样子设计,记录下来下次碰到的时候不要再掉进这个坑里。