C#——函數

一、函數的定義(如下圖)

函數,參數,返回值三者的關係(如例1)

  • 函數可能有返回值,可能會有參數。
  • 返回值是函數的執行結果,參數是函數做事所需要的一些數據。

例1:

  1. namespace 函數  
  2. {  
  3.     class Program  
  4.     {  
  5.         static void Main(string[] args)  
  6.         {  
  7.             string s = Console.ReadLine();     //返回值,執行結果  
  8.             Console.WriteLine("1234");         //參數,做事所需要的一些數據  
  9.             int i = Convert.ToInt32("123");    //既有參數,又有返回值  
  10.         }  
  11.     }  
  12. }  

二、函數的分類

(1).net自制的函數

  如例1中的ReadLine()函數,WriteLine()函數,Convert.ToInt32()函數 等等

(2)自己寫的函數

                         如例2,例3中的ReadInt()函數

先自己寫函數,然後再調用自己寫的函數。

例2:

  1. namespace 函數1  
  2. {  
  3.     class Program  
  4.     {  
  5.         static void Main(string[] args)  
  6.         {  
  7.             int i = ReadInt();  
  8.             i++;  
  9.             Console.WriteLine(i);  
  10.             Console.ReadKey();  
  11.   
  12.         }  
  13.         static int ReadInt()  
  14.         {  
  15.             //return "3"; //函數返回的數據類型必須和聲明的返回值類型一樣(不嚴謹)  
  16.             return 3;  //return後跟要返回的數據  
  17.         }  
  18.     }  
  19. }  

函數一旦有返回值類型,就一定要有返回值,返回值的類型必須和聲明的返回值類型一樣,return後跟返回值。

例3:

  1. namespace 函數1  
  2. {  
  3.     class Program  
  4.     {  
  5.         static void Main(string[] args)  
  6.         {  
  7.             int i = ReadInt();  
  8.             i++;  
  9.             Console.WriteLine(i);  
  10.             Console.ReadKey();  
  11.         }  
  12.   
  13.         /* 
  14.         static int ReadInt() 
  15.         { 
  16.             string s = Console.ReadLine(); 
  17.             int i = Convert.ToInt32(s); 
  18.             return i; 
  19.         } 
  20.          */  
  21.   
  22.         //另一種寫法:直接返回  
  23.         static int ReadInt()  
  24.         {  
  25.             string s = Console.ReadLine();  
  26.             return Convert.ToInt32(s);   //直接將ToInt32的返回值返回,買空賣空!  
  27.         }  
  28.     }  
  29. }  

注意:函數的執行順序是先進來,再回來

例4:自己寫的有返回值的函數無返回值的函數

  1. namespace 函數2  
  2. {  
  3.     class Program  
  4.     {  
  5.         static void Main(string[] args)  
  6.         {  
  7.                
  8.         }  
  9.         //自己寫函數  
  10.         static int CT(string s)  
  11.         {  
  12.             if (s == "tom")  
  13.             {  
  14.                 return 1;  
  15.             }  
  16.             if (s == "herry")  
  17.             {  
  18.                 return 0;  
  19.             }  
  20.             return -1;   //一旦有返回值類型,就一定要有返回值。  
  21.         }  
  22.         static void SayHello()    //函數如果沒有返回值則標記返回值類型爲void.  
  23.         {  
  24.             int i = 3;  
  25.             if (i > 10)  
  26.             {  
  27.                 return;  
  28.             }  
  29.             Console.WriteLine("哈嘍哇!");  
  30.             Console.ReadKey();  
  31.         }  
  32.     }  
  33. }  


自己寫函數要注意:

函數一旦有返回值類型,就一定要有返回值。

函數如果沒有返回值則標記返回值類型爲void.

return語句,導致函數立即返回。

在返回值爲void的函數中return,在返回值非void的函數中return數值

三、函數的參數

函數的參數可分爲可變參數非可變參數

(1)非可變參數

非可變參數:參數的個數是確定的(如例5,例6,例7中自己寫的函數的參數個數都是確定的)。

 

確定函數參數的原則:自己能確定的數據自己內部解決,自己確定不了的數據通過參數傳遞。

函數的參數不只一個,函數可以有兩個參數(如例5)

