最近在寫程序時遇到params,ref,out 參數問題。回頭有自習看了看MSDN,才鞏固了基礎。現在和大家分享一下。
params
params 關鍵字在方法成員的參數列表中使用,為該方法提供了參數個數可變的能力,它在只能出現一次并且不能在其后再有參數定義(之前可以)。
示例:
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
class App
{
//第一個參數必須是整型,但后面的參數個數是可變的。
//而且由于定的是object數組,所有的數據類型都可以做為參數傳入
public static void UseParams(int id, params object[] list)
{
Console.WriteLine(id);
for (int i = 0; i < list.Length; i++)
{
Console.WriteLine(list[i]);
}
}
static void Main()
{
//可變參數部分傳入了三個參數,都是字符串類型
UseParams(1, "a", "b", "c");
//可變參數部分傳入了四個參數,分別為字符串、整數、浮點數和雙精度浮點數數組
UseParams(2, "d", 100, 33.33, new double[] {1.1, 2.2});
Console.ReadLine();
}
}
}
ref
ref 關鍵字使參數按引用傳遞。其效果是,當控制權傳遞回調用方法時,在方法中對參數所做的任何更改都將反映在該變量中。
1.若要使用 ref 參數,則方法定義和調用方法都必須顯式使用 ref 關鍵字。
2.傳遞到 ref 參數的參數必須最先初始化。這與 out 不同,out 的參數在傳遞之前不需要顯式初始化。
3.屬性不是變量,因此不能作為 ref 參數傳遞。
4.盡管 ref 和 out 在運行時的處理方式不同,但它們在編譯時的處理方式是相同的。因此,如果一個方法采用 ref 參數,而另一個方法采用 out 參數,則無法重載這兩個方法。例如,從編譯的角度來看,以下代碼中的兩個方法是完全相同的。如果嘗試這么做,將導致不能編譯該代碼。
5.如果一個方法采用 ref 或 out 參數,而另一個方法不采用這兩類參數,則可以進行重載。
示例:
按引用傳遞值類型是有用的,但是 ref 對于傳遞引用類型也是很有用的。這允許被調用的方法修改該引用所引用的對象,因為引用本身是按引用來傳遞的。
using System;
class App
{
public static void UseRef(ref int i)
{
i += 100;
Console.WriteLine("i = {0}", i);
}
static void Main()
{
int i = 10;
// 查看調用方法之前的值
Console.WriteLine("Before the method calling: i = {0}", i);
UseRef(ref i);
// 查看調用方法之后的值
Console.WriteLine("After the method calling: i = {0}", i);
Console.Read();
}
}
out
out 關鍵字會導致參數通過引用來傳遞。這與 ref 關鍵字類似。
與 ref 的不同之處:
1.ref 要求變量必須在傳遞之前進行初始化。
2.盡管作為 out 參數傳遞的變量不需要在傳遞之前進行初始化,但需要調用方法以便在方法返回之前賦值。
示例:
與 ref 示例不同的地方只要將 ref 改為 out,然后變量 i 僅需要聲明即可。
static void Main()
{
//int i = 10; 改為
int i;
}