如何在C#多个Form中访问同一类的实例对象?
实现跨Form访问全局对象的几种方法
1. 单例模式(最直接的全局访问方案)
通过单例模式确保类只有一个实例,并提供全局访问入口,任意Form都能直接调用。
示例代码(C#):
public class GlobalData { private static GlobalData _instance; private static readonly object _lock = new object(); // 私有构造函数,禁止外部new private GlobalData() {} // 全局访问的实例属性 public static GlobalData Instance { get { lock (_lock) { _instance ??= new GlobalData(); return _instance; } } } // 自定义共享字段/属性 public string CurrentUserName { get; set; } public int CurrentUserId { get; set; } }
使用方式:在任意Form里直接读写
// 赋值 GlobalData.Instance.CurrentUserName = "张三"; // 读取 labelUser.Text = GlobalData.Instance.CurrentUserName;
2. 在Program类中实例化并传递给窗体
把全局对象放在Program类中作为静态成员,初始化后传递给各个窗体,适合需要明确控制对象生命周期的场景。
示例代码:
Program.cs中:
static class Program { public static GlobalData AppGlobalData; [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); // 初始化全局对象 AppGlobalData = new GlobalData(); AppGlobalData.CurrentUserName = "默认用户"; // 传递给主窗体 Application.Run(new MainForm(AppGlobalData)); } }
主窗体接收并传递给子窗体:
public partial class MainForm : Form { private GlobalData _globalData; public MainForm(GlobalData globalData) { InitializeComponent(); _globalData = globalData; label1.Text = _globalData.CurrentUserName; } private void btnOpenSubForm_Click(object sender, EventArgs e) { // 把全局对象传给子窗体 SubForm subForm = new SubForm(_globalData); subForm.Show(); } }
3. 依赖注入(适用于.NET Core/.NET 5+ WinForms)
如果用的是较新的.NET版本,可借助内置的依赖注入容器注册单例对象,通过构造函数注入到各个窗体,解耦性更强。
示例代码:
Program.cs中:
var builder = WinFormsApp.CreateBuilder(args); // 注册GlobalData为单例 builder.Services.AddSingleton<GlobalData>(); // 注册窗体 builder.Services.AddTransient<MainForm>(); builder.Services.AddTransient<SubForm>(); var app = builder.Build(); app.Run<MainForm>();
窗体中注入使用:
public partial class MainForm : Form { private GlobalData _globalData; // 构造函数注入 public MainForm(GlobalData globalData) { InitializeComponent(); _globalData = globalData; } }
内容的提问来源于stack exchange,提问作者Krzysztof Kulka
相关产品推荐
相关产品推荐

