我对Asp.net页面中静态变量的使用存在疑问.
我有一页说UserDetails.aspx.在这个页面中,我有一个静态变量来存储特定于用户的一些数据.那么,这个变量是否会在多个用户之间共享,或者为每个用户创建一个单独的变量?
public partial class UserDetails : System.Web.UI.Page
{
static int numberOfReviews=0;
protected void Page_Load(object sender, EventArgs e)
{
numberOfReviews= GetReviews();
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,numberOfReviews是特定于每个用户还是将被共享?
numberOfReviews
我有一些任务需要解决,目前最重要的部分是使脚本尽可能节省时间.我试图优化的一个要素是其中一个函数中的memoization.
所以我的问题是:以下3-4种方法中哪一种是在Python中实现memoization的最有效/最快的方法?
我只提供了代码作为示例 - 如果其中一种方法更有效,但在我提到的情况下,请分享您所知道的内容.
此解决方案通常显示为示例memoization,但我不确定它的效率如何.我听说使用全局变量(在这种情况下,它是从外部变量而不是全局变量)效率较低.
def main():
memo = {}
def power_div(n):
try:
return memo[n]
except (KeyError):
memo[n] = (n ** 2) % 4 # example expression, should not matter
return memo[n]
# extensive usage of power_div() here
Run Code Online (Sandbox Code Playgroud)
我发现在过去使用默认的可变参数从外部作用域传递变量,当Python首先在本地作用域中搜索变量,然后在全局作用域中,跳过非局部作用域(在本例中为范围内)功能main()).因为默认参数仅在定义函数时初始化,并且只能在内部函数内部访问,因此它可能更有效吗?
def main():
def power_div(n, memo={}):
try:
return memo[n]
except (KeyError):
memo[n] = (n ** 2) % 4 # example expression, should not matter
return memo[n]
# extensive usage of power_div() …Run Code Online (Sandbox Code Playgroud) python performance memoization static-variables argument-passing
我正在尝试为遗留代码编写单元测试.我正在测试的类有几个静态变量.我的测试用例类有几个@Test方法.因此,他们都拥有相同的状态.
有没有办法在测试之间重置所有静态变量?
我提出的一个解决方案是明确重置每个字段,例如:
field(MyUnit.class, "staticString").set(null, null);
((Map) field(MyUnit.class, "staticFinalHashMap").get(null)).clear();
Run Code Online (Sandbox Code Playgroud)
如您所见,每个变量都需要自定义重新初始化.这种方法不容易扩展,遗留代码库中有很多这样的类.有没有办法一次性重置所有内容?也许每次重新上课?
作为一个可能的好解决方案,我认为是使用类似powermock的东西,并为每个测试创建一个单独的类加载器.但我看不到简单的方法.
昨天我从Bill Venables那里了解到local()如何帮助创建静态函数和变量,例如,
example <- local({
hidden.x <- "You can't see me!"
hidden.fn <- function(){
cat("\"hidden.fn()\"")
}
function(){
cat("You can see and call example()\n")
cat("but you can't see hidden.x\n")
cat("and you can't call ")
hidden.fn()
cat("\n")
}
})
Run Code Online (Sandbox Code Playgroud)
从命令提示符的行为如下:
> ls()
[1] "example"
> example()
You can see and call example()
but you can't see hidden.x
and you can't call "hidden.fn()"
> hidden.x
Error: object 'hidden.x' not found
> hidden.fn()
Error: could not find function "hidden.fn"
Run Code Online (Sandbox Code Playgroud)
我根本不理解以下代码的执行流程:
class Test {
static String s1 = getVal();
static String s2 = "S2";
private static String getVal() {
return s2;
}
public static void main(String args[]) {
System.out.println(s2); // prints S2
System.out.println(s1); // prints null
}
}
Run Code Online (Sandbox Code Playgroud)
它应该S2在第二个println声明打印.我更感兴趣的是理解为什么会发生这种情况而不是解决方案.
在C#中,有没有办法将静态变量放在像VB.Net这样的方法中?
Static myCollection As Collection
Run Code Online (Sandbox Code Playgroud) 我想知道为什么gcc(4.6.3)没有给我这个例子中无法访问的代码的警告:
#include <stdio.h>
int status(void)
{
static int first_time = 1;
if (first_time) {
return 1;
first_time = 0; /* never reached */
} else {
return 0;
}
}
int main(int argc, const char *argv[])
{
printf("first call %d\n", status());
printf("second call %d\n", status());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
注意,故障status()功能的目的是保持状态.我曾期望得到一个警告-Wall.我也试过了-Wunreachable-code,-Wextra(-pedantic和这里-ansi讨论的那样).然而,这些都没有给我一个警告.
看来gcc会默默地删除静态变量赋值.
在我看来,gcc选项-Wall -Werror应该抛出一个错误.
我在Visual Studio 2015 sp3中使用C++.通过
#pragma init_seg(compiler)
Run Code Online (Sandbox Code Playgroud)
,我首先初始化一些静态变量(到内存管理). https://msdn.microsoft.com/en-us/library/7977wcck.aspx
但是还有
Run Code Online (Sandbox Code Playgroud)#pragma init_seg(compiler)
在wcerr.cpp(Microsoft Visual Studio 14.0\VC\crt\src\stl\wcerr.cpp)中,所以这些对象在我的对象之前初始化.
我可以wcerr.cpp通过任何编译/链接选项强制我的对象在对象之前被初始化吗?
c++ pragma static-variables visual-studio visual-studio-2015
class A{
static int i = 10;
static int j = 20;
static void getname(){
}
}
Run Code Online (Sandbox Code Playgroud)
这些变量将存储在内存中的哪个位置?
我作以下声明:
class Servo {
protected:
static const int maxServos = 16;
static Servo servos[maxServos]; //Array declaration
};
Servo Servo::servos[Servo::maxServos]; //Array definition
Run Code Online (Sandbox Code Playgroud)
...它可以编译,很棒!但是我不明白为什么要编译它,因为在我看来maxServos受保护了,并且在定义数组时在全局范围内使用它。我尝试在另一个全局上下文中使用它,的确确实得到了编译错误:
int main() {
std::cout << Servo::maxServos; //This will not compile.
}
Run Code Online (Sandbox Code Playgroud)
那么发生了什么 ?数组的整个定义是否受命名空间限定的范围的影响?是编译器故障吗?
我正在使用Lubuntu 16.04 O / S在Raspberry PI上使用g ++ -std :: c ++ 11。
static-variables ×10
java ×3
c++ ×2
asp.net ×1
c ×1
c# ×1
c++11 ×1
closures ×1
gcc ×1
gcc-warning ×1
legacy-code ×1
local ×1
memoization ×1
performance ×1
pragma ×1
python ×1
r ×1
unit-testing ×1
variables ×1