使用threadstatic静态字段模拟函数静态变量



对于一些静态方法,我意识到在操作期间使用小数组临时存储值是非常方便的。上述数组很有用,因为您需要索引,但每次调用该方法时都要分配该小数组。

这个是解决c#中缺乏类似C的静态局部变量的好方法吗?

[ThreadStatic]private static int[] staticregister = new int[4];
public static bool CoolStaticMethod(int[] largearray)
{
    //...
}

我的假设是,不能直接(递归)或间接调用自身的方法只能在单个线程中单独调用,因此应该将伪静态局部声明为线程静态,这样问题就在很大程度上解决了。

编辑:

我必须补充一下,寄存器的内容在方法调用之间是垃圾。

这是不是我所说的一个很好的解决方法,不。它将工作(假设您确定重入风险,即不调用自身,即使是通过意外事件/回调等)-但是…

在我的意见,它是有状态的,使它成为一个实例:

private int[] register = new int[4];
public bool CoolMethod(int[] largearray) {...}

并简单地为每个上下文使用WheverTheTypeIs的不同实例,即实例作为上下文。如果你想要每个线程都有上下文,就为每个线程使用不同的实例。这也允许在相同的上下文中继续使用回调、并行、工人等。请注意,有许多框架不保证单线程(WCF, ASP。. NET,例如WPF),随着5.0引入更多面向async/await的代码,这只会增加。

如果您与静态方法密切相关,那么将register作为第二个参数传入也足够了:

public static bool CoolStaticMethod(int[] largearray, int[] register) {...}

如果问题是4字节数组的分配:

  1. 通常是GEN-0,所以收集
  2. 很便宜
  3. 如果你真的想,使用stackallocunsafe来避免分配

例如"2":

public static unsafe bool CoolStaticMethod(int[] largearray)
{
    // not an array! this is raw data on the stack; DO NOT GO OUT OF BOUNDS!
    int* register = stackalloc int[4]; 
    register[0] = 1;
    register[1] = largearray[3];
    largearray[2] = register[0];
    ....
}

最新更新