【发布时间】:2009-09-08 15:05:06
【问题描述】:
我来自 C/C++ 背景,在使用 C# 做一些事情时遇到了麻烦。我现在的问题是我需要一个在 C++ 中工作的 static 关键字。这样该属性对于类的所有实例都是全局的,这就是 C# 所做的。但我不想要的是 C#(/ASP.NET) 中的持久性。我希望静态属性仅对当前执行页面上的类的所有实例都是全局的。
这怎么可能?
基本上,我使用它是唯一的命名,它只能在当前执行的页面上是唯一的。如果静态属性是持久的,那么在高流量期间整数翻转的可能性会更高,这可能导致相同的值被使用两次。
如果有人去一个页面
static int i=0;
page_load...{
lbl.Text=i;
i++;
}
那么他们将得到 0。如果其他人访问同一页面,他们也会得到 0。但也具有静态属性,因此它在类的所有实例中都是相同的。
【问题讨论】:
-
简单的解决方案是使用 long。 64 位值不会很快翻转。老实说,我也怀疑 32 位整数。那仍然是 40 亿个请求。我怀疑您的网站在平均会话期间会产生那么多访问量。
-
可能是真的.. 但假设“哦,我们永远不会有那么多人”是不好的,因为如果每个页面请求这个数字可能会增加 100 次或更多次,这很可能会发生
-
无论如何你都在假设。即使该数字是每页的,如果该页面的请求足够频繁,它也会溢出。诀窍是做出明智的假设。无论页面被请求的频率如何,64 位整数都不会溢出。你可以每纳秒递增一次,它不会在 584 年内回绕。
-
好吧...如果您每秒获得 1000 次点击(阅读:实际上可以在单个 appdomain 中提供这么多的点击!),那么一个有符号的 32 位整数将在 23 个不间断的天后溢出加载。现在,我可以想象 64 位值只是更简单的路线,但是如果您正在寻找一个在平均会话长度内有效的唯一 ID,如果您知道限制,无论负载如何,你不会遇到麻烦。有时值得节省一些东西;例如,如果您需要将值粘贴到 url 中。
-
另外,我正在寻找一种方法来计算递归函数中的递归(跨单独的实例)以防止溢出。如果你使用静态并且页面崩溃,你现在有一个高于它应该是的递归级别 10-20(尽管堆栈实际上是空的),它可以在生产环境中玩 havok