早上 BoyLee 問我對 " Ref " 是否理解,很慚愧

temporalCount怎麼使用_System

,不知道這個關鍵字的用法,趕快學習了一下

temporalCount怎麼使用_初始化_02

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 = 
{ 1, 2, 3, 4, 5};

            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();
        }
    }

}運行結果:

temporalCount怎麼使用_System_03


Ref 在C#中被定義為方法參數。MSDN中對其描述如下:

ref 關鍵字使參數按引用傳遞。其效果是,當控制權傳遞迴調用方法時,在方法中對參數的任何更改都將反映在該變量中。

若要使用 ref 參數,則方法定義和調用方法都必須顯式使用 ref 關鍵字。


Out 是另一個C#中的方法參數。MSDN中對其描述如下:

out 關鍵字會導致參數通過引用來傳遞。

這與 ref 關鍵字類似,不同之處在於 ref 要求變量必須在傳遞之前進行初始化。

若要使用 out 參數,方法定義和調用方法都必須顯式使用 out 關鍵字。