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#基本常識吧。