C# 什么';存储和检索应用程序设置的正确方法是什么?

C# 什么';存储和检索应用程序设置的正确方法是什么?,c#,settings,storage,appsettings,C#,Settings,Storage,Appsettings,我主要是一名C#.NET 4.0开发人员,现在我正在重新考虑过去存储和检索应用程序设置的方法 在过去,我使用了多种方法,从带有制表符分隔键/值的简单“平面”文本文件到分层XML文件,以及介于两者之间的其他一些方法。我在过去使用过(并且正在考虑再次使用)内置的App.Config/AppSettings类,但是没有任何内置的方法来保存从该源加载的数据(我可能会遇到这样做的困难,但这不是问题的重点) 这里的要点是,所有这些方法都有它们的缺点,虽然有些方法比其他方法更有效,但有些方法比其他方法更易于使

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

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

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

我的问题可能会有一些有效的答案,因此我不得不选择最好的一个。我的问题是:如果“您”推荐任何内置框架在可执行文件的设置文件中保存和加载数据,或者如果不是内置框架,您会推荐什么标准?XML?“平面文件?独立数据库


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

当我是一个注册表迷时,我更愿意在那里设置我的设置,在我的c#apps中,我使用了内置的设置,因此在“项目属性”下可以定义加载,和它们的默认值,然后使用

Properties.Settings.Default.<settingname>
我对此没有异议,但正如你所说,每件事都有正反两面。

只是另一种方式(内核32),它与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();
            }
        }
    }

我开发的一些应用程序涉及本地数据库,我们也使用该数据库文件保存设置。它可以工作,但感觉有些不对劲,如果您想在应用程序未运行时修改设置,则可能会出现问题。(避开碰撞或类似情况。)


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

问得好,但我觉得它非常个人化我喜欢kernel32 WritePrivateProfileString,我强烈认为在简单性、稳定性和速度方面没有什么能打败它,我可以为C提供接口,如果你喜欢[是的,我不会投票关闭],而这确实是一个有价值的问题,你暗示自己没有“正确”的答案。我也不清楚
app.config
方法的问题是什么(当然,您会将加载的数据保存回
app.config
?)。你能详细介绍一下吗?当然可以,丹;我现在遇到的问题是,我的AppSettings字典是只读的,因此我无法删除/添加项目/返回。我唯一能想到的是,我可以把我的应用程序设置保存到文件中,是通过重新编写整个文件,这不是我特别关注的。没有“正确”的答案,因为这是一个关于什么是“最佳”解决方案的意见问题,但是有很多潜在的“有效”答案。我只是在寻找最可靠、功能齐全的方法来执行任务。谢谢你的评论。这是迄今为止存储用户设置的最好和最方便的方法,IMHO。(无法编辑我以前的评论)我的意思是说应用程序设置,当然不是用户设置。这似乎是一种合理的方法,但我过去没有用过。我想知道你是否能给我指一个“你好世界”之类的名字来使用这个;我明白了。我将为我当前的项目尝试一下。谢谢你的建议。我要说的是,如前所述:项目属性,设置你想要的,我演示了如何读取它们,如何设置它们,以及如何保存它们:)很高兴你能工作。
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();
            }
        }
    }