【原】 C#关键字 Ref 学习笔记

早上 BoyLee 问我对 " Ref " 是否理解,很惭愧,不知道这个关键字的用法,赶快学习了一下

using System;
using System.Collections.Generic;
using System.Text;

namespace RefDemo
{
    
class Program
    
{
        
/// <summary>
        
/// 演示值类型的Ref用法
        
/// </summary>
        
/// <param name="i"></param>

        static void Method_1(ref int i)
        
{
            i 
= 7;
        }

        
/// <summary>
        
/// 演示引用类型的Ref用法
        
/// </summary>
        
/// <param name="str"></param>

        static void Method_2(ref string str)
        
{
            str 
= "Bechham";
        }


        
static void Method_3(int i)
        
{
            i 
= 7;
        }


        
static void Method_4(string str)
        
{
            str 
= "Bechham";
        }


        
/// <summary>
        
/// 演示数组的Ref用法
        
/// </summary>
        
/// <param name="arr"></param>

        static void Method_5(int[] arr)
        
{
            
for (int i = 0; i < arr.Length; i++)
                arr[i] 
= 0;
        }

        
/// <summary>
        
/// 演示数组的Ref用法
        
/// </summary>
        
/// <param name="arr"></param>

        static void Method_6(string[] arr)
        
{
            
for (int i = 0; i < arr.Length; i++)
                arr[i] 
= "Catherine";
        }


        
/// <summary>
        
/// 演示值类型的Out用法
        
/// </summary>
        
/// <param name="i"></param>

        static void Method_7(out int i)
        
{
            i 
= 7;
        }

        
/// <summary>
        
/// 演示引用类型的Out用法
        
/// </summary>
        
/// <param name="str"></param>

        static void Method_8(out string str)
        
{
            str 
= "Bechham";
        }


        
static void Main(string[] args)
        
{
            
int val_1 = 22;             // 使用Ref,需要初始化
            Method_1(ref val_1);

            
string str_2 = "Kaka";      // 使用Ref,需要初始化
            Method_2(ref str_2);

            Console.WriteLine(
"Number:{0},Name:{1}", val_1, str_2);

            Console.WriteLine(
"------------------------------");

            
int val_3 = 10;
            Method_3(val_3);            
// 值改变

            
string str_4 = "Zidane";
            Method_4(str_4);            
// 值改变

            Console.WriteLine(
"Number:{0},Name:{1}", val_3, str_4);

            Console.WriteLine(
"------------------------------");

            
int[] arr_5 = 12345};

            
for (int i = 0; i < arr_5.Length; i++)
                Console.WriteLine(
"Array(" + i + "):" + arr_5[i].ToString());

            Method_5(arr_5);            
// 这里没有使用REF 参数. 

            
for (int i = 0; i < arr_5.Length; i++)
                Console.WriteLine(
"Array(" + i + "):" + arr_5[i].ToString());

            Console.WriteLine(
"------------------------------");

            
string[] arr_6 = "ktgu""lee""lion"};

            
for (int i = 0; i < arr_6.Length; i++)
                Console.WriteLine(
"Array(" + i + "):" + arr_6[i].ToString());

            Method_6(arr_6);            
// 这里没有使用REF 参数. 

            
for (int i = 0; i < arr_6.Length; i++)
                Console.WriteLine(
"Array(" + i + "):" + arr_6[i].ToString());

            Console.WriteLine(
"------------------------------");

            
int val_7;                  // 使用Out,不需要初始化
            Method_7(out val_7);

            
string str_8;               // 使用Out,不需要初始化
            Method_8(out str_8);

            Console.WriteLine(
"Number:{0},Name:{1}", val_7, str_8);          

            Console.ReadLine();
        }

    }

}

运行结果:


Ref 在C#中被定义为方法参数。MSDN中对其描述如下:
ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数的任何更改都将反映在该变量中。
若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。


Out 是另一个C#中的方法参数。MSDN中对其描述如下:
out 关键字会导致参数通过引用来传递。
这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。
若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字。

原文地址:https://www.cnblogs.com/temptation/p/1155840.html