Winforms:在整个应用程序中访问类属性

标签 winforms singleton global-variables

我知道这一定是一个古老而令人厌烦的问题,但我似乎无法通过我可信赖的 friend (又名 Google)找到任何东西。

我有一个 .net 3.5 c# winforms 应用程序,它在应用程序启动时向用户显示一个登录表单。成功登录后,我想运行到数据库,提取一些特定于用户的数据并将它们(在属性中)保存在名为 AppCurrentUser.cs 的类中,此后可以跨所有访问程序集中的类——这里的目的是我可以用一次性数据读取来填充一些属性,而不是每次需要时都调用数据库。在 Web 应用程序中,我通常会使用 Session 变量,而且我知道 WinForms 中不存在这个概念。

类结构如下所示:

public class AppCurrentUser {

    public AppCurrentUser() { }

    public Guid UserName { get; set; }
    public List<string> Roles { get; set; }
    public string Firstname { get; set; }
    public string Lastname { get; set; }
} 

现在,我有一些选项需要专家的建议:

作为一个“愚蠢”的类,我应该使属性成为非静态的,实例化类然后设置属性......但是我将只能从创建它的类中访问该实例,对吧?

从逻辑上讲,我认为这些属性应该是静态的,因为我只会在整个应用程序中使用该类一次(并且不会创建它的新实例),并且它的属性值将在应用程序关闭时“重置”。 (如果我创建它的一个实例,我可以在应用程序关闭时处理它)

我应该如何构造我的类以及如何在程序集中的所有类中访问它的属性?我真的很感激你对此的诚实和宝贵的建议!!

谢谢!

最佳答案

这里使用单例模式:

public class AppUser
{
    private static _current = null;
    public static AppUser Current
    {
        get { return = _current; }
    }

    public static void Init()
    {
        if (_current == null)
        {
            _current = new AppUser();
            // Load everything from the DB.
            // Name = Dd.GetName();
        }
    }

    public string Name { get; private set; }
}

// App startup.
AppUser.Init();

// Now any form / class / whatever can simply do:
var name = AppUser.Current.Name;

现在“静态”的东西是线程不安全的。我将把它留作读者的练习,以弄清楚如何正确使用 lock() 语法来使其线程安全。如果在调用 Init 之前访问 Current 属性,您还应该处理这种情况。

关于Winforms:在整个应用程序中访问类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1257677/

相关文章:

c# - 如何让控件重绘 Windows 窗体?

c# - 底层表单消失但仅当对话框显示时

winforms - 如何为 Winforms ListView 控件的标题区域显示工具提示?

c# - 发布版本中 visual studio 2010 中的核心转储

java - 从 Java 访问 scala.None

python - Python 中的全局名称未定义错误

c++ - 为什么 Singleton 是比 Global Objects 更好的选择

java - 这是内存泄漏吗?

json - Swift 从函数完成中获取值并将其设置为全局变量

android - 单击按钮设置全局变量值