【问题标题】:Scope of private static variable in non static class非静态类中私有静态变量的范围
【发布时间】:2019-01-14 11:32:10
【问题描述】:

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

public class A
{
   private static int B;

   public int GetSession()
   {
     return B++;
   }
}

在上面的类中,我有一个私有静态字段。调用GetSession() 方法会提供GetSession() 访问的次数吗?

【问题讨论】:

  • 如果包含类是static 或不是对static 成员完全没有影响。 static 表示 static,这是所有实例共享。除此之外,您可以通过创建不同的实例来简单地尝试一下,看看它们是否都为您的静态字段具有相同的值。
  • “在上面的类中我有一个私有静态属性”不,你有一个私有静态字段
  • @HimBromBeere,知道了,谢谢你的信息。
  • @Rango,更新了问题。 :) 感谢您的信息

标签: c# asp.net static


【解决方案1】:

由于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;
   }

【讨论】:

  • 他的原始代码有return B++;不是 return ++B;。他是要返回增量后的值,还是增量前的值?
  • @Jeppe Stig Nielsen:不错的收获!谢谢!可能,模拟B++ 而不是++B 的最简单方法是减去1
【解决方案2】:

是的,它将提供调用GetSession() 方法的次数。

这将是A所有个实例的总数。

请注意,它不是线程安全的,因此如果您的应用程序有多个线程可能同时调用GetSession(),则计数可能是错误的。请参阅 Dmitry Bychenko 的回答。如果您的所有 A 实例都是从同一个线程调用的,这没有问题。

另外请注意,如果您的应用程序有多个 AppDomain,则每个 AppDomain 将有一个单独的静态字段。因此,它只计算来自同一个 AppDomain 内的调用,而不管调用通过哪个实例。

【讨论】:

  • 感谢您的详细解释。
【解决方案3】:

是的,它仍然会返回访问 B 的次数。它仍然是static。添加私有不会改变这一点。并且将类设为static 意味着无法为该类实例化对象,因此,类中的所有内容都需要为static。但是变量的行为仍然相同。

【讨论】:

  • private 访问器对我来说是令人困惑的部分,感谢您清理它。
猜你喜欢
  • 2017-02-25
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-22
  • 1970-01-01
  • 1970-01-01
  • 2019-06-08
相关资源
最近更新 更多