首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 登錄表持久化用戶設定:極簡泛型封裝與單元測試驗證

     編輯:關於C#

需求:應用啟動時讀取上次保存的視窗可見性設定,關閉時寫入。利用 Microsoft.Win32.Registry 操作 HKCU\Software\RegistryStorage,封裝靜態工具類,附帶單元測試驗證。

核心封裝:RegistryStorage

using Microsoft.Win32;
using System;

namespace Backend {
    public enum PageVisibility { Visible, Hide }

    public static class RegistryStorage {
        private const string SubKeyPath = @"Software\RegistryStorage";
        private const string ValueName = "PageVisibility";

        public static PageVisibility Load() {
            using (var key = Registry.CurrentUser.OpenSubKey(SubKeyPath)) {
                if (key == null) return PageVisibility.Visible;
                var val = key.GetValue(ValueName) as string;
                return Enum.TryParse(val, out PageVisibility pv) ? pv : PageVisibility.Visible;
            }
        }

        public static void Save(PageVisibility visibility) {
            using (var key = Registry.CurrentUser.CreateSubKey(SubKeyPath)) {
                key.SetValue(ValueName, visibility.ToString());
            }
        }
    }
}
  • using 區塊 自動釋放 RegistryKey,無需手動 Close()。
  • Enum.TryParse 安全轉換,防禦注册表被竄改導致的異常。
  • 靜態類 無狀態,線程安全,直接呼叫。

單元測試驗證

using System;
using System.Diagnostics;

namespace Backend.Test {
    class Program {
        static void Main() {
            // 測試 Hide
            RegistryStorage.Save(PageVisibility.Hide);
            Debug.Assert(RegistryStorage.Load() == PageVisibility.Hide);

            // 測試 Visible
            RegistryStorage.Save(PageVisibility.Visible);
            Debug.Assert(RegistryStorage.Load() == PageVisibility.Visible);

            Console.WriteLine("All tests passed. Press any key to exit.");
            Console.ReadKey();
        }
    }
}

Debug.Assert 僅在 Debug 建置生效,Release 自動移除,零性能損耗。

注册表實際結構

注册表截圖

  • 路徑:HKEY_CURRENT_USER\Software\RegistryStorage
  • 值:PageVisibility = "Hide" (REG_SZ)

擴展建議

  • 泛型化:Save<T>(string name, T value) / Load<T>(string name, T defaultValue) 支援任意可序列化類型(JSON 序列化後存字串)。
  • 加密:敏感資料(Token、連接字串)存前加密(DPAPI/AES)。
  • 範圍隔離:依功能模組建立子鍵,避免鍵名衝突。

此模式輕量、無依賴、原生支援,是 WinForms/WPF 桌面應用持久化用戶偏好設定的首選方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved