相关疑难解决方法(0)

为什么.NET中最低地址空间(非空)的内存访问报告为NullReferenceException?

这导致AccessViolationException抛出:

using System;

namespace TestApplication
{
    internal static class Program
    {
        private static unsafe void Main()
        {
            ulong* addr = (ulong*)Int64.MaxValue;
            ulong val = *addr;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这会导致NullReferenceException抛出:

using System;

namespace TestApplication
{
    internal static class Program
    {
        private static unsafe void Main()
        {
            ulong* addr = (ulong*)0x000000000000FF;
            ulong val = *addr;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它们都是无效指针,都违反了内存访问规则.为什么NullReferenceException?

.net c# clr

30
推荐指数
2
解决办法
1373
查看次数

引发/生成空引用异常后的CLR实现是什么?

我们确实遇到过这个特殊问题,也是我们编码/开发生活日或其他日子中最常见的例外情况之一.我的问题是不是关于为什么(我知道它提出,当我们试图访问它实际上指向空引用变量的性质),但它是关于如何由CLR所产生的空引用异常.

有时我被迫认为用于标识对null的引用的机制(可能null是内存中的保留空间)然后通过CLR引发Exception.CLR如何识别并引发此特定异常.操作系统在其中扮演任何角色吗?

我想分享一个关于它的最有趣的主张:

null实际上是CLR已知的所有时间保留的内存空间,并且禁止所有类型的访问.因此,当找到该空间的引用时,它默认通过OS生成访问被拒绝的异常类型,这被CLR解释为NULL引用异常.

我没有找到支持上述陈述的任何文章或帖子,因此很难相信.可能由于我缺少挖掘细节或其他原因,我希望Stackoverflow是最合适的平台之一,我会得到最好的响应.

.net c# clr memory-management nullreferenceexception

5
推荐指数
1
解决办法
554
查看次数