Files
Csharp/C#基础/Lesson8_ref和out/Program.cs
T
2025-09-30 16:49:43 +08:00

144 lines
4.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
namespace Lesson
{
class Program
{
#region 知识点一 学习ref和out的原因
//他们可以解决 在函数内部改变外部传入的内容 里面变了 外面也要变
#endregion
#region 知识点二 ref和out的使用
//函数参数的修饰符
//当传入的值类型参数在内部修改 或引用类型参数在内部重新声明时
//外部的值会发生变化
#endregion
#region 知识点三 ref和out的区别
//1.ref传入的变量必须在外部初始化,out不用
//2.out传入的变量必须在内部赋值,ref不用
//1
//int a;
//ChangeValueRef(ref a);//报错
//ChangeValueOut(out a);//不报错
//2
// static void ChangeValueOut(out int value)
// {
// value = 99;//不赋值报错
// }
#endregion
//ref(在函数类型参数前用ref修饰
static void ChangeValueRef(ref int value)
{
value = 99;
}
static void ChangeArrayRef(ref int[] arr)
{
arr = new int[] { 99, 99, 99 };
}
//out(在函数类型参数前用out修饰
static void ChangeValueOut(out int value)
{
value = 99;
}
static void ChangeArrayOut(out int[] arr)
{
arr = new int[] { 99, 99, 99 };
}
static void ChangeValue(int value)
{
value = 99;
}
static void ChangeArrayValue(int[] arr)
{
arr[0] = 99;//将arr2的地址传给arr,两个地址指向的地址都一样,再将地址上的值从1改为99
}
static void ChangeArrayValue2(int[] arr)
{
arr = new int[] { 99 };//将arr2的地址传给arr,两个地址指向的地址都一样,
//在新开一个arr数组,但此时arr和arr2的联系断了,
//arr新开了一个地址来存放99,arr2还是1
}
static void Main(string[] args)
{
Console.WriteLine("尝试直接使用函数修改a的值到99:");
//试图使用函数修改a的值
int a = 1;
ChangeValue(a);
Console.WriteLine(a);//外部值不变
//在值类型和引用类型中有讲到,这是值类型,新开内存,拷贝值
Console.WriteLine("尝试直接使用函数修改arr2[0]的值到99");
int[] arr2 = { 1, 2, 3 };//复原
ChangeArrayValue(arr2);
Console.WriteLine(arr2[0]);//内外同值99
//在值类型和引用类型中有讲到,这是引用类型,不新开,直接拷贝地址,arr2和函数的arr指向同一地址
Console.WriteLine("尝试直接使用函数修改arr2[0]的值到99:(但在函数中new了一个数组)");
arr2 = new int[] { 1, 2, 3 };//复原
ChangeArrayValue2(arr2);
Console.WriteLine(arr2[0]);//外部值不变
//引用类型,但是在函数内新开了内存,arr2和arr指向的不是同一地址,只修改了函数内部arr[0]的值
//如果在函数中new了一个数组,那么怎么保持内外部统一一个值呢
//ref和out就是来解决这个问题的
//用ref来改变值类型的值
Console.WriteLine("使用ref函数修改a的值到99");
a = 1;//复原
ChangeValueRef(ref a);//需要在传入参数时也加上ref修饰符
Console.WriteLine(a);//内外同值99
//用ref来改变引用类型的值
arr2 = new int[] { 1,2,3 };//复原
Console.WriteLine("使用ref函数修改arr2[]的值到99(在函数中new了一个数组)");
ChangeArrayRef(ref arr2);
Console.WriteLine(arr2[0]);//内外同值99
//用out来改变值类型的值
Console.WriteLine("使用out函数修改a的值到99");
a = 1;//复原
ChangeValueOut(out a);
Console.WriteLine(a);
//用out来改变引用类型的值
Console.WriteLine("使用out函数修改arr2[]的值到99(在函数中new了一个数组)");
arr2 = new int[] { 1, 2, 3};
ChangeArrayOut(out arr2);
Console.WriteLine(arr2[0]);
}
}
}