C#之可變參數,ref,out

來源:互聯網
上載者:User

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();

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.