访问

时间:2015-07-13 16:54:22

标签: c#

我有以下代码:

internal class FakeInvitationsRepository : InvitationsRepository
{
    internal readonly static Dictionary<Guid, InvitationDbEntity> Data = new Dictionary<Guid, InvitationDbEntity>()
    {
        { ...

这是一个屏幕截图,它的价值是什么:

Screen shot of real code

这只是一些内存中的虚假数据,共有3个项目。该类存在于ASP.NET WebAPI项目中,而不是在测试DLL中,而是存在于WebAPI DLL中。

API调用进入并在控制器操作中遇到断点,它尝试直接使用这些伪数据,没有IoC或任何聪明的东西。

但是字段Data为空。它在运行时导致空引用异常。

Screen show showing null

C#语言规范说:

  

如果类中存在静态构造函数(第10.11节),则在执行该静态构造函数之前立即执行静态字段初始值设定项。否则,静态字段初始值设定项在首次使用该类的静态字段之前的实现相关时间执行。

这里发生的事情使得该字段在首次使用之前未初始化?

注意:一位同事已经快速检查并且也很困惑。 Data只是一直设置,永远不会被我的代码(它的readonly afterall)所取代。

修改

这是我的代码的callstack:

System.Diagnostics.StackTrace t = new System.Diagnostics.StackTrace();
{   at Company.Product.WebAPI.Controllers.RenamedController.<GetInvitations>d__14.MoveNext()
   at Company.Product.WebAPI.Controllers.RenamedController.GetInvitations(Guid id)
   at lambda_method(Closure , Object , Object[] )
   at Company.WebAPI.Product.Areas.RouteDebugger.InspectActionInvoker.InvokeActionAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
   at Company.WebAPI.Product.Areas.RouteDebugger.InspectHandler.<>n__FabricatedMethod12(HttpRequestMessage , CancellationToken )
   at Company.WebAPI.Product.Areas.RouteDebugger.InspectHandler.<SendAsync>d__e.MoveNext()
   at Company.WebAPI.Product.Areas.RouteDebugger.InspectHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
}
    FrameCount: 84
    frames: {System.Diagnostics.StackFrame[87]}
    m_iMethodsToSkip: 3
    m_iNumOfFrames: 84

答案

我无法回答,因为这个问题被搁置了。有争议的。

感谢MStodd。答案是愚蠢而直截了当的,但有点令人惊讶;我记不起在11年的.NET编程中见过这个。

Data字段尚未初始化。

在初始化程序中放置断点,整个块变为红色,表明它已在下一步调用。

由于NullReferenceException为空,this.Invitations是红鲱鱼。

当然,我期望该字段在该行停止时被初始化,我只是没想到它会发生得太晚,所以假设null导致我的运行时异常。

你去。

1 个答案:

答案 0 :(得分:1)

从您的调用堆栈中,我可以推断出会评估Invitations属性(在Select body中)。作为调用堆栈中的最后一个,我可以推断,由于Invitations为NULL,空引用会引发!)。我想Data = NULL根本不与调用堆栈相关!但它是一个调试器问题。