对于一些静态方法,我意识到在操作期间使用小数组临时存储值是非常方便的。上述数组很有用,因为您需要索引,但每次调用该方法时都要分配该小数组。
这个是解决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字节数组的分配:
- 通常是GEN-0,所以收集 很便宜
- 如果你真的想,使用
stackalloc
和unsafe
来避免分配
例如"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];
....
}