我知道,只要应用程序保持运行状态,静态属性就可以保留其值。非静态类中的私有静态字段是否相同
HttpServletRequest.getPathInfo()
在上述类中,我有一个私有静态字段。调用public class A
{
private static int B;
public int GetSession()
{
return B++;
}
}
方法是否可以提供访问GetSession()
的次数?
答案 0 :(得分:2)
由于B
是static
,它将在所有个会话之间共享; 线程安全(如果两个会话尝试同时 访问/增加它,该怎么办?)的实现是
public int GetSession()
{
return Interlocked.Increment(ref B);
}
编辑:如果我们想仿真B++
,而不是++B
(并在递增之前返回B
,请参见-请参阅Jeppe Stig Nielsen的评论),我们可以将1
减去:
public int GetSession()
{
// - 1 Since we want to emulate B++ (value before incrementing), not ++B
return Interlocked.Increment(ref B) - 1;
}
答案 1 :(得分:2)
是的,它将提供调用GetSession()
方法的次数。
它将是A
的所有个实例的总数。
请注意,它不是线程安全的,因此,如果您的应用程序有多个线程可能同时调用GetSession()
,则计数可能是错误的。参见德米特里·拜琴科的答案。如果您的A
的所有实例都在同一线程中调用,则没问题。
还要注意,如果您的应用程序有多个AppDomain,则每个AppDomain将具有一个单独的静态字段。因此,无论调用经过哪个实例,它都仅计入同一AppDomain中的调用。
答案 2 :(得分:1)
是的,它仍将返回访问B的次数。仍然是static
。添加私有不会更改此设置。并且将类设为static
意味着无法为该类实例化对象,因此,该类中的所有内容都需要为static
。但是该变量的行为仍然相同。