1、可變參數
在C#4.0中增加了許多新的特性,這裡我主要說一下——可變參數數組:int sum(params int[] values) ;int sum(string name,params int[] values)
注意:可變參數數組必須是最後一個,而且可變參數是C4.0中才有的特性。
參數預設值(C#4.0) :void SayHello(string name,int age=20)(*瞭解) 注意:參數預設值的設定也必須是在非預設值參數的後面。
static void Main(string[] args)
{
int[] values = { 3, 5, 2, 9, 7 };
Max(true, "", values);
int i = Max(values);
int j = Max(true, "Hello", 3, 5, 2, 97, 7);
int i = Max(3,3,5);
Console.WriteLine(j);
string[] values1 = Console.ReadLine();
Console.WriteLine("{0},{1}", 3, 5, 6, 9, 3, 3, 90, 9);
SayHello("鄒玉傑");
SayHello(“YuJie", 24);
Console.ReadKey();
}
//個數不確定的可變參數以數組的形式傳遞
static int Max(bool b, string msg, params int[] values)
{
Console.WriteLine(msg);
int max = 0;
foreach (int value in values)
{
if (value > max)
{
max = value;
}
}
return max;
}
static void SayHello(string name,int age)
{
Console.WriteLine("我是{0},我{1}歲",name,age);
}
static void SayHello(string name)
{
SayHello(name, 20); //用重載來實現參數預設值的效果,在建構函式中用的特別多
}
函數參數預設是值傳遞的,也就是“複製一份”,例子:
int age=20;
IncAge(age);
Console.WriteLine("age={0}",age);
2、ref and out
ref必須先初始化,因為是引用,所以必須先“有”,才能引用,如果不先初始化,調用的時候就取不到值會報錯,而out則是內部為外部賦值,所以不需要初始化,而且外部初始化也沒用,但是在方法內部一定要記得為其賦值,不然返回個空的東西,有什麼用?根本就沒有意義了。
ref應用情境內部對外部的值進行改變,out則是內部為外部變數賦值,out一般用在函數有多個傳回值的場所。
static void Main(string[] args)
{
int i1 = 1;
DotIt(i1);
Console.WriteLine(i1);
int i1 = 10;
int i2 = 20;
//Swap(i1, i2);
Console.WriteLine("i1={0},i2={1}", i1, i2); //返回的結果依舊是10,20,因為Swap(i1, i2)方法處理的是變數i1,i2的拷貝或者說是副本,變數i1,i2原先的值並沒有因此而改變。
//用ref之前必須給變數賦值
Swap(ref i1, ref i2);//傳遞引用。給ref傳遞參數的時候也要加上ref
Console.WriteLine("i1={0},i2={1}", i1, i2);
bool b= false;//不需要為out賦值
int i = Parse(Console.ReadLine(), out b);
if (b)
{
Console.WriteLine("成功,i={0}", i);
}
else
{
Console.WriteLine("錯誤");
}
Console.ReadKey();
}
//int i傳進來的的時候是複製了一份傳進來,折騰的是複製品
static void DotIt(int i)
{
Console.WriteLine(i);
i++;
Console.WriteLine(i);
}
static void Swap(ref int i1, ref int i2)//reference→ref
{
//標記為ref就是要求調用者傳遞變數的引用
int temp = i1;
i1 = i2;
i2 = temp;
}
static void Swap(int i1, int i2)
{
int temp = i1;
i1 = i2;
i2 = temp;
}
static int Parse(string s,out bool success)
{
//Console.WriteLine(success); //這樣會報錯,因為success沒有為其賦值
if(s=="一")
{
success = true;
return 1;
}
else if(s=="二")
{
success = true;
return 2;
}
else
{
success = false;
return -1;
}
}
關於異常處理,除非萬不得已,不然盡量不要使用try catch 語句,切記!(案例:兩個變數的交換;int.TryParse。)
string s = Console.ReadLine();
int i;
if (int.TryParse(s, out i))
{
Console.WriteLine("成功:" + i);
}
else
{
Console.WriteLine("輸入錯誤");
}
//int i = Convert.ToInt32(s);
//i++;
//Console.WriteLine(i);
Console.ReadKey();