直接通過例子進行說明吧
class PRogram { static void Write() { Console.WriteLine("Test output from function"); } static void Main(string[] args) { Write(); Console.ReadKey(); } }
(1)關鍵字:static 和 void
static與面向對象的思維有關系,我們在這里先默認每個函數都需要加上這個關鍵字;
void即使便是返回值為空的意思。、
(2)函數名后跟圓括號 e.g Write();
(3)圓括號里面可以有參數,這個放在后面再討論,
(4)一個要執行的代碼塊,放在花括號里面。
(1)當函數返回一個值時,可以采用以下兩種方式修改函數
a、在函數聲明中指定返回值得類型,但不使用關鍵字void;
b、使用return關鍵字結束函數的執行,把返回值傳送給調用代碼。
static <returnType> <functionName>(){ …… return <returnValue>;}(2)return 不一定要放在最后一行,也很經常用于直接跳出函數。
(1)當函數接受參數的時候,就必須指定下列內容
a、函數在其定義指定接受的參數列表,以及這些參數的類型;
b、在每個函數調用中匹配的參數列表。
c、其中可以有任意多個參數,每個參數都有一個類型和一個名稱,參數用逗號隔開。每個參數都在函數的代碼中用作一個變量。
(2)一個demo
namespace Exercise{ class Program { static int MaxValue(int[] intArray) { int maxVal = intArray[0]; for(int i=1;i<intArray.Length;i++) { if(intArray[i]>maxVal) { maxVal = intArray[i]; } } return maxVal; } static void Main(string[] args) { int[] myArray = { 1, 5, 7, 99, 7, 8, 9, 3 }; int maxVal = MaxValue(myArray); Console.WriteLine("The maximum value in myArray is {0}", maxVal); Console.ReadKey(); } }}運行結果是:

(3)參數匹配
在調用函數時,必須使參數與函數定義中指定的參數完全匹配,這意味著要匹配參數的類型、個數和順序。當然這樣子會導致我們重復寫同樣的代碼,僅僅是因為參數類型的小改變,但是后面我們會有傳說中的重載函數來解決這個問題。
(4)參數數組
C#允許定義一個(只能指定一個)特定的參數,這個參數必須是函數定義中參數列表的最后一個,稱之為參數數組。參數數組可以使用個數不定的參數調用函數,規定用關鍵字params關鍵字定義。
一個demo:
namespace Exercise{ class Program { static int SumVals(params int[] vals) { int sum = 0; foreach (int val in vals) { sum += val; } return sum; } static void Main(string[] args) { int sum = SumVals(1, 5, 7, 9, 05, 4, 8, 0, 6, 4); Console.WriteLine(sum); Console.ReadKey(); } }}(5)引用參數和值參數

然后我們調用這個函數

我們會發現,我們對參數進行的double操作并不會影響Main()中的值
但是我們在這里有一個引用的方法,可以講參數和引入變量綁定在一起,也就是說參數成為了引入變量的一個別名,實際上是一樣的東東,方法就是使用ref關鍵字進行指定才參數。
然后在函數調用中我們需要再一次指定ref參數,demo如下
class Program { static void ShowDouble(ref int val) { val *= 2; Console.WriteLine("val doubled = {0}",val); } static void Main(string[] args) { int myNumeber = 5; Console.WriteLine("myNumber = {0}", myNumeber); ShowDouble(ref myNumeber); Console.WriteLine("myNumber = {0}", myNumeber); } }Attention:C#不允許假定ref參數在使用它的函數中初始化,也就是說調用的參數一定要有賦值過。
(6)輸出參數
除了按引用傳遞值之外,還可以使用out關鍵字,指定所給的的參數是一個輸出參數,out關鍵字和ref關鍵字的使用方法相同,執行的原理與引用參數一樣,但是有一些重要的區別:
a、把未賦值的變量用作ref參數是非法的,但可以把未賦值的變量作out參數。
b、另外,在函數使用out參數時,out參數必須看成未賦值。換句話說,out參數會遺忘原有的數值。
現在寫一個demo
class Program { static int MaxValue(int[] intArray,out int maxIndex) { int maxVal = intArray[0]; maxIndex = 0; for(int i=1;i<intArray.Length;i++) { if(intArray[i]>maxVal) { maxVal = intArray[i]; maxIndex = i; } } return maxVal; } static void Main(string[] args) { int[] myArray = {3,5,6,77,4,24,234,26,536,7,6577,8}; int maxIndex; Console.WriteLine("The maximum value in myArray is {0}",MaxValue(myArray,out maxIndex)); Console.WriteLine("The first occurrence of this value is at element {0}",maxIndex); Console.ReadKey(); } }namespace Exercise{ class Program { static void Main(string[] args) { int i; for(i=0;i<10;i++) { string text = "Line" + Convert.ToString(i); Console.WriteLine("{0}", text); } Console.WriteLine("Last text output in loop: {0}", text); } }}由于text是循環里的局部變量,所以跳出循環之后就不能在使用text了。然后修改一下
class Program { static void Main(string[] args) { int i; string text; for(i=0;i<10;i++) { text = "Line" + Convert.ToString(i); Console.WriteLine("{0}", text); } Console.WriteLine("Last text output in loop: {0}", text); } }這段代碼依舊會是編譯出錯,原因是必須在使用變量前對其進行聲明和初始化,而text是在for循環里面初始化的,賦給text的值在循環快退出時就丟失了,但是還可以進行如下的修改
class Program { static void Main(string[] args) { int i; string text=""; for(i=0;i<10;i++) { text = "Line" + Convert.ToString(i); Console.WriteLine("{0}", text); } Console.WriteLine("Last text output in loop: {0}", text); } }這次代碼就是先在循環外進行了初始化。所以在這里我們需要掌握一個好的習慣就是在聲明一個變量的時候最好是記得進行初始化,這樣的話即使出錯,我們也可以很容易的得知是那個變量出現了問題,還有就是避免這些問題的發生,
這鐘變量最好是少使用,一般我們也是很少進行使用的,盡量的進行避免。但是如果全局都需要經常訪問的話,全局變量的優勢就會體現出來。
在局部變量和全局變量的名字發生沖突的時候,局部變量會掩蓋全局變量。
Main()是C#應用程序的入口和出口。就是說Main()函數是整個函數的框架。

(1)第三四種版本會返回一個int值,他們可以用于表示程序如何終止,通常作為一種錯誤提示,如果是正常關閉的話,就是返回0。
(2)Main()的可選參數args是從應用程序的外部接受信息的方法,這些信息在運行期間指定,其形式是命令行參數。也就是說在執行控制臺應用程序時,指定的任何命令參數都放在這個args數組中,然后可以根據需要在Main()中使用這些參數。
然后這里有個簡單的demo
namespace Exercise{ class Program { static void Main(string[] args) { Console.WriteLine("{0} command line argument were specified:", args.Length); foreach(string arg in args) { Console.WriteLine(arg);
新聞熱點
疑難解答