非静态类中私有静态变量的范围

时间:2019-01-14 11:32:10

标签: c# asp.net static

我知道,只要应用程序保持运行状态,静态属性就可以保留其值。非静态类中的私有静态字段是否相同

HttpServletRequest.getPathInfo()

在上述类中,我有一个私有静态字段。调用public class A { private static int B; public int GetSession() { return B++; } } 方法是否可以提供访问GetSession()的次数?

3 个答案:

答案 0 :(得分:2)

由于Bstatic,它将在所有个会话之间共享线程安全(如果两个会话尝试同时 访问/增加它,该怎么办?)的实现是

   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。但是该变量的行为仍然相同。