gpt4 book ai didi

c# - 保存对 int 的引用

转载 作者:太空狗 更新时间:2023-10-29 22:34:56 25 4
gpt4 key购买 nike

这是我正在尝试做的事情的简化版本

static void Main(string[] args)
{
int test = 0;
int test2 = 0;
Test A = new Test(ref test);
Test B = new Test(ref test);
Test C = new Test(ref test2);
A.write(); //Writes 1 should write 1
B.write(); //Writes 1 should write 2
C.write(); //Writes 1 should write 1
Console.ReadLine();
}
class Test
{
int _a;
public Test(ref int a)
{
_a = a; //I loose the reference here
}
public void write()
{
var b = System.Threading.Interlocked.Increment(ref _a);
Console.WriteLine(b);
}
}

在我的真实代码中,我有一个 int,它将被许多线程递增,但是在线程 a 调用它的地方,将指向它的参数传递给它并不容易(在真实代码中,这发生在 a IEnumerator)。所以要求是必须在构造函数中进行引用。也不是所有的线程都指向同一个 base int,所以我也不能使用 global static int。我知道我可以将 int 装在一个类中并传递给类,但我想知道这是否是执行此类操作的正确方法?

我认为正确的做法是:

static void Main(string[] args)
{
Holder holder = new Holder(0);
Holder holder2 = new Holder(0);
Test A = new Test(holder);
Test B = new Test(holder);
Test C = new Test(holder2);
A.write(); //Writes 1 should write 1
B.write(); //Writes 2 should write 2
C.write(); //Writes 1 should write 1
Console.ReadLine();
}
class Holder
{
public Holder(int i)
{
num = i;
}
public int num;
}
class Test
{
Holder _holder;
public Test(Holder holder)
{
_holder = holder;
}
public void write()
{
var b = System.Threading.Interlocked.Increment(ref _holder.num);
Console.WriteLine(b);
}
}

还有比这更好的方法吗?

最佳答案

基本上,答案是肯定的,您需要上课。

没有可以存储为字段的“对 int 的引用”的概念。在 C# 中,它仅限于参数。

虽然存在一种不安全方式(指向 int 的指针,int*),但在这种情况下处理 GC 的复杂性使其变得不切实际且效率低下。

所以你的第二个例子看起来不错。

关于c# - 保存对 int 的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2940007/

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