C#中的参数

当我想在C#中获取内存总值时,我在MSDN中找到了一个kernel32函数来调用系统中的数据。 MSDN以这种方式声明函数:

[return: MarshalAs(UnmanagedType.Bool)] [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] static extern bool GlobalMemoryStatusEx(ref MEMORYSTATUSEX lpBuffer); 

但这不能正常工作。 我将“ref”改为“[In,Out]”然后它正常工作。 怎么能告诉我C#中的[In,Out]参数是什么?

在: http : //msdn.microsoft.com/de-de/library/system.runtime.interopservices.inattribute.aspx

出: http : //msdn.microsoft.com/de-de/library/system.runtime.interopservices.outattribute.aspx

简短:它们控制数据编组的方式。 在这种情况下,您指定它们两者,这意味着数据被编组到双方(调用者和被调用者)。

outref参数用于返回相同变量中的值,如果您不知道将在内部或外部使用它,则ref足够了。

如果您只想使用变量从函数接收数据,则输出In,如果您只想将数据发送到函数。

ref如果你想从函数发送和接收数据,如果你什么都不放,那么它默认是In

注意:当您的方法需要返回多个值时, refout参数非常有用。

以下定义有效(将MEMORYSTATUSEX定义为类):

 [DllImport("kernel32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool GlobalMemoryStatusEx(MEMORYSTATUSEX lpBuffer); [StructLayout(LayoutKind.Sequential)] public sealed class MEMORYSTATUSEX { public uint dwLength = (uint)Marshal.SizeOf(typeof(MEMORYSTATUSEX)); public uint dwMemoryLoad; public ulong ullTotalPhys; public ulong ullAvailPhys; public ulong ullTotalPageFile; public ulong ullAvailPageFile; public ulong ullTotalVirtual; public ulong ullAvailVirtual; public ulong ullAvailExtendedVirtual; } 

用法

 var status = new MEMORYSTATUSEX(); GlobalMemoryStatusEx(status); 

如果你看一下MSDN上的函数定义,它会告诉你参数是In / Out:

 BOOL WINAPI GlobalMemoryStatusEx( __inout LPMEMORYSTATUSEX lpBuffer ); 

一般来说,如果它说出来,你应该使用ref参数,这使得任何未来的开发人员都可以更容易地弄清楚代码是如何工作的。 查看函数调用时,您知道开发人员对于受影响的参数意味着什么。