You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 05:33:27