2

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

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

[ThreadStatic]private static int[] staticregister = new int[4];

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

我的假设是,不能直接(递归)或间接调用自身的方法只能在单个线程中单独调用,因此应该将伪静态本地声明为线程静态,并且问题得到了更大的解决。

编辑:

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

4

1 回答 1

3

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

在我看来,它是有状态的,让它成为一个实例

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

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

如果您深深地依赖于静态方法,则将registerin 作为第二个参数传递也足够了:

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

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

  1. 这通常是 GEN-0,收集起来很便宜
  2. 如果你真的想要,使用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];
    ....
}
于 2011-11-05T22:47:07.523 回答