函數的參數不但可以是簡單的數據類型,還可以是數組(如例6)

例5:計算兩個整數中的最大值:Int Max(int i1,int i2)

  1. namespace 函數3  
  2. {  
  3.     class Program  
  4.     {  
  5.         static void Main(string[] args)  
  6.         {  
  7.             //計算兩個整數中的最大值:Int Max(int i1,int i2)  
  8.             Console.WriteLine(Max(30,50));  
  9.             Console.ReadKey();  
  10.         }  
  11.         static int Max(int i1,int i2)   //函數可以有兩個參數  
  12.         {  
  13.             if (i1 > i2)  
  14.             {  
  15.                 return i1;  
  16.             }  
  17.             return i2;  
  18.         }  
  19.     }  
  20. }  

例6:計算數組中所有元素的和

參數可以是數組

  1. namespace 函數4  
  2. {  
  3.     class Program  
  4.     {  
  5.         static void Main(string[] args)  
  6.         {  
  7.             //計算輸入數組的和  
  8.             int[]values={3,5,6,9};  
  9.             int sum = Sum(values);  
  10.             Console.WriteLine(sum);  
  11.             Console.ReadKey();  
  12.   
  13.         }  
  14.         static int Sum(int[]values)  
  15.         {  
  16.             int sum = 0;  
  17.             foreach (int i in values)  
  18.             {  
  19.                 sum = sum + i;  
  20.             }  
  21.             return sum;  
  22.         }  
  23.     }  
  24. }  

