【问题标题】:What's the proper way to store and retrieve Application settings?存储和检索应用程序设置的正确方法是什么?
【发布时间】:2012-08-17 13:53:36
【问题描述】:

我主要是 C# .NET 4.0 开发人员,现在我正在重新考虑过去存储和检索应用程序设置的方法。

在过去,我使用过多种方法,从带有制表符分隔键/值的简单“平面”文本文件到分层 XML 文件,以及介于两者之间的其他一些方法。我过去使用过(并且正在考虑再次使用)内置的 App.Config/AppSettings 类,但是没有任何内置方法可以保存您从该源加载的数据(我可以进入我在这样做时遇到的困难,但这不是问题的重点)。

这里的重点是,所有这些方法都有其缺点,虽然有些方法比其他方法效果更好,但有些方法比其他方法更易于使用,我正在努力确定一些一致且可靠的方法。

我的问题可能有几个有效的答案,所以我将不得不选择最好的一个,是这样的:如果有任何内置框架会“你”推荐用于保存和加载数据的输入和输出,该怎么办?可以伴随可执行文件的设置文件,或者如果不是内置框架,您会推荐什么标准? XML? “平面”文件?独立数据库?

假设配置本身不会那么大,并且任何实际数量的数据都将从数据库中读取(或使用其他技术)。

【问题讨论】:

  • 好问题,但我认为这是非常个人化的我喜欢 kernel32 WritePrivateProfileString,我强烈认为在简单性和速度方面没有什么能比它更好,如果你愿意,我可以为 C# 提供接口 [是的,我m 不投票结束]
  • 虽然这作为一个问题确实有一些优点,但您已经建议自己没有“正确”的答案。我也不清楚app.config 方法的问题是什么(您肯定确实将加载的数据保存回app.config?)。你能扩展一下吗?
  • 当然,丹;我现在遇到的问题是我的 AppSettings 字典是只读的,因此我无法删除/添加项目出/回。我可以考虑的唯一方法是将我的应用设置保存回文件,是通过重写整个文件,我不是特别热衷于追求。没有“正确”的答案,因为这是关于什么是“最佳”解决方案的意见问题,但有很多潜在的“有效”答案。我只是在寻找最可靠、功能最齐全的方法来执行任务。感谢您的 cmets。

标签: c# settings storage appsettings


【解决方案1】:

虽然我是一个注册表爱好者,但我宁愿在那里有我的设置,但我的 c# 应用程序使用了内置的设置 - 所以在项目属性下你可以定义一个负载及其默认值,然后访问他们与

Properties.Settings.Default.<settingname>

也可以设置,所以Properties.Settings.Default.HideDisabled = true;

你可以用

保存它们
Properties.Settings.Default.Save();

我没有遇到过这个问题,但是,正如你所说,一切都有优点和缺点。

【讨论】:

  • 这是迄今为止最好和最方便的存储用户设置的方式,恕我直言。
  • (无法编辑我之前的评论)我的意思是说应用程序设置,而不是用户设置,当然。
  • 这似乎是一种合理的追求方法,但我过去没有使用过。我想知道您能否指出我使用“Hello World”之类的东西?
  • 没关系;弄清楚了。我会为我目前的项目试一试。感谢您的建议。
  • 我想说的是:项目属性,设置你想要的,我已经展示了如何读取它们,如何设置它们以及如何保存它们:) 很高兴你让它工作了。跨度>
【解决方案2】:

只是另一种方式(kernel32),它与 C# 甚至 C# 4.0 无关,但由于我们已经开始列出变体,它必须在这里有效

namespace Ini {
    public class IniFile {
        private string path;
        [DllImport("kernel32")]
        private static extern long WritePrivateProfileString(string section,
            string key, string val, string filePath);
        [DllImport("kernel32")]
        private static extern int GetPrivateProfileString(string section,
                    string key, string def, StringBuilder retVal,
            int size, string filePath);
        public IniFile(string INIPath) {
            path = INIPath;
            }
        public void IniWriteValue(string Section, string Key, string Value) {
            WritePrivateProfileString(Section, Key, Value, this.path);
            }
        public string IniReadValue(string Section, string Key) {
            StringBuilder temp = new StringBuilder(255);
            int i = GetPrivateProfileString(Section, Key, "", temp,
                                            255, this.path);
            return temp.ToString();
            }
        }
    }

【讨论】:

    【解决方案3】:

    我处理过的一些应用程序涉及本地数据库,我们也使用该数据库文件来保存我们的设置。它可以工作,但是感觉有点不对劲,如果您希望在应用程序未运行时能够修改设置,这可能是个问题。 (绕过崩溃或类似情况。)

    大多数情况下,我只会使用存储在 Environment.SpecialFolder.ApplicationData 文件夹中的 XML 文件并使用 DataContractSerializer。它允许您进行一些版本控制,但最重要的是,当您的设置对象上的某些属性是新的或不存在时,它能够加载和保存 XML 文件。它不会使应用程序崩溃,当您再次保存设置时,它只会保存最新版本。我认为它干净、简单、简单。

    【讨论】:

      猜你喜欢
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      • 1970-01-01
      • 2015-11-16
      相关资源
      最近更新 更多