在方法參數傳遞中,可以同時使用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在調用前不需給調用方法中的參數賦初值,參數在實際方法體中初始化。