注意:函數內部的變量名和函數外部的變量名沒有任何的關係。(只是看起來名字重複,其實沒有任何關係。)

      static void Main(string[] args)
        {
            //計算輸入數組的和
            int[]values={3,5,6,9};
            int sum= Sum(values);
            Console.WriteLine(sum);
            Console.ReadKey();

        }


        static int Sum(int[]values)
        {
            int sum = 0;
            foreach (int i in values
            {
                sum = sum+ i;
            }
            return sum;
        }

如上例中的valuesvalues,sumsum只是看起來名字重複,其實沒有任何關係。

練習:有一個string數組按某個特定符號來分隔(問題描述如下)

string[] strs={"aa","333","ccc"};

返回給我一個字符串,然後字符串使用我指定的分隔符進行分割,比如我指定用"|"分割,那麼返回給我”aa|333|ccc“

具體步驟:

確定函數參數的返回值類型:stringJoin(string[] strs,string seperator)

確定參數:string Join(string[] strs,string seperator)

代碼(如例7)

  1. namespace 函數5  
  2. {  
  3.     class Program  
  4.     {  
  5.         static void Main(string[] args)  
  6.         {  
  7.             string[] names = {"tom","jerry","lucy"};  
  8.             string s=Join(names,"|");  
  9.             Console.WriteLine(s);  
  10.             Console.ReadKey();  
  11.         }  
  12.         //定義的這個函數要把字符串數組按某個特定符號來分隔  
  13.         static string Join(string[] strs, string seperator)  //注意:C#中函數名字要大寫字母開頭  
  14.         {  
  15.             string result = "";  
  16.             for (int i = 0; i < strs.Length - 1; i++)  
  17.             {  
  18.                 result = result + strs[i]+seprator;  
  19.             }  
  20.             if(strs.Length>0)  
  21.             {  
  22.                 result=result+strs[strs.Length-1];  
  23.             }  
  24.             return result;  
  25.         }  
  26.     }  
  27. }  

c#的命名規範:

C#中函數名字、類的名字都要大寫字母開頭,

參數的名字,變量的名字都要小寫字母開頭,而且起的變量的名字和參數的名字要有意義。

 

(2)可變參數

 

可變參數:參數的個數可以動態增加的,在參數前面加params關鍵字。

如例7下面的Console.WriteLline()函數,它的參數就是可變參數。

例7:

  1. namespace 函數的可變參數  
  2. {  
  3.     class Program  
  4.     {  
  5.         static void Main(string[] args)  
  6.         {  
  7.             Console.WriteLine("{0}{1}{2}{3}{4}",3,4,5,8,90,7,9,50,"a","agg");  
  8.             Console.ReadKey();  
  9.         }  
  10.     }  
  11. }  

 

可變參數也可以和非可變參數一起來用的。

使用可變參數據注意的問題,可變參數必須是所有參數中的最後一個,不能把它提到前面的。(如例8)。

例8

  1. namespace 可變參數和非可變參數  
  2. {  
  3.     class Program  
  4.     {  
  5.         static void Main(string[] args)  
  6.         {  
  7.             SayHello("tom","張大虎","狗蛋");  
  8.             Console.ReadKey();  
  9.         }  
  10.   
  11.         //非可變參數(名字), 可變參數(呢稱)一起用。注意,可變參數必須是所有參數中的最後一個  
  12.         static void SayHello(string name, params string[] nicknames)  
  13.         {  
  14.             Console.WriteLine("我的名字是{0}",name);  
  15.             foreach (string nickname in nicknames)  
  16.             {  
  17.                 Console.WriteLine("我的暱稱是:{0}",nickname);  
  18.             }  
  19.         }  
  20.     }  
  21. }  

四、函數重載(函數重名)

 

 

函數的默認值:是用函數重載來實現的

函數重載:其實就是函數的重名

函數的名字是可以重複,條件是函數的參數必須是不一致(不嚴謹)

 

如:例9

  1. namespace 函數重載  
  2. {  
  3.     class Program  
  4.     {  
  5.         //函數重載:就是函數的重名,但是函數的參數必須不一致。  
  6.         static void Main(string[] args)  
  7.         {  
  8.             SayHello("王大壯");  
  9.             SayHello("tom");  
  10.             SayHello(20);  
  11.             Console.ReadKey();  
  12.   
  13.         }  
  14.         static void SayHello(string name)  
  15.         {  
  16.             Console.WriteLine("大家好,我是{0}",name);  
  17.         }  
  18.   
  19.         /*    報錯:重名的函數,參數不能一樣 
  20.         static void SayHello(string name) 
  21.         { 
  22.             Console.WriteLine("Hello,I am {0}",name); 
  23.         } 
  24.         */  
  25.         static void SayHello(int age)  
  26.         {  
  27.             Console.WriteLine("我{0}歲了",age);  
  28.         }  
  29.     }  
  30. }  

函數能否重載(能否重名),取決於參數的格式,與返回值無關。(只要函數的參數一樣了,就不能重載)      

如例11:

  1. namespace 函數重載2  
  2. {  
  3.     class Program  
  4.     {  
  5.         static void Main(string[] args)  
  6.         {  
  7.             //函數重載:就是函數重名,條件是函數的參數個數或者是參數的類型必須不一致。  
  8.             SayHello("tom""小懶貓");  
  9.             SayHello("王大壯");  
  10.             SayHello("tom");  
  11.             SayHello(20);  
  12.               
  13.             /* 
  14.             string s = SayHello("jerry"); //報錯:函數是否能重載(是否能重名),取決於參數的格式,與返回值無關。 
  15.              */  
  16.   
  17.             Console.ReadKey();  
  18.         }  
  19.   
  20.         static void SayHello(string name)  
  21.         {  
  22.             Console.WriteLine("大家好,我是{0}", name);  
  23.         }  
  24.   
  25.         static void SayHello(int age)         //參數的類型不一樣,可以重載  
  26.         {  
  27.             Console.WriteLine("我{0}歲了", age);  
  28.         }  
  29.   
  30.         /* 
  31.         //報錯:函數的參數一樣了,不可以重載(哪怕是你有返回值,我無返回值或者是兩個返回值的類型不一致都不可以重載) 
  32.         static string SayHello(string name) 
  33.         { 
  34.             return "大家好,我是:"+name;    
  35.         } 
  36.         */  
  37.   
  38.         static void SayHello(string name, string nickname)   //參數的個數不一樣,可以重載  
  39.         {  
  40.             Console.WriteLine("我的名字是{0},我的暱稱是{1}",name,nickname);  
  41.         }  
  42.     }  
  43. }  


只要函數的參數一樣了,哪怕是你有返回值,我無返回值或者是兩個返回值的類型不一致,都不可以重載。

只有參數的類型不一樣,參數的個數不一樣,就可以構成重載。  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章