小编Mik*_*son的帖子

静态变量生存期和应用程序池重新计划

我理解与应用程序(控制台/窗口)相关的静态变量的生命周期,但我不确定我是否在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?

注意:我完全了解上面示例中的线程安全问题,这只是一个简单的例子来说明我的问题.在上述想法的真实场景中,我将实现适当的锁定模式.

.net c# asp.net iis static-variables

9
推荐指数
1
解决办法
5178
查看次数

寻求处理具有重叠字段的struct构造函数的最佳方法

我已经创建了一个自定义结构来处理将被封送到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)

c# memory constructor data-structures

8
推荐指数
1
解决办法
324
查看次数