• C#方法参数传递-同时使用ref和out关键字


    在方法参数传递中,可以同时使用ref和out关键字,但是要注意ref和out参数传递的不同。

    using System;
    class Program
    {
    static void Main()
    {
        Program obj = new Program();
        int score = 55; //声明原来分数
        int refscore, outscore; //声明两个变量
        obj.ChangeScore(score, ref refscore, out outscore);
        Console.WriteLine("您原来的分数是{0},调整后的分数为{1},加平时表现分后{2}",
          score, refscore, outscore);
        Console.ReadKey();
    }
    private void ChangeScore(int score, ref int refscore, out int outscore)
    {
        if (score > 50 && score < 60)
        {
          refscore = 60;
        }
        if (refscore > 60)
        {
          outscore = refscore + 5;
        }
    }
    }

    以上代码编译时会出现两个错误,我们只声明了变量refscore,并没有给变量显示赋值。所以出现第一个错误:使用了未赋值的局部变量“refscore”。out关键字传递参数时,必须被调用方法内修改参数,用if语句判断,只有符合条件的out参数赋值,不符合条件的out参数没有赋值,所以出现了“控制离开方法之前必须对out参数outscore赋值”错误。

    using System;
    class Program
    {
    static void Main()
    {
        Program obj = new Program();
        int score = 55; //声明原来分数
        int refscore = 0, outscore; //声明两个变量
        obj.ChangeScore(score, ref refscore, out outscore);
        Console.WriteLine("您原来的分数是{0},调整后的分数为{1},加平时表现分后{2}",
          score, refscore, outscore);
        Console.ReadKey();
    }
    private void ChangeScore(int score, ref int refscore, out int outscore)
    {
        if (score > 50 && score < 60)
        {
          refscore = 60;
        }
        if (refscore > 60)
        {
          outscore = refscore + 5;
        }
        else
        {
          outscore = refscore;
        }
    }
    }

    以下内容供参考:

    一、值参数与引用参数及输出参数的区别:
    1、值参数中实参的值不随形参值变更而变更;
    形参与实参值互不影响,实参传递给形参时,栈中就为其分配另外一部分空间。这样,两个参数变更时而互不影响。
    2、引用参数及输出参数中实参的值会随形参值变更而变更;
    (形参:在定义函数中指定的形参,在未出现函数调用时,它们并不占内存中的存储单元。只有在发生函数调用时,函数中形参才被分配内存单元。在调用结束后,形参所占的内存单元也被释放。调用时将实参的值赋绐形参);
    引用参数与输出参数中,实参在栈中分配空间。当实参传递给形参时,会将地址传递给形参,即传送的指针,这样形参变更时,实参也会随著变更。

    二、引用参数与输出参数区别:
    1、使用ref与out参数时,方法中参数及调用参数都需要加Ref或out关键字。
    2、使用ref参数与out参数得到的结果是一样的,区别是:ref在调用前需给调用方法中的参数赋初值。out在调用前不需给调用方法中的参数赋初值,参数在实际方法体中初始化。

  • 相关阅读:
    Array互转xml
    Android检测网络是否可用
    [LeetCode#117]Populating Next Right Pointers in Each Node II
    [LeetCode#23]Merge k Sorted Lists
    [LeetCode#83]Remove Duplicates from Sorted List
    [LeetCode#147]Insertion Sort List
    [LeetCode#55, 45]Jump Game, Jump Game II
    [LeetCode#125]Valid Palindrome
    [LeetCode#]Populating Next Right Pointers in Each Node
    [LeetCode#134]Gas Station
  • 原文地址:https://www.cnblogs.com/shiyh/p/6705674.html
Copyright © 2020-2023  润新知