我理解与应用程序(控制台/窗口)相关的静态变量的生命周期,但我不确定我是否在Web应用程序(asp.net,mvc,web api等)的上下文中理解它们的生命周期.
根据我的理解,当IIS回收应用程序池时,静态变量会重置为其类型的默认值(积分= 0,引用类型= null等),但我想知道内联初始化程序是否在回收后重新初始化,或者是类型默认值总是可以分配?
例子):
// example 1
static class StaticRandom
{
private static Random rng = new Random();
}
Run Code Online (Sandbox Code Playgroud)
在上面,当循环后第一次调用时,是否会将静态字段rng重新初始化为新的Random()?或者在尝试使用变量之前是否需要实现空检查,例如:
// example 2
static class StaticRandom
{
private static Random rng = null;
public static Next()
{
if (rng == null)
rng = new Random();
return rng.Next();
}
}
Run Code Online (Sandbox Code Playgroud)
我是否正确假设在IIS回收后,示例1中的rng变量将为null,直到重新初始化为例如示例2?
注意:我完全了解上面示例中的线程安全问题,这只是一个简单的例子来说明我的问题.在上述想法的真实场景中,我将实现适当的锁定模式.
我已经创建了一个自定义结构来处理将被封送到GPU的RGBA值.
在我的类型中,我将单独的R,G,B和A组件保存为字节值,并与32位无符号整数(Uint32)重叠,以便轻松传递并分配打包值.我知道这个概念是显而易见的,但这里是一个很好的度量结构示例:
[StructLayout(LayoutKind.Explicit, Size = 4)]
public struct RGBA
{
[FieldOffset(0)]
public uint32 PackedValue;
[FieldOffset(0)]
public byte R;
[FieldOffset(1)]
public byte G;
[FieldOffset(2)]
public byte B;
[FieldOffset(3)]
public byte A;
}
Run Code Online (Sandbox Code Playgroud)
由于c#处理结构的方式,必须在定义的任何构造函数中显式指定每个字段.就我而言,这意味着由于重叠字段,我必须在任何构造函数中分配值两次.
我可以使用:
public RGBA(uint packed value)
{
R = G = B = A = 0; // initialize all to defaults before assigning packed value
PackedValue = packedValue;
}
public RGBA(byte r, byte g, byte b, byte a)
{
PackedValue = 0; // initialize to default before assigning components …Run Code Online (Sandbox Code Playgroud)