SDL#:为什么要将IntPtr初始化为null?

问题描述 投票:1回答:1

我找到的几个SDL#的教程都推荐在使用前初始化变量,像这样。

IntPtr surface = IntPtr.Zero;
surface = SDL.SDL_GetWindowSurface(window);

这样的代码和下面的代码有什么区别吗?

IntPtr surface = SDL.SDL_GetWindowSurface(window);

根据 此职位在SDL CC++中,由于向后兼容的原因,使用了这种代码风格。SDL#是否也是如此?

c# sdl-2
1个回答
1
投票

理论上存在差异。这里是示例。

void some_method()
{
    IntPtr surface2 = IntPtr.Zero;
    surface2 = MainWindow.foo();    //  Foo's signature: IntPtr foo();
    //...
}

IL code:
{
    .maxstack 1
    .locals init (
        [0] native int
    )

    // IntPtr surface2 = IntPtr.Zero;
    IL_0000: ldsfld native int [mscorlib]System.IntPtr::Zero
    IL_0005: stloc.0
    // surface2 = MainWindow.foo();
    IL_0006: call native int WPFTest.MainWindow::foo()
    IL_000b: stloc.0
    //  ......
} 


void some_method()
{
    IntPtr surface2 = MainWindow.foo();    //  Foo's signature: IntPtr foo();
    //...
} 

IL code:
{
    .locals init (
        [0] native int
    )

    // IntPtr surface = MainWindow.foo();
    IL_0000: call native int WPFTest.MainWindow::foo()
    IL_0005: stloc.0
}

第二段代码包含的指令较少 但我不认为你真的应该关心这个问题(JIT的工作做得很好)。在你的具体案例中 IntPtr 类的语义是一样的(在内部 IntPtr 总是 0). 我的总结--你应该关心你的应用程序的总体架构,而不是这样的微观优化。

© www.soinside.com 2019 - 2024. All rights reserved.