如何优化Settings窗口初始化?消除_settingsWindow重复调用
简化重复引用控件窗口的几种方案
1. 局部短变量(最直接无额外开销)
把_settingsWindow赋值给一个简短的局部变量,后续用这个变量代替,代码会简洁很多:
var w = _settingsWindow; w.ExePathTextBox.Text = CurrentSettings.ExePath; w.rbSimpleSave.Checked = !CurrentSettings.optSaveUseBrowser; w.rbBrowserSave.Checked = CurrentSettings.optSaveUseBrowser; w.rbPresetAll.Checked = CurrentSettings.PreventPresetCol == PC.Allow; w.rbPresetFolder.Checked = CurrentSettings.PreventPresetCol == PC.Folder; w.rbPresetGlobal.Checked = CurrentSettings.PreventPresetCol == PC.Global; w.rbFolderAll.Checked = CurrentSettings.PreventFolderCol == PC.Allow; w.rbFolderParent.Checked = CurrentSettings.PreventFolderCol == PC.Folder; w.rbFolderGlobal.Checked = CurrentSettings.PreventFolderCol == PC.Global;
这种方式零额外性能开销,代码可读性也不受影响,是最常用的简化手段。
2. 封装到Settings静态类中
既然你的Settings类已经持有了_settingsWindow的引用,可以在类里新增一个方法专门负责把配置值同步到窗口控件,这样调用方只需要一行代码:
首先修改Settings类:
public static class Settings { private static SettingsWindow _settingsWindow = null; public static void Init(SettingsWindow settingsWindow) { _settingsWindow = settingsWindow; } public static void LoadCurrentSettings() { var w = _settingsWindow; w.ExePathTextBox.Text = CurrentSettings.ExePath; w.rbSimpleSave.Checked = !CurrentSettings.optSaveUseBrowser; w.rbBrowserSave.Checked = CurrentSettings.optSaveUseBrowser; w.rbPresetAll.Checked = CurrentSettings.PreventPresetCol == PC.Allow; w.rbPresetFolder.Checked = CurrentSettings.PreventPresetCol == PC.Folder; w.rbPresetGlobal.Checked = CurrentSettings.PreventPresetCol == PC.Global; w.rbFolderAll.Checked = CurrentSettings.PreventFolderCol == PC.Allow; w.rbFolderParent.Checked = CurrentSettings.PreventFolderCol == PC.Folder; w.rbFolderGlobal.Checked = CurrentSettings.PreventFolderCol == PC.Global; } }
然后在原来的方法里只需要调用:
Settings.LoadCurrentSettings();
这种方式还能把配置和窗口控件的绑定逻辑集中管理,后续修改配置项时更方便,也解耦了调用方和窗口控件的直接依赖。
3. 局部using别名(C# 10+,小众选项)
如果使用C# 10及以上版本,可以在方法内声明局部using别名,但这种方式对当前场景来说有点大材小用,不如局部变量直观:
using w = YourNamespace.SettingsWindow; ((w)_settingsWindow).ExePathTextBox.Text = CurrentSettings.ExePath; // 后续同样用((w)_settingsWindow)替代原引用
一般不推荐在这个场景下使用。
不推荐:反射批量赋值
虽然可以通过反射批量完成控件赋值,但会带来性能损耗,代码可读性和可维护性也很差,除非有超大量同类赋值操作,否则完全没必要用。
内容的提问来源于stack exchange,提问作者Steve Stover
相关产品推荐
相关产品推荐

