IntPtr演员与新演员

Noa*_*Gal 3 c# intptr

我只是看一个例子,在其中我看到了代码

return new IntPtr(handle);
Run Code Online (Sandbox Code Playgroud)

在探索我们的代码之后,我发现我们已经使用了类似的模式,但在我们的代码中我们几乎有相同的东西:

return (IntPtr)handle;
Run Code Online (Sandbox Code Playgroud)

这两种情况有区别吗?第二个是否会以任何方式"更好",因为它不会分配新的内存,或者只是隐藏相同的构造函数?

Sco*_*man 8

在你的例子中,我猜测句柄是一个整数值?IntPtr声明从Int32(int)和Int64(long)的显式转换,它只是调用相同的构造函数:

public static explicit operator IntPtr(int value)
{
    return new IntPtr(value);
}
Run Code Online (Sandbox Code Playgroud)

因此除了可能的可读性问题之外,实际上没有区别.


Ham*_*ith 5

反射器说,无论如何,演员都在调用引擎盖下的构造函数:

[Serializable, StructLayout(LayoutKind.Sequential), ComVisible(true)]
public struct IntPtr : ISerializable
{
    ...

    [ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
    public static explicit operator IntPtr(int value)
    {
        return new IntPtr(value);
    }

}
Run Code Online (Sandbox Code Playgroud)