值參數(Value Parameters) 1、傳遞的是參數的值(數據的副本)而不是原始數據本身。 2、函數內部對值參數的修改不會影響到原始數據。 3、通常用於傳遞基本數據類型(如整數、浮點數、布爾值)或不可變對象(如字元串、元組)。 4、值參數的傳遞是一種傳值調用(Call by Value)。 ...
值參數(Value Parameters)
1、傳遞的是參數的值(數據的副本)而不是原始數據本身。
2、函數內部對值參數的修改不會影響到原始數據。
3、通常用於傳遞基本數據類型(如整數、浮點數、布爾值)或不可變對象(如字元串、元組)。
4、值參數的傳遞是一種傳值調用(Call by Value)。
示例代碼
internal class Program
{
static void ShowDouble(int val)
{
val *= 2;
Console.WriteLine($"ShowDouble函數中val的值為:{val}");
}
static void Main(string[] args)
{
int val = 6;
Console.WriteLine($"Main函數中執行ShowDouble函數前val的值為:{val}");
ShowDouble(val);
Console.WriteLine($"Main函數中執行ShowDouble函數後val的值為:{val}");
}
}
運行結果,如下圖所示:
把val作為一個參數,調用ShowDouble()並不影響Main()中val的值
那麼如何改變val的值呢?
可以使用一個含返回值的函數
代碼如下所示:
internal class Program
{
static int ShowDouble(int val)
{
val *= 2;
Console.WriteLine($"ShowDouble函數中val的值為:{val}");
return val;
}
static void Main(string[] args)
{
int val = 6;
Console.WriteLine($"Main函數中執行ShowDouble函數前val的值為:{val}");
val = ShowDouble(val);
Console.WriteLine($"Main函數中執行ShowDouble函數後val的值為:{val}");
}
}
運行結果,如下所示:
成功改變了參數的值,但是這種方式並不直觀,且不能改變用作參數的多個變數的值(因為函數只有一個返回值),這時就可以通過引用來傳遞參數。
引用參數(Reference Parameters)
1、傳遞的是參數的引用(記憶體地址),直接操作原始數據。
2、函數內部對引用參數的修改會影響到原始數據。
3、通常用於傳遞可變對象(如列表、字典)或對象實例,以便在函數內部進行修改併在函數外部保持修改後的狀態。
4、引用參數的傳遞是一種傳址調用(Call by Reference)。
C#中使用ref關鍵字指定參數,代碼如下所示:
internal class Program
{
static void ShowDouble(ref int val)
{
val *= 2;
Console.WriteLine($"ShowDouble函數中val的值為:{val}");
}
static void Main(string[] args)
{
int val = 6;
Console.WriteLine($"Main函數中執行ShowDouble函數前val的值為:{val}");
ShowDouble(ref val);
Console.WriteLine($"Main函數中執行ShowDouble函數後val的值為:{val}");
}
}
運行結果,如下圖所示:
要註意,不僅在函數的聲明中要使用ref指定參數,如代碼 static void ShowDouble(ref int val)所示,在函數的調用中,也要再次指定它,如代碼 ShowDouble(ref val)所示。
使用ref的限制
1、函數可能會改變引用參數的值,所以必須在函數調用中要使用“非常量”變數
const int val = 6;
這種寫法,編譯器會報錯,如下圖所示:
2、必須使用初始化過的變數。C#不允許假定ref參數在使用它的函數中初始化。
int val;
ShowDouble(ref val);
這種寫法,編譯器也會報錯,如下圖所示:
參考書籍
《C#入門經典(第7版)》——Benjamin Perkins、Jacob Vibe Hammer、Jon D. Reid