我应该使用变量还是用户设置?

时间:2015-03-02 18:59:53

标签: c# settings.settings settings

我有一个程序,它有一些重要的变量。从本质上讲,这些整数将经常变化(对于某些人来说可能少于每秒)。但所有费率都不同。

我需要将它们全部保存在程序的运行之间,因此当然会将它们存储为用户设置。不过我的问题是,我不知道哪个更好。我不知道第一次调用save()方法的频率,但我想每十秒一次?

考虑到这一点,我是否将这些整数的所有工作作为变量执行,并不断将值复制到用户设置?或者我应该直接从设置中工作,直接修改它们并只是按下save()方法?

添加示例....

让我们说我在设置中有10个设置。这些设置会有很多用处。 set01 - set10 for now。

我将不断编辑这些值,并大约每十秒钟保存一次。

当我递增值时,我应该选择a:

Properties.Settings.Default.set01 += 500;
Properties.Settings.Default.set02 += 400;
...

^以这样的方式使用它们,它们可以在十秒内多次更新,然后点击

Properties.Settings.Default.Save();

每十秒......或者......

我应该从设置中获取值:

int set01 = Properties.Settings.Default.set01;    
set01 += 500;

然后在十秒内重复这样的行动......然后:

Properties.Settings.Default.set01 = set01;
Properties.Settings.Default.Save();

基本上......使用设置直接工作会更容易,但这样做会有缺点吗?这样做在技术上是不正确的吗?性能会明显受损吗?

2 个答案:

答案 0 :(得分:2)

啊,牦牛剃须多么美好的一天!

我建议您创建并使用一个中心对象,将这些变量公开为属性,因此所有代码库都使用该对象的属性。 (另外,我 使这个对象成为一个全局变量,我会确保将它明确地传递给真正需要它的每个地方,但那只是我。)< / p>

然后,您可以选择如何实现这些属性:要么将它们缓存在成员变量中,只保存很少,要么始终加载和保存。

现在,最初,您将提供最简单的实现,即让每个getter在现场加载用户设置,每个setter在现场保存用户设置,完全无视走向绩效。因此,我的建议是将它们编码为这样并忘记它们,直到产品完成并且几乎准备好发货。

然后,在发货之前,使用分析器查看是否所有这些保存代表任何重大开销,如果是,那么然后才会优化该位置。我的猜测:你不需要或不必。其他问题将优先考虑。

任何偏离上述行为的行为都是Yak Shaving

答案 1 :(得分:-1)

如果您看到配置文件对性能产生影响,则可以使用注册表。对于重复读取和写入,注册表的速度要快几个数量级,并且具有相同的持久性保证。

注册表不需要单独的保存调用,并且绝对可以在每个set上更新,并在每个get上阅读。当然,您可以在应用程序的生命周期内保持密钥开放。建议使用包装类来隐藏调用代码的实际持久性。

// pseudo code, since I don't have MSDN open right now...
using (var regKey = RegistryHive.CurrentUser.OpenKey("Software\\MyApp"))
{
    int myValue = (int)regKey.GetValue("foo", RegKeyValueType.Dword, /* default: */ 0);
    return myValue;
}

我还要注意,频繁写入.net配置文件会增加文件损坏的可能性。除非明确处理,否则损坏的配置文件将导致在.Net 2上打开应用程序时出现硬崩溃。我不确定更高版本,但我们接到3-4次调用,用户无法打开应用程序,因为计算机在执行期间断电写信,或者有人在完美的时间杀死了这个过程。

我同样不确定.Net如何处理Save上的共享违规,但我猜它只会引发IOException。如果同时写入配置文件,则运行应用程序的多个副本可能会很复杂。