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#教程。