【问题标题】:Current User Global Variable C# Desktop app当前用户全局变量 C# 桌面应用程序
【发布时间】:2014-05-11 07:03:05
【问题描述】:

我知道您可以在网络应用程序中使用会话变量,但我不知道如何在桌面(Windows 窗体而不是移动 android)中使用一个。

我有一个 Player 类,用于将玩家与 app/SQLDb 中的其他类相关联(他们可能是也可能不是活动用户)。但我想设置一个 CurrentPlayer(实际运行应用程序的人)。

在启动时的 Program 类中,我正在运行检查以查看当前用户是否存在,如果不存在,则将它们添加到 SQLdb。但那时我想为我刚刚添加的用户设置一个应用程序范围的对象。事实上,如果他们不在数据库中,他们就无法运行应用程序。

显然静态不起作用,因为我不想让 Player 类一直是静态的。但我确实需要设置此对象并轻松获取信息。编辑:它不能一直是静态的原因是,在除当前用户之外的所有其他实例中,我绝对希望创建一个播放器对象。我想这就像老海军陆战队的事情。有很多玩家,但这个是我的。

是的,我知道,全局变量通常不是很好,但在这里它是有道理的(好吧,我想是的,如果你们都有其他想法,我全都听好了),我只是不知道如何实现它.

编辑:我可能在这里不清楚。我想我可能需要一个单身人士?但我不知道在哪个文件中声明实例或如何声明。

我有一个 MYAPPlayer 类,它通常用于许多实例,它可以/不应该是静态的(除非我想成为一个蹩脚的开发者)。但我需要一个非网络桌面 csharp 应用程序的当前用户的 MYAPPlayer 全局单例对象变量。

【问题讨论】:

    标签: c# variables global desktop


    【解决方案1】:

    在您的应用程序中,您应该有一个 static User CurrentUser 属性。

    当您登录应用程序时,将当前用户设置为该用户的实例。

    如果您使用的是 WPF,我会将其设为依赖属性,并将应用程序接口的其余部分绑定到该属性。如果您使用表单,则必须在用户更改时手动处理所有 UI 的更新。

    编辑:如何使用静态运行程序和对象的静态实例来实现这样的事情的简短示例。我还建议您阅读更多关于静态的含义以及类是什么的内容,它可能比您想象的要多一些...我将在底部进行更多解释

    class Program
    {
        static Player CurrentUser;
    
        static void Main(string[] args)
        {
            string username;
            bool isValidUser;
    
            //get and validate user credentials
    
            if (isValidUser)
                CurrentUser = new Player(username);
    
            SomeMethod();
        }
    
        static void SomeMethod()
        {
            if (CurrentUser == null)
                return;
    
            //do stuff with user
        }
    }
    
    public class Player
    {
        public string Name { get; private set; }
        //... more properties
    
        public Player(string name)
        {
            Name = name;
            //... more properties
        }
    }
    

    考虑一下静态与非静态......非静态类是您可以构造并拥有多个实例的对象的蓝图。当类中有静态成员时,就会创建一个静态类。每当您引用其中一个静态成员时,所有静态成员都被分离出来,并且在整个程序中声明和引用该静态类的单个实例......我所说的一个更好的例子是......

    class Program
    {
        static Person John;
    
        static void Main()
        {
            Console.WriteLine("Persons who exist {0}", Person.Total);
    
            John = new Person("John");
            John.Born();
            John.Birthday();
    
            Person Jane = new Person("Jane");
            Jane.Born();
    
            Console.WriteLine("Persons who exist {0}", Person.Total);
            Console.WriteLine("John's Age {0}", John.Age);
            Console.WriteLine("Jane's Age {0}", Jane.Age);
    
            Console.ReadKey(true); //Pause program
        }
    }
    
    class Person
    {
        public static int Total { get; private set; }
    
        public static Person()
        {
            Total = 0;
        }
    
        public string Name {get; private set;}
        public int Age { get; private set; }
    
        public Person(string name)
        {
            Name = name;
            Age = 0;
        }
    
        public void Born()
        {
            Total++;
        }
    
        public void Birthday()
        {
            Age++;
        }
    
        public void Death()
        {
            Total--;
        }
    }
    

    正如您在上面看到的,我有一个可以访问 John Person 的静态 main 方法。 Person 类是非静态的,但它确实有一个静态成员。请注意, Person 的实例在内部可以访问静态变量,但是从 main 方法中您必须说 Person.Total 才能获得总数。另请注意,Person 类的静态部分无法访问 Person 的任何实例,但 Person 的所有实例都可以访问 Person 的静态成员,这就是当一个人是出生,或在一个人死后迭代。

    【讨论】:

    • 我将在哪个文件中设置该属性,它是否需要 Player 对象/类也是静态的?
    • Player 类不应该是静态的。然后您可以创建 Player 对象的实例并将其存储在静态变量中。我将在我的帖子中添加一个示例来说明我的意思。
    【解决方案2】:

    CurrentPlayer 可能是静态的,因为它是当前播放器。

    internal class Data
    {
         public Player CurrentPlayer { get; set; }
         .... // other variables
    }
    

    用法:Data.CurrentPlayer = ResponseFromWebServiceCall.Player;

    如果一次只能有一个当前玩家,那么使用静态变量来表示当前玩家并没有错。

    编辑,澄清:如果只有一个对象的单一表示,那么使用静态变量来保存该信息是完全可以接受的。例如,在您的类中,是否要引用我在上面显示的播放器变量的用法,或者如果您想通过构造函数参数接受播放器变量,这取决于您。实际上,这样做会给您在便携性方面的最佳折衷。

    【讨论】:

    • 编辑 - 对不起,我刚刚意识到我可能误解了你的实现,只是假设了你的目的。我会测试一下。 但是,我可能是错的,如果我将其设置为静态,则底层类必须是静态的,对吗?我不能拥有那个。它用于从系统中获取其他玩家,这些玩家可能是也可能不是当前玩家,并且肯定需要一个实例。我将编辑我的问题以澄清这一点。
    • 所以我仔细看了一下,没有误会。似乎这个实现是针对一个网络应用程序的(我在问一个桌面/Windows窗体应用程序),虽然我已经有一个 Player 对象的类,但我不能在任何地方设置全局变量,除非我将 Player 类设为静态,我不想/不能这样做。我应该在哪个文件中声明 Player GlobalPlayer 以使其普遍可用?
    • 您可以在静态或实例类中拥有静态变量。当您添加静态修饰符时,您基本上说这是此变量的唯一实例。对于 WinForms 或其他富客户端应用程序,这是管理登录用户的方式。对于 Web 表单,使用 Session 也同样有效。我已经看到人们使用静态变量并将 [ThreadStatic] 属性应用于它并产生不同的结果,但是 Session 至少可以优雅地处理会话到期,如果您不喜欢从 System.Object 转换所需的类型,那么创建一个很简单围绕它的通用包装器。
    猜你喜欢
    • 2015-05-11
    • 2015-05-26
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 2010-11-12
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多