gpt4 book ai didi

c# - 使用 threadstatic 静态字段模拟函数静态变量?

转载 作者:行者123 更新时间:2023-11-30 22:34:02 24 4
gpt4 key购买 nike

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

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

如果您对静态方法有很深的依赖,将 register 作为第二个参数传递也足够了:

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];
....
}

关于c# - 使用 threadstatic 静态字段模拟函数静态变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8023770/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com