c# - 没有成员访问时怎么会出现NullReferenceException呢?

标签 c# .net exception nullreferenceexception

编辑

  • 这个问题不是:什么是 NullReferenceException?当访问 null 引用的成员时,会发生 NullReferenceException。
  • 这个问题是:没有成员访问时怎么会出现NullReferenceException?

结束编辑

据我所知,NullReferenceException 仅在访问引用类型的成员时才会发生。据我所知,“引用”thisbase 永远不能为空。

今天,我遇到一个抛出 NullReferenceException 的属性,而没有成员访问权限(thisbase 的成员除外) )。

我的问题是:如何!

这是代码:

public class ComponentObject : Base
{
    private readonly XmlNamespaceManager _nsmgr;    
    public XmlNode FieldGroupContainerWerknemers { get { ... } }

    public string NumberOfMngDirectorMainShareholders
    {
        get
        {
            XmlNode fieldGroupContainerWerknemers = this.FieldGroupContainerWerknemers;
            return base.GetValue(fieldGroupContainerWerknemers, this._nsmgr, "./ns1:FieldGroup//ns1:DynamicFields//ns1:Field[@Name='DgaAantal']//ns1:Value");
        }
    }
}

这是一个异常(exception):

Exception type: NullReferenceException
Source: Turien.Interfaces.BizTalk.Policy.Helpers
Target Site: System.String get_NumberOfMngDirectorMainShareholders()
The following is a stack trace that identifies the location where the exception occured

    at Turien.Interfaces.BizTalk.Policy.Helpers.BatchCertigo.ComponentObject.get_NumberOfMngDirectorMainShareholders()
    at Turien.Interfaces.BizTalk.Policy.Helpers.BatchTurien.BatchE.BatchE.CreateCurrentCoverageData()
    at Turien.Interfaces.BizTalk.Policy.Helpers.BatchTurien.BatchE.BatchE.CreateLetterDataBatchE()
    at Turien.Interfaces.BizTalk.Policy.Helpers.BatchTurien.BatchE.BatchE.CreateContract()
    at Turien.Interfaces.BizTalk.Policy.Helpers.BatchTurien.BatchE.BatchE.CreateBatch(XmlDocument outputdata)
    at Turien.Interfaces.BizTalk.Policy.Helpers.BatchTurien.BatchBase`1.CreateBatch(XmlDocument outputdata, String fileName, Int32 outputNumber)

我已采取的步骤:

  • 我搜索了另一个属性 NumberOfMngDirectorMainShareholders:这是唯一的一个。
  • 我使用 ILSpy 来监视 DLL 内部。生产中的代码与源代码控制中的代码相同。

编辑

对于那些告诉要调试的人:我很乐意这样做。提出在哪里放置断点以及要检查哪些变量的建议。更进一步:如何处理这些信息。例如:如果 this.FieldGroupContainerWerknemers 为 null,那么会如何导致这种情况。或者,如果 _nsmgr 为 null,它会如何导致此问题(请记住:堆栈跟踪指向此方法/属性!)

最佳答案

JIT 编译器可以在发布版本中内联方法调用(启用优化)。

在您的示例中,get_FieldGroupContainerWerknemers()base.GetValue 可能已被内联。在这种情况下,这些方法中的 NullReferenceException 将使堆栈跟踪指向 get_NumberOfMngDirectorMainShareholders()

内联发生在 JIT 编译期间,因此您不会在 IL 代码中看到它。

关于c# - 没有成员访问时怎么会出现NullReferenceException呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32783816/

相关文章:

php - Exception、InvalidArgumentException 或 UnexpectedValueException 之间有什么区别?

c# - 数据库设计 Entity Framework 中的导航属性

.net - XmlDocument缓存内存使用

c# - 取 2 : Is it abusive to use IDisposable and “using” as a means for getting “scoped behavior” ?

.net - 保存安全字符串

asp.net - 如何使用 LinkBut​​ton 提交表单?

unit-testing - 所有单元测试都将Moq抛出BadImageFormatException吗?

c# - Image.FromFile 为无效图像格式抛出 OutOfMemoryException 是否有原因?

c# - 为什么 IsLiteral 对十进制返回 false?

c# - 检查字符串是否包含单词