【发布时间】:2012-02-15 11:34:33
【问题描述】:
我有一个关于非静态类的静态成员和函数的问题。
我的班级中有一个用于身份验证的静态成员。基本上,我从我的 Web 应用程序调用一个静态函数,然后在内部调用一个静态函数,为该静态成员分配一个值。现在我的问题是,每次从我的 Web 应用程序调用静态函数时,都会创建一个对该对象的新引用并为静态成员分配一个新值。
所以基本上我有这个:
public class ClassA
{
private static int UserId;
private static AssignIdToUser(string token)
{
UserId = <int value depending on result of db query>;
}
public SendMessage(string token, string message, string toaddress)
{
AssignIdToUser(token);
Message msg = new Message(); //This is just a sample of a class that is similar to the one I use
msg.Message = message;
msg.UserId = UserId;
msg.ToAddress = toaddress;
//add class to db and save
}
}
然后在我的网络应用程序中我可以这样做:
ClassA.SendMessage("userstoken", "This is a message", "0123456789");
现在如果两个用户同时登录并同时调用该函数,那么成员 UserId 是否对每个用户都有正确的值?
基本上是为每个请求创建的对象的实例还是使用相同的对象?
【问题讨论】:
-
因为类是非静态的,所以为每个用户创建了一个新的类实例
-
@RashmiKantShrivastwa
ClassA.SendMessage行不会创建ClassA的实例,它只会初始化任何静态成员/在第一次调用时调用静态构造函数。所以你的评论几乎完全不正确。 -
答案涵盖了您的主要问题(这样做不安全),但也值得对您的最后一行进行评论。对于静态成员,不会创建实例对象,因此您甚至不能说使用了“相同”对象。查看有关此 msdn.microsoft.com/en-us/library/79b3xss3(v=vs.80).aspx 的 MSDN 文档,这对于理解使用静态时至关重要 - 否则很容易将自己开枪打死。
标签: c# .net oop web-applications