gpt4 book ai didi

c# - 这个 Ambient Context 怎么会变成 null 呢?

转载 作者:可可西里 更新时间:2023-11-01 08:24:15 26 4
gpt4 key购买 nike

谁能帮我解释一下 TimeProvider.Current 如何在下面的类中变为 null?

public abstract class TimeProvider
{
private static TimeProvider current =
DefaultTimeProvider.Instance;

public static TimeProvider Current
{
get { return TimeProvider.current; }
set
{
if (value == null)
{
throw new ArgumentNullException("value");
}
TimeProvider.current = value;
}
}

public abstract DateTime UtcNow { get; }

public static void ResetToDefault()
{
TimeProvider.current = DefaultTimeProvider.Instance;
}
}

观察

  • 所有直接引用 TimeProvider 的单元测试也会在其 Fixture Teardown 中调用 ResetToDefault()。
  • 不涉及多线程代码。
  • 偶尔,其中一个单元测试会失败,因为 TimeProvider.Current 为 null(抛出 NullReferenceException)。
  • 这只会在我运行整个套件时发生,而不会在我只运行一个单元测试时发生,这向我表明存在一些微妙的测试相互依赖性。
  • 大约每五到六次测试运行一次。
  • 当发生故障时,它似乎发生在涉及 TimeProvider.Current 的第一个执行测试中。
  • 可以有多个测试失败,但在给定的测试运行中只有一个失败。

FWIW,这里还有 DefaultTimeProvider 类:

public class DefaultTimeProvider : TimeProvider
{
private readonly static DefaultTimeProvider instance =
new DefaultTimeProvider();

private DefaultTimeProvider() { }

public override DateTime UtcNow
{
get { return DateTime.UtcNow; }
}

public static DefaultTimeProvider Instance
{
get { return DefaultTimeProvider.instance; }
}
}

我怀疑静态初始化有一些微妙的相互作用,在所有静态初始化完成之前,运行时实际上被允许访问 TimeProvider.Current,但我不能完全确定

感谢任何帮助。


FWIW 我刚刚扔了

Console.WriteLine(Thread.CurrentThread.ManagedThreadId);

在 getter 中,它始终为测试运行中的所有测试用例报告相同的 ID,因此该问题似乎与线程无关。

最佳答案

仅根据此代码,Current 可能是 null,因为它被设置为 null。这显然对您没有帮助。

你能提供测试代码吗?如果存在测试相互依赖性,这将有助于读者提供任何反馈。

与此同时,Jon Skeet 关于单例的文章可能会有所帮助,因为 DefaultTimeProvider 有效地充当单例:http://csharpindepth.com/Articles/General/Singleton.aspx

关于c# - 这个 Ambient Context 怎么会变成 null 呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2840470/

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