using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
/* 先來了解一下什麼是實參, 什麼是形參.
所謂形參其實也就是說函數定義的時候所帶的參數. 比如 static void Myfuntion(int i , int t) 其中 int i and int t 都是形參.
* 而實參呢? 實參代表的是将要傳入函數裡面進行運算的兩個參數, 可以是變量,也可以是常量.隻要與形參類型相同即可*/
// 函數分為傳值與傳址兩種方式. 傳值不影響實參的資料,傳址則會影響實參的資料. 下面用幾段代碼來示例
//在使用傳值或者傳址的選擇上應當遵循這樣一個規則.
//1. 傳值是将形參的内容複制一份給實參.
//2. 傳址是将形參與實參同時指向一個位址.
//如果在資料較大的情況下使用傳值的方式必然會影響程式性能, 是以當資料較大時可以使用傳址的方式.使用傳址的方式會讓程式的效率大大提升.
static void Myfuntion(int i , int t) //這個函數将以傳值的方式運作
{
if (i > t)
i += 5;
else
t += 5;
}
static void Myfuntion1(ref int i, ref int t) // 這個函數将會以傳址的方式進行運算. 因為前面加了ref關鍵字, 函數隻要加了ref關鍵字就會是以傳址的方式進行運算
{
if (i > t)
i += 5;
else
t += 5;
}
static void Myfuntion2(int[] array) //這裡注意, 這個函數沒有帶ref關鍵字, 但是也是以傳址的方式進行運算. 因為在C#中,引用類型都是以傳址的方式進行運算,而array屬于數組, 數組又屬于引用類型,是以....
{
for (int i = 0; i < array.Length; i++)
{
array[i] = 40;
}
}
static void Myfuntion3 (int i , int t , out int s) //這個函數雖然傳回值為Void(代表沒有傳回值) , 其實有傳回值 因為我們加了一個新的關鍵字, out , 這個關鍵字能夠将 s 單獨傳回. 同樣out關鍵字也是以傳址的方式進行運算的. 還有,out 參數可以不用指派,即使你指派了也會被忽略
{
s = 50;
if (i > t)
i += 5;
else
t += 5;
}
static void Main(string[] args)
{
// 現在我們來使用上面定義的四個函數,看看效果是怎樣的.
int a = 10, b = 15, c;
//1. 傳值方式的函數
Myfuntion(a, b); // 這個時候a and b 還是等于 10 和 15 , 因為函數中的形參雖然改變結果了. 但是不會影響到實參.
Console.WriteLine("a : {0} and b : {1}",a,b + "\n");
// 2. 傳址方式的函數
Myfuntion1(ref a, ref b); //這裡要注意, 函數中使用了ref關鍵字,在調用的時候也要使用ref關鍵字. 此時的結果應該是a = 10 b = 20 因為上面的代碼是傳址方式的, 形參發生了改變也會影響到實參
Console.WriteLine("a : {0} and b : {1}",a,b + "\n");
// 3.隐式的傳址方式函數.
int[] My = new int[5]; //定義一個數組并且為它指派
for (int i = 0; i < My.Length; i++)
{
My[i] = 30;
}
// 現在調用函數
Myfuntion2(My); //結果可想而知, my的每一位都會等于 50
foreach (int w in My)
{
Console.WriteLine(w);
Console.WriteLine();
}
// 4. out 參數函數
Myfuntion3(a, b, out c); //同樣, 和ref一樣在調用的時候也需要加上關鍵字
Console.WriteLine(c); // c應該會等于 50
//我們試試把C指派了之後再調用函數,看看會發生什麼.
c = 90;
Myfuntion3(a, b, out c);
Console.WriteLine(c); //還是會等于50;
}
}
}
// 下面是運算結果
/* a : 10 and b : 15
-------------------
a : 10 and b : 20
------------------
40
40
40
40
40
----------------------
50
----------------------
50
* */