优化Settings类中的读写操作

时间:2014-10-01 17:29:22

标签: c# .net wpf

使用Properties.Settings.Default非常适合保存UI设置。 我可以直接从任何课程中获取它,但也可以使用它来设置所有内容

FontSize="{Binding Source={x:Static p:Settings.Default}, Path=MyFontSize, Mode=OneWay}"

我害怕做任何事都会让我的节目变慢。

这段代码大约需要500毫秒:

bool b;
for (int i = 0; i < 100000; i++)
  b = Properties.Settings.Default.testbool;

我不知道这是什么类型的对象,但我希望有一种方法可以制作具有类似属性的东西,但更快,我可以在程序结束时将其保存到设置中。

1 个答案:

答案 0 :(得分:2)

免责声明:我不建议您执行以下操作。

如果确实希望提高性能,则可以重定向Settings类的索引器以从字典中读取:

internal sealed partial class Settings
{
    private bool _isLoaded = false; 
    Dictionary<string, object> _tempValues = new Dictionary<string,object>();

    public override object this[string propertyName]
    {
        get
        {
            if (_isLoaded)
            {
                return _tempValues[propertyName];
            }
            else
            {
                return base[propertyName];
            }
        }
        set
        {
            if (_isLoaded)
            {
                _tempValues[propertyName] = value;
            }
            else
            {
                base[propertyName] = value;
            }
        }
    }

    protected override void OnSettingsLoaded(object sender, System.Configuration.SettingsLoadedEventArgs e)
    {
        base.OnSettingsLoaded(sender, e);

        _isLoaded = true;

        foreach (SettingsProperty property in Properties)
        {
            _tempValues[property.Name] = base[property.Name];
        }
    }

    protected override void OnSettingsSaving(object sender, System.ComponentModel.CancelEventArgs e)
    {
        foreach (SettingsProperty property in Properties)
        {
            base[property.Name] = _tempValues[property.Name];
        }

        base.OnSettingsSaving(sender, e);
    }
}

基准代码:

 static void Main(string[] args)
    {
        Stopwatch timer = new Stopwatch();
        timer.Start();

        bool c;

        for (int i = 0; i < 1000000; i++)
        {
            c = Properties.Settings.Default.MyBool;
        }

        timer.Stop();
        Console.WriteLine(timer.ElapsedMilliseconds);
        Console.ReadLine();
    }

之前的时间:1348毫秒

之后的时间:101毫秒