C#ref、out、in关键字教程解释了ref/out/in关键字之间的区别并展示了如何使用它们。
在C#中,方法参数默认是copy传递的。我们使用ref关键字通过引用传递值。当我们通过引用传递值时,该方法接收到对实际值的引用。修改后会影响原始值。ref要求在传递变量之前对其进行初始化。ref修饰符必须用在方法定义和方法调用中。out和in关键字是对ref的一些修改。
out关键字也可以通过引用传递参数。与ref不同,它不需要预先初始化传递的变量。要使用out参数,方法定义和调用方法都必须显式使用out关键字。
in关键字导致参数通过引用传递,但确保参数未被修改。作为in参数传递的变量必须在方法调用中传递之前进行初始化。
重载方法时,它们的签名不能仅由in、ref和out区别。当一个方法没有其中一个修饰符而另一个方法有时,重载是可能的。
in、ref和out修饰符具有以下限制:
- 它们不能用在异步方法中
- 它们不能用在包含yieldreturn或yieldbreak语句的interator方法中
C#ref修饰符示例
以下示例使用ref关键字来更改两个变量的值。
int a = 4;
int b = 7;
Console.WriteLine("Outside Swap method");
Console.WriteLine($"a is {a}");
Console.WriteLine($"b is {b}");
Swap(ref a, ref b);
Console.WriteLine("Outside Swap method");
Console.WriteLine($"a is {a}");
Console.WriteLine($"b is {b}");
void Swap(ref int a, ref int b)
{
int temp = a;
a = b;
b = temp;
Console.WriteLine("Inside Swap method");
Console.WriteLine($"a is {a}");
Console.WriteLine($"b is {b}");
}
原始变量在Swap方法中被改变。
Swap(ref a, ref b); ... void Swap(ref int a, ref int b)
请注意,方法调用和方法定义都使用了ref关键字。
$ dotnet run Outside Swap method a is 4 b is 7 Inside Swap method a is 7 b is 4 Outside Swap method a is 7 b is 4
C#输出修饰符示例
以下示例使用了out修饰符。
ReadName(out string? name);
Console.WriteLine(name);
void ReadName(out string? name) {
Console.Write("Enter your name: ");
name = Console.ReadLine();
}
在示例中,我们读取了用户的输入。输入存储在具有out修饰符的变量中。name变量在使用前未定义。
ReadName(out string? name);
...
void ReadName(out string? name) {
out关键字用于方法调用和定义。
$ dotnet run Enter your name: Peter Peter
C#修饰符示例
在下面的例子中,我们使用了in修饰符。
string msg = "an old falcon";
Modify(in msg);
void Modify(in string msg) {
msg = "a young eagle";
}
我们尝试修改msg变量,但编译以错误消息结束:errorCS8331:Cannotassigntovariable’instring’becauseitisareadonlyvariable
在本文中,我们介绍了C#ref、out和in关键字。
列出所有C#教程。
