gpt4 book ai didi

c# - 通过引用传递并存储对变量的引用 - C#

转载 作者:行者123 更新时间:2023-11-30 21:56:45 24 4
gpt4 key购买 nike

我是不是对引用传递有什么误解?

SomeClass 是 IObserver 的实现者:

bool value = false;
provider.Subscribe(new SomeClass(ref value));
while (!value)
{
provider.GetEvents() //triggers OnNext
}

在某个类中:

public SomeClass(ref bool value)
{
this.value = value;
}

public void OnNext(object someUpdatedValue)
{
value = true;
}

值永远不会变为真,而 while 循环永远不会中断。怎么会?将 SomeClass 的 value 属性分配给 value 的引用不会持久化吗?

编辑:在看到前两个回复后,我的新问题是:

如何在不使用静态变量的情况下实现这种行为?

最佳答案

按引用传递仅影响作为参数传递给方法的变量。在您的示例中,false , 这就是变量 value当您将其分配给 this.value 时包含, 被复制到 this.value field 。仅此而已。

C# 中没有什么神奇的东西可以记住该值的位置并在以后更新变量(当为其赋值的字段稍后发生更改时)。

Does assigning the value property of SomeClass to the reference of value not persist?

您不是在分配“值(value)引用”。通过引用传递时发生的所有事情是,如果局部变量本身发生更改,那么传递的变量也会被修改。当您使用变量的值时,您只是在使用该值,而不是引用。


编辑:

如果没有更多的上下文,就不可能说出解决这个问题的最佳方法。但请注意,引用类型实现的效果与您似乎想要做的类似。例如:

class VolatileBoolWrapper
{
public bool Value { get { return _value; } }
private volatile bool _value;

public void SetValue(bool value)
{
_value = value;
}
}

VolatileBoolWrapper value = new VolatileBoolWrapper();
provider.Subscribe(new SomeClass(value));
while (!value.Value)
{
provider.GetEvents() //triggers OnNext
}

public SomeClass(VolatileBoolWrapper value)
{
this.value = value;
}

public void OnNext(object someUpdatedValue)
{
value.SetValue(true);
}

这样,VolatileBoolWrapper类充当调用者和被调用者的中间人。

<编辑>
请注意,我将该字段标记为 volatile , 并将该类命名为 Volatile...只是为了安全。问题中没有足够的上下文让我知道“触发器”的实际含义(即同一个线程是否实际设置了值,或者这是涉及线程之间交互的东西)。

如果碰巧调用了OnNext()发生在同一个线程中,严格依靠对 GetEvents() 的调用, 那么你可以省略 volatile 的使用在这里(并忽略,或者至少打折,我在下面关于投票的注释)。


综上所述,坦率地说:轮询像这样的变量几乎总是实现目标的错误方法。对于这样的事情总是有更好的方法,但在现代 C# 中,我会说 TaskCompletionSource是最好的选择。与之前出现的其他机制一样,它允许您的等待代码不必持续使用 CPU 时间来检查事件是否已发生;与它们不同,它还提供了一种出色的机制,允许整个线程 继续执行,执行其他工作,仅在 await 处恢复。当事件实际发生时,您在其中等待该事件的语句。

关于c# - 通过引用传递并存储对变量的引用 - C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31256712/

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