14.函数参数中的不同修饰符

  1. 14.函数参数中的不同修饰符
    1. 14.1 题目
    2. 14.2 深入解析
    3. 14.3 答题示例
    4. 14.4 关键词联想

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 深入解析

下面三种参数传递方式对比:

  1. 按值传递(Test1)

    private static void Test1(int value)
    {
        value += 90;  // 修改的是局部拷贝
    }
    
    • value 在栈上开辟新空间,拷贝了外部传入的 test1Value(10)。
    • 对局部 value 的修改不会影响原变量。
    • 结果A 处打印原值 10
  2. 按指针传递(Test2)

    private unsafe static void Test2(int* value)
    {
        *value += 90;  // 通过指针直接修改外部内存
    }
    
    • 传入的是 test2Value 的地址,函数内 *value 指向原变量。
    • 修改 *value 会直接改变 test2Value
    • 结果B 处打印修改后值 100(10 + 90)。
  3. 按引用传递(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

×

喜欢就点赞,疼爱就打赏