程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#中ref和out的差別淺析

C#中ref和out的差別淺析

編輯:C#入門知識

C#中ref和out的差別淺析。本站提示廣大學習愛好者:(C#中ref和out的差別淺析)文章只能為提供參考,不一定能成為您想要的結果。以下是C#中ref和out的差別淺析正文


在C#中經由過程應用辦法來獲得前往值時,平日只能獲得一個前往值。是以,當一個辦法須要前往多個值的時刻,就須要用到ref和out,那末這兩個辦法差別在哪兒呢?

MSDN:
       ref 症結字使參數按援用傳遞。其後果是,當掌握權傳遞回挪用辦法時,在辦法中對參數所做的任何更改都將反應在該變量中。若要應用 ref 參數,則辦法界說和挪用辦法都必需顯式應用 ref 症結字。
      out 症結字會招致參數經由過程援用來傳遞。這與 ref 症結字相似,分歧的地方在於 ref 請求變量必需在傳遞之進步行初始化。若要應用 out 參數,辦法界說和挪用辦法都必需顯式應用 out 症結字。

案例:

      界說一個辦法,求一個整數數組中的最年夜值,最小值,和,均勻數。假如是一個辦法只能有一個前往值,那只能每個都得界說一個辦法來完成,不外有了ref和out這完成起來就便利多了。

ref:


static int GetIntResult(int[] arry, ref float avg, ref int max, ref int min)
        {
            int sum = 0;
            max = arry[0];
            min = arry[0];
            for (int i = 0; i < arry.Length; i++)
            {
                sum += arry[i];
              
                if (max < arry[i])
                {
                    max = arry[i];
                }
                if (min > arry[i])
                {
                    min = arry[i];
                }
            }
            avg = sum / arry.Length;
            return sum;
        }

然後在掌握台中試著挪用該辦法:


static void Main(string[] args)
        {
            int[] arr = { 1,2,3,4,5,6,7,8,9};
            float avg;
            int max;
            int min;
            int sum = GetIntResult(arr, ref avg, ref max, ref min);
        }

此時編譯器就會提醒畫紅線,毛病:應用了未賦值的avg,max,min


static void Main(string[] args)
        {
            int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            float avg = 0;
            int max = 0;
            int min = 0;
            int sum = GetIntResult(arr, ref avg, ref max, ref min);
            Console.WriteLine("和:{0}\t均勻值:{1}\t最年夜值:{2}\t最小值:{3}", sum, avg, max, min);
            Console.Read();
        }

運轉成果:

總結:

      ref這個症結字告知c#編譯器被傳遞的參數值指向與挪用代碼中變量雷同的內存。如許,假如被挪用的辦法修正了這些值然後前往的話,挪用代碼的變量也就被修正了。

      ref 症結字使參數按援用傳遞。其後果是,當掌握權傳遞回挪用辦法時,在辦法中對參數所做的任何更改都將反應在該變量中(avg,max,min的初始值為0,挪用辦法後值轉變)。若要應用 ref 參數,則辦法界說和挪用辦法都必需顯式應用 ref 症結字。

out:

      換成out以後,下面的辦法不再實用,報錯,毛病 : 掌握分開以後辦法之前必需對 out 參數“min”和"max"賦值。你會發明這裡max和min在輪回外並未初始化。所以才會失足。

修正子女碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Wolfy.RefAndOut
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            float avg;//在應用out症結字時,不須要在此處初始化,初始化也不會影響到辦法外部的值,所以你初始化沒用
            int max;
            int min;
            int sum = GetIntResult(arr, out avg, out max, out min);
            Console.WriteLine("和:{0}\t均勻值:{1}\t最年夜值:{2}\t最小值:{3}", sum, avg, max, min);
            Console.Read();
        }
        static int GetIntResult(int[] arry, out float avg, out int max, out int min)
        {
            int sum = 0;
            max = arry[0];
            min = arry[0];//應用out症結字時,必需在分開辦法前對out症結字潤飾的參數初始化
            for (int i = 0; i < arry.Length; i++)
            {
                sum += arry[i];
              
                if (max < arry[i])
                {
                    max = arry[i];
                }
                if (min > arry[i])
                {
                    min = arry[i];
                }
            }
            avg = sum / arry.Length;
            return sum;
        }
    }
}

   成果和下面一樣。

總結:
       out 症結字會招致參數經由過程援用來傳遞。這與 ref 症結字相似,分歧的地方在於 ref 請求變量必需在傳遞之進步行初始化。若要應用 out 參數,辦法界說和挪用辦法都必需顯式應用 out 症結字。

結論:

       症結字“ref“和”out”之間的獨一差別就是症結字”out“不請求挪用代碼初始化要傳遞的參數值。那末症結字‘ref”甚麼時刻用呢?當您須要確保挪用辦法曾經初始化參數值的時刻,您就應當應用症結字“ref”。在下面例子中,可以或許應用“out“是由於被挪用的辦法其實不依附於被傳遞的變量的值。個中味道漸漸領會......

後話:

      在一服裝論壇t.vhao.net外面,有時看到有如許的帖子,就趁便總結了一下,也算是回想一下c#基本常識吧。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved