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

时间:2014-03-31 19:07:50

标签: c# variables global desktop

我知道您可以在网络应用中使用会话变量,但我无法弄清楚如何在桌面(Windows窗体而非移动设备)中使用会话变量。

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

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

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

是的,我知道,全局变量通常不是很好,但这里有意义(好吧我想是的,如果你们都有其他的想法我都是耳朵),我只是无法弄清楚如何实现它。

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

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

2 个答案:

答案 0 :(得分:3)

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

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

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

编辑:使用静态运行程序和对象的静态INSTANCE如何实现此类内容的简短示例。我还建议你阅读更多关于静态意义的内容,以及一个类是什么,它可能比你想的要多一些......我会在底部解释一下

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的静态成员,这是他们如何迭代人员总数的方式。出生,或在一个人去世时迭代。

答案 1 :(得分:2)

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

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

用法:Data.CurrentPlayer = ResponseFromWebServiceCall.Player;

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

编辑,澄清:如果只有一个对象的SINGLE表示,那么使用静态变量来保存该信息是完全可以接受的。在你的课程中,如果你想引用那个播放器变量,就像我上面用过的那样,或者如果你想通过构造函数参数接受播放器变量,那么由你来决定。实际上,这样做可以为您提供便携性的最佳权衡。