当前用户全局变量 C# 桌面应用



我知道你可以在网络应用程序中使用会话变量,我不知道如何在桌面(Windows表单而不是移动Android)中使用一个。

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

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

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

是的,

我知道,全局变量通常不是好的,但在这里它是有道理的(好吧,我认为是这样,如果你们都有其他想法,我都是耳朵),我只是不知道如何实现它。

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

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

在应用程序中,您应该具有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--;
    }
}

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

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

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

用法:Data.CurrentPlayer = ResponseFromWebServiceCall.Player;

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

编辑,澄清:如果只有一个对象的单一表示,那么使用静态变量来保存该信息是完全可以接受的。在您的类中,如果您想引用该播放器变量(如我上面所示的用法),或者如果您想通过构造函数参数接受播放器变量,则取决于您。实际上,这样做会给你带来可移植性的最佳权衡。

最新更新