我知道您可以在网络应用中使用会话变量,但我无法弄清楚如何在桌面(Windows窗体而非移动设备)中使用会话变量。
我有一个Player类,用于将玩家与app / SQLDb中的其他类关联起来(他们可能是也可能不是活跃用户)。但我希望设置一个CurrentPlayer(实际运行应用程序的人)。
在启动时的Program类中,我运行检查以查看当前用户是否存在,如果不存在,则将它们添加到SQLdb。但那时我想为我刚刚添加的用户设置一个应用程序范围的对象。事实上,如果他们不在数据库中,他们就无法运行该应用程序。
显然静态不起作用,因为我不想让Player类一直保持静态。但我确实需要设置这个对象,并且信息很容易获得。编辑:它不能一直是静态的原因是在每个其他实例中,但是当前用户,我绝对希望创建一个播放器对象。我想这就像旧的海军陆战队的事情。有很多球员,但这个是我的。
是的,我知道,全局变量通常不是很好,但这里有意义(好吧我想是的,如果你们都有其他的想法我都是耳朵),我只是无法弄清楚如何实现它。
编辑:我可能不清楚这里。我想我可能需要一个单身人士吗?但我不知道在哪个文件中声明实例或如何。我有一个MYAPPPlayer类,通常用于很多实例,它可以/不应该是静态的(除非我想成为一个糟糕的开发人员)。但我需要一个MYAPPPlayer全局单例对象变量,用于非Web桌面csharp应用程序的当前用户。
答案 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表示,那么使用静态变量来保存该信息是完全可以接受的。在你的课程中,如果你想引用那个播放器变量,就像我上面用过的那样,或者如果你想通过构造函数参数接受播放器变量,那么由你来决定。实际上,这样做可以为您提供便携性的最佳权衡。