C#基礎知識,長見識了——函數傳參
一、原來函數這樣傳參
先看一個函數和函數調用。
復制代碼
static void Main(string[] args)
{
int num = 10;
Test(num);//局部變量在使用之前賦值
//Test(10); //直接為局部變量賦值
}
static void Test(int i)//i 相當於一個局部變量
{
i++;
}
復制代碼
Test函數定義了一個int 類型的變量i作為參數,這個地方相當於聲明了一個局部變量,而局部變量使用之前必須賦值,這就是為什麼函數使用的時候要賦值(傳一個值進去)。
假如不想給參數賦值怎麼辦?那就在函數聲明參數的時候給參數(局部變量)賦值,這樣調用函數的時候就可以不給參數傳值。如下:
復制代碼
static void Main(string[] args)
{
int x= Test();//可以不傳值
int y= Test(20);//也可以傳值
Console.WriteLine(x);
Console.WriteLine(y);
Console.Read();
}
static int Test(int i=10)//為局部變量賦值,傳參數的時候可以不為i賦值
{
i++;
return i;
}
復制代碼
注意:賦初值的參數必須放在參數列表最右側,可以有多個帶初值的參數。
作用:為參數賦了初值,在調用的時候可以賦值也可以不賦值,作用是為參數指定默認值,。
static void Test(int a,int b=20, int i=10)
{
//to do
}
二、params 參數數組
我們知道數組的長度是不可變的。當我們把一個數組作為參數傳遞的時候,想改變數組長度不是一件容易的事兒。params 參數數組就可以隨便指定參數長度,也不用在傳參的時候去特意定義一個數組傳參。使用非常方便。
例:
復制代碼
static void Main(string[] args)
{
int[] arr = new int[]{1,2,4,5,6};
Test1(arr);
Console.WriteLine();
Test2(1,2,4,56,78,8,4);
Console.WriteLine();
Test2(1,5,7);
Console.Read();
}
static void Test1(int [] arr )
{
for (int i = 0; i < arr .Length ; i++)
{
Console.Write(arr [i]+" ");
}
}
static void Test2(params int[] arr) //params 數組
{
for (int i = 0; i < arr.Length; i++)
{
Console.Write(arr [i]+" ");
}
}
復制代碼
params 參數數組,作為參數的時候,參數個數是可變的,當然也可以為0,但是用params 參數數組的時候,一個函數裡只有一個params參數,並且必須放在參數列表的最後。
總結:params 參數修飾的數組相當於長度可變的參數數組。它是修飾參數的一個關鍵字。用處就是在不知道參數個數或參數個數有可能發生變化的情況下使用。
三、ref和out參數修飾符
值類型在傳遞值的時候,只是復制了一份值賦給另一個變量,另一個變量改變並不能改變原有的值。例如:
int num = 200;
int a = num;
a -= 100;
Console.WriteLine(num);//輸出200
Console.WriteLine(a);//輸出100
但是,假如num代表我錢包裡的錢,我把錢包交給別人(int a=num),別人用了100(a-=100),這時候,我錢包裡的錢(num)應該是多少?按照上面的方式執行就會出錯,錢包裡的錢是不會變的,因為在傳值的時候只是復制了num的一份值給a,a改變並不會改變num的值。那該怎麼辦???
如果我傳遞的值是num的引用(可以理解為地址),那麼a 改變了num就也會改變了。但是int 類型是值傳遞,怎麼辦,把它變為引用就要用到ref和out參數。
ref和out參數的作用就是把值傳遞改為引用傳遞。
改寫上面的錢包的例子。
復制代碼
static void Main(string[] args)
{
int num = 200;
int res =Test(ref num );
Console.WriteLine(num );//輸出100
Console.WriteLine(res );//輸出100
Console.Read();
}
static int Test(ref int a)
{
a -= 100;
return a;
}
復制代碼
ref 在使用之前必須賦初始值,它主要側重於改變,修改值。使用ref,在函數聲明與調用的時候必須在參數前面加上ref。out參數的作用與使用方法與ref類似,與ref不同的是out在使用前不必賦初始值,但在返回的時候必須為他賦值,所以out主要側重於輸出。
out修飾符參數例子:
復制代碼
static void Main(string[] args)
{
int num = 200;
int b;
int a = TestOut(200,out b);
Console.WriteLine(a);//輸出100
Console.WriteLine(b);//輸出200
Console.Read();
}
static int TestOut(int a,out int b)
{
b = a;
a -= 100;
return a;
}
復制代碼
總結:ref和out參數修飾符,都是把參數按引用類型傳遞,但是ref側重於改變值,而out側重於輸出。一個函數只有一個輸出值,但想返回多個值的時候就用out參數修飾符。
ref在使用之前必須賦值,out在返回之前必須賦值。ref和out在函數使用和調用的時候,參數前面必須加ref和out參數。