長時間沒有看好多基礎性的東西都給忘光光了,趁最近有時間整理下吧.下面是c#常用的四種類型的參數.
一、按值傳遞參數
值參數是通過將實參的值復制到形參,來實現按值傳遞到方法,也就是我們通常說的按值傳遞。
方法被調用時,CLR做如下操作:
1、在托管堆棧中為形參分配空間;
2、將實參的值復制到形參。
這個太常用了,按值傳遞參數,是復制一份,因此不影響原來參數的值。
class Program
{
public static int Foo(int i, out int j)
{
i++;
j = 100;
return i + j;
}
public static int Foo(int i,int j)
{
i++;
j++;
return i + j;
}
static void Main(string[] args)
{
int i = 1;
int j = 2;
int k = Foo(i, j);
Console.WriteLine(i);//1
Console.WriteLine(j);//2
Console.WriteLine(k);//5
}
}
二、按引用傳遞參數 — 關鍵字ref
和前面的“按值傳遞”相對應的是按引用傳遞。顧名思義,這裡傳遞的不在是值,而是引用。注意這裡不是傳遞一個復制品了,而是將真實的自己傳到方法中。
注意點:
1、按引用傳遞的參數,系統不再為形參在托管棧中分配新的內存。
2、此時,形參名其實已經成為實參名的一個別名,它們成對地指向相同的內存位置。
class Program
{
public static int Foo(int i, out int j)
{
i++;
j = 100;
return i + j;
}
public static int Foo(ref int i,ref int j)
{
i++;
j++;
return i + j;
}
static void Main(string[] args)
{
int i = 1;
int j = 2;
int k = Foo(ref i, ref j);
Console.WriteLine(i);//2
Console.WriteLine(j);//3
Console.WriteLine(k);//5
}
}
三、輸出參數 – 關鍵字out
輸出參數和引用參數有一定程度的類似,輸出參數可用於將值從方法內傳遞到方法外,實際上就相當於有多個返回值。要使用輸出參數只需要將引用參數的ref關鍵字替換為out關鍵字即可。但又一點必須注意,只有變量才有資格作為輸出參數,文本值和表達式都不可以,這點要謹記。
注意兩個問題:
1、編譯器允許在方法中的任意位置、任意時刻讀取引用參數的值。
2、編譯器禁止在為輸出參數賦值前讀取它。
這意味著輸出參數的初始值基本上是沒意義的,因為它在使用前要被賦予新的值。因此想通過輸出參數將值傳入方法的路是行不通的。
class Program
{
public static int Foo(int i, out int j)
{
i++;
j = 100;
return i + j;
}
static void Main(string[] args)
{
int i = 1;
int j = 2;
int k = Foo( i, out j);
Console.WriteLine(i);//1
Console.WriteLine(j);//100
Console.WriteLine(k);//102
}
}
四、參數數組 – 關鍵字params
參數數組:
public class Program
{
static void Main(string[] args)
{
int count1 = Plus(1); //輸出 1
Console.WriteLine(count1);
int count2 = Plus(1, 2, 3);//輸出 6
Console.WriteLine(count2);
int count3 = Plus(); //輸出 0 參數數組本身可選,沒傳入值也不會出錯
{
Console.WriteLine(count3);
}
Console.ReadKey();
}
public static int Plus(params int[] values)
{
int count = 0;
foreach (int i in values)
{
count = count + i;
}
return count;
}
}
另外再補充兩個C# 4.0的新特性可選參數與命名參數:
1、可選參數
可選參數,顧名思義,它不是必需的。對於一般的參數,如果不為它指定值,可能會導出運行出錯。但是可選參數不會。
可選參數的規則:
1、可選參數不能為參數列表第一個參數,它必須位於所有必選參數之後;
2、可選參數必須指定一個默認值;
3、可選參數的默認值必須是一個常量表達式;
4、所有可選參數以後的參數都必須是可選參數。
public class Program
{
static void Main(string[] args)
{
int count1 = Plus(5); //當不指定可選參數時,是默認值
Console.WriteLine(count1); //輸出 15
int count2 = Plus(5,5); //當指定可選參數時,有默認值
Console.WriteLine(count2); //輸出 10
Console.ReadKey();
}
public static int Plus(int i, int j = 10)
{
return i + j;
}
}
2、命名參數
可選參數解決的是參數默認值的問題,而命名參數解決的是參數順序的問題,命名參數將我們從記憶每個方法數目繁多的參數列表中解放了出來。讓你可以不按順序輸入參數。
public class Program
{
static void Main(string[] args)
{
//string str = "字符串";
//int i = 10;
//Console.WriteLine(Plus(str:str,i:i)); //雖然很怪異,但這3行代碼是能正常運行的
Console.WriteLine(Plus(str:"字符串",i:10)); //注意順序與方法簽名參數中的不一樣
Console.ReadKey();
}
public static string Plus(int i, string str)
{
return str + i.ToString();
}
}