14.函数参数中的不同修饰符
14.1 题目
using System;
class Program
{
static unsafe void Main(string[] args)
{
int test1Value = 10;
Test1(test1Value);
Console.WriteLine($"A:{test1Value}");
int test2Value = 10;
Test2(&test2Value);
Console.WriteLine($"B:{test2Value}");
int test3Value = 10;
Test3(ref test3Value);
Console.WriteLine($"C:{test3Value}");
Console.ReadKey();
}
private static void Test1(int value)
{
value += 90;
}
private unsafe static void Test2(int* value)
{
*value += 90;
}
private static void Test3(ref int value)
{
value += 90;
}
}
请问A、B、C 三处打印结果分别为多少?为什么?
14.2 深入解析
下面三种参数传递方式对比:
按值传递(Test1)private static void Test1(int value) { value += 90; // 修改的是局部拷贝 }value在栈上开辟新空间,拷贝了外部传入的test1Value(10)。- 对局部
value的修改不会影响原变量。 - 结果:
A处打印原值 10。
按指针传递(Test2)private unsafe static void Test2(int* value) { *value += 90; // 通过指针直接修改外部内存 }- 传入的是
test2Value的地址,函数内*value指向原变量。 - 修改
*value会直接改变test2Value。 - 结果:
B处打印修改后值 100(10 + 90)。
- 传入的是
按引用传递(Test3)private static void Test3(ref int value) { value += 90; // 引用同一块内存,直接修改外部变量 }ref参数和原变量绑定在同一地址,函数内对value的操作即作用于test3Value。- 结果:
C处打印 100(10 + 90)。
14.3 答题示例
“Test1 使用按值传递,修改的是局部拷贝,所以 A 打印 10;
Test2 传入指针并通过*value += 90直接修改原变量,B 打印 100;
Test3 用ref引用传递,同样修改了外部test3Value,C 打印 100。”
14.4 关键词联想
- 按值传递(Value Copy)
- 指针传递(Unsafe,
int*) - 引用传递(
ref) - 局部拷贝 vs 原地修改
- 栈上分配 vs 共享内存
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com