C# 这怎么会发生?

C# 这怎么会发生?,c#,pointers,C#,Pointers,45 它确实返回45。 为什么它不抛出任何异常?为什么您希望它抛出异常 默认情况下,C#代码是,这意味着溢出和类似的内容会被默默地忽略。通过转到“项目属性”、“生成”选项卡,然后单击选项卡内容中的“高级”按钮,可以找到此设置的当前项目设置。在出现的对话框中,您应该有一个“检查算术溢出/下溢”。默认情况下,此设置未选中 在本例中,通过将指针转换为c,将32位(4字节)int值x的第一个字节递增,并将其递增300倍 这将使其递增256倍,这将使其返回到0,然后再递增44倍。从1岁开始,现在已经45岁

45

它确实返回45。

为什么它不抛出任何异常?

为什么您希望它抛出异常

默认情况下,C#代码是,这意味着溢出和类似的内容会被默默地忽略。通过转到“项目属性”、“生成”选项卡,然后单击选项卡内容中的“高级”按钮,可以找到此设置的当前项目设置。在出现的对话框中,您应该有一个“检查算术溢出/下溢”。默认情况下,此设置未选中

在本例中,通过将指针转换为c,将32位(4字节)int值x的第一个字节递增,并将其递增300倍

这将使其递增256倍,这将使其返回到0,然后再递增44倍。从1岁开始,现在已经45岁了

您可以通过执行以下代码轻松地测试这一点:

struct a { public int x; }
struct c { public byte x; }
unsafe class Program
{
    static void Main(string[] args)
    {
        a V = new a();
        V.x = 1;
        c* b = (c*)(void*)&V;
        for(int n = 0;n != 300;n++) b->x++;
        Console.WriteLine(V.x);
        Console.ReadKey(true);
    }
}
您将获得:

b=0

不是溢出异常


话虽如此,在您真正需要指针和不安全代码之前,您可能不应该使用它们。

为什么您希望它抛出异常

默认情况下,C#代码是,这意味着溢出和类似的内容会被默默地忽略。通过转到“项目属性”、“生成”选项卡,然后单击选项卡内容中的“高级”按钮,可以找到此设置的当前项目设置。在出现的对话框中,您应该有一个“检查算术溢出/下溢”。默认情况下,此设置未选中

在本例中,通过将指针转换为c,将32位(4字节)int值x的第一个字节递增,并将其递增300倍

这将使其递增256倍,这将使其返回到0,然后再递增44倍。从1岁开始,现在已经45岁了

您可以通过执行以下代码轻松地测试这一点:

struct a { public int x; }
struct c { public byte x; }
unsafe class Program
{
    static void Main(string[] args)
    {
        a V = new a();
        V.x = 1;
        c* b = (c*)(void*)&V;
        for(int n = 0;n != 300;n++) b->x++;
        Console.WriteLine(V.x);
        Console.ReadKey(true);
    }
}
您将获得:

b=0

不是溢出异常

话虽如此,在您真正需要之前,您可能不应该使用指针和不安全的代码。

“默认情况下,C#代码是未经检查的。”我真的不知道。谢谢。“默认情况下,C#代码是未经检查的。”我真的不知道。谢谢。