C#中的in、out、ref、in T、out T、[In]、[Out]关键字解析

{

T Create();

}

当我们将T用作形参输入的时候,会直接编译失败,请看下图:
![](https://cdn.res.knowhub.vip/c/2504/14/42857eb6.png?G1QAAMTW3Dgp8AFZ22gDdWfqnTYDElUElXrW6917rpvo%2bwMMzU%2bvbcT68IfaRpC7ncUIDGNF8iIQKep2WLILAmNonj0A)
## [In](参数属性)
作用:用于 P/Invoke(平台调用),表示参数是输入参数。
特点:通常与 ref 或 out 一起使用,明确指定参数的方向。
使用场景:用于与非托管代码交互时,指定参数的方向。
请看以下的P/Invoke调用,我们通过调用Windows C++的Api弹出对话框,其中,输入参数我们是可以用[In]关键字修饰的,这个通常情况下可以忽略不写。
```csharp
[DllImport("user32.dll")]
static extern int MessageBox([In] IntPtr hWnd, [In] string text, [In] string caption, uint type);

[Out](参数属性)

作用:用于 P/Invoke(平台调用),表示参数是输入参数。 特点:通常与 ref 或 out 一起使用,明确指定参数的方向。 使用场景:用于与非托管代码交互时,指定参数的方向。 请看以下的P/Invoke调用,当我们调用GetComputerName Api的时候,Api会返回计算机名称,但是这个名称是在lpBuffer变量中返回的。也就是说,在方法的内部对lpBuffer变量进行了赋值。这个参数我们把它叫做输出参数。用[Out]修饰。

[DllImport("kernel32.dll", SetLastError = true)]
static extern bool GetComputerName([Out] StringBuilder lpBuffer, ref uint nSize);