一、函數的定義(如下圖)
函數,參數,返回值三者的關係(如例1)
-
函數可能有返回值,可能會有參數。
-
返回值是函數的執行結果,參數是函數做事所需要的一些數據。
例1:
- namespace 函數
- {
- class Program
- {
- static void Main(string[] args)
- {
- string s = Console.ReadLine(); //返回值,執行結果
- Console.WriteLine("1234"); //參數,做事所需要的一些數據
- int i = Convert.ToInt32("123"); //既有參數,又有返回值
- }
- }
- }
二、函數的分類
(1).net自制的函數
如例1中的ReadLine()函數,WriteLine()函數,Convert.ToInt32()函數 等等
(2)自己寫的函數
如例2,例3中的ReadInt()函數
先自己寫函數,然後再調用自己寫的函數。
例2:
- namespace 函數1
- {
- class Program
- {
- static void Main(string[] args)
- {
- int i = ReadInt();
- i++;
- Console.WriteLine(i);
- Console.ReadKey();
- }
- static int ReadInt()
- {
- //return "3"; //函數返回的數據類型必須和聲明的返回值類型一樣(不嚴謹)
- return 3; //return後跟要返回的數據
- }
- }
- }
函數一旦有返回值類型,就一定要有返回值,返回值的類型必須和聲明的返回值類型一樣,return後跟返回值。
例3:
- namespace 函數1
- {
- class Program
- {
- static void Main(string[] args)
- {
- int i = ReadInt();
- i++;
- Console.WriteLine(i);
- Console.ReadKey();
- }
- /*
- static int ReadInt()
- {
- string s = Console.ReadLine();
- int i = Convert.ToInt32(s);
- return i;
- }
- */
- //另一種寫法:直接返回
- static int ReadInt()
- {
- string s = Console.ReadLine();
- return Convert.ToInt32(s); //直接將ToInt32的返回值返回,買空賣空!
- }
- }
- }
注意:函數的執行順序是先進來,再回來。
例4:自己寫的有返回值的函數,無返回值的函數
- namespace 函數2
- {
- class Program
- {
- static void Main(string[] args)
- {
- }
- //自己寫函數
- static int CT(string s)
- {
- if (s == "tom")
- {
- return 1;
- }
- if (s == "herry")
- {
- return 0;
- }
- return -1; //一旦有返回值類型,就一定要有返回值。
- }
- static void SayHello() //函數如果沒有返回值則標記返回值類型爲void.
- {
- int i = 3;
- if (i > 10)
- {
- return;
- }
- Console.WriteLine("哈嘍哇!");
- Console.ReadKey();
- }
- }
- }
自己寫函數要注意:函數一旦有返回值類型,就一定要有返回值。
函數如果沒有返回值則標記返回值類型爲void.
return語句,導致函數立即返回。
在返回值爲void的函數中return,在返回值非void的函數中return數值。
三、函數的參數
函數的參數可分爲可變參數和非可變參數
(1)非可變參數
非可變參數:參數的個數是確定的(如例5,例6,例7中自己寫的函數的參數個數都是確定的)。
確定函數參數的原則:自己能確定的數據自己內部解決,自己確定不了的數據通過參數傳遞。
函數的參數不只一個,函數可以有兩個參數(如例5)
函數的參數不但可以是簡單的數據類型,還可以是數組(如例6)
例5:計算兩個整數中的最大值:Int Max(int i1,int i2)
- namespace 函數3
- {
- class Program
- {
- static void Main(string[] args)
- {
- //計算兩個整數中的最大值:Int Max(int i1,int i2)
- Console.WriteLine(Max(30,50));
- Console.ReadKey();
- }
- static int Max(int i1,int i2) //函數可以有兩個參數
- {
- if (i1 > i2)
- {
- return i1;
- }
- return i2;
- }
- }
- }
例6:計算數組中所有元素的和
參數可以是數組
- namespace 函數4
- {
- class Program
- {
- 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;
- }
- }
- }
注意:函數內部的變量名和函數外部的變量名沒有任何的關係。(只是看起來名字重複,其實沒有任何關係。)
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;
}
如上例中的values和values,sum和sum只是看起來名字重複,其實沒有任何關係。
練習:有一個string數組按某個特定符號來分隔(問題描述如下)
string[] strs={"aa","333","ccc"};
返回給我一個字符串,然後字符串使用我指定的分隔符進行分割,比如我指定用"|"分割,那麼返回給我”aa|333|ccc“
具體步驟:
確定函數參數的返回值類型:stringJoin(string[] strs,string seperator)
確定參數:string Join(string[] strs,string seperator)
代碼(如例7)
- namespace 函數5
- {
- class Program
- {
- static void Main(string[] args)
- {
- string[] names = {"tom","jerry","lucy"};
- string s=Join(names,"|");
- Console.WriteLine(s);
- Console.ReadKey();
- }
- //定義的這個函數要把字符串數組按某個特定符號來分隔
- static string Join(string[] strs, string seperator) //注意:C#中函數名字要大寫字母開頭
- {
- string result = "";
- for (int i = 0; i < strs.Length - 1; i++)
- {
- result = result + strs[i]+seprator;
- }
- if(strs.Length>0)
- {
- result=result+strs[strs.Length-1];
- }
- return result;
- }
- }
- }
c#的命名規範:
C#中函數名字、類的名字都要大寫字母開頭,
參數的名字,變量的名字都要小寫字母開頭,而且起的變量的名字和參數的名字要有意義。
(2)可變參數
可變參數:參數的個數可以動態增加的,在參數前面加params關鍵字。
如例7下面的Console.WriteLline()函數,它的參數就是可變參數。
例7:
- namespace 函數的可變參數
- {
- class Program
- {
- static void Main(string[] args)
- {
- Console.WriteLine("{0}{1}{2}{3}{4}",3,4,5,8,90,7,9,50,"a","agg");
- Console.ReadKey();
- }
- }
- }
可變參數也可以和非可變參數一起來用的。
使用可變參數據注意的問題,可變參數必須是所有參數中的最後一個,不能把它提到前面的。(如例8)。
例8
- namespace 可變參數和非可變參數
- {
- class Program
- {
- static void Main(string[] args)
- {
- SayHello("tom","張大虎","狗蛋");
- Console.ReadKey();
- }
- //非可變參數(名字), 可變參數(呢稱)一起用。注意,可變參數必須是所有參數中的最後一個
- static void SayHello(string name, params string[] nicknames)
- {
- Console.WriteLine("我的名字是{0}",name);
- foreach (string nickname in nicknames)
- {
- Console.WriteLine("我的暱稱是:{0}",nickname);
- }
- }
- }
- }
四、函數重載(函數重名)
函數的默認值:是用函數重載來實現的
函數重載:其實就是函數的重名
函數的名字是可以重複,條件是函數的參數必須是不一致(不嚴謹)
如:例9
- namespace 函數重載
- {
- class Program
- {
- //函數重載:就是函數的重名,但是函數的參數必須不一致。
- static void Main(string[] args)
- {
- SayHello("王大壯");
- SayHello("tom");
- SayHello(20);
- Console.ReadKey();
- }
- static void SayHello(string name)
- {
- Console.WriteLine("大家好,我是{0}",name);
- }
- /* 報錯:重名的函數,參數不能一樣
- static void SayHello(string name)
- {
- Console.WriteLine("Hello,I am {0}",name);
- }
- */
- static void SayHello(int age)
- {
- Console.WriteLine("我{0}歲了",age);
- }
- }
- }
函數能否重載(能否重名),取決於參數的格式,與返回值無關。(只要函數的參數一樣了,就不能重載)
如例11:
- namespace 函數重載2
- {
- class Program
- {
- static void Main(string[] args)
- {
- //函數重載:就是函數重名,條件是函數的參數個數或者是參數的類型必須不一致。
- SayHello("tom", "小懶貓");
- SayHello("王大壯");
- SayHello("tom");
- SayHello(20);
- /*
- string s = SayHello("jerry"); //報錯:函數是否能重載(是否能重名),取決於參數的格式,與返回值無關。
- */
- Console.ReadKey();
- }
- static void SayHello(string name)
- {
- Console.WriteLine("大家好,我是{0}", name);
- }
- static void SayHello(int age) //參數的類型不一樣,可以重載
- {
- Console.WriteLine("我{0}歲了", age);
- }
- /*
- //報錯:函數的參數一樣了,不可以重載(哪怕是你有返回值,我無返回值或者是兩個返回值的類型不一致都不可以重載)
- static string SayHello(string name)
- {
- return "大家好,我是:"+name;
- }
- */
- static void SayHello(string name, string nickname) //參數的個數不一樣,可以重載
- {
- Console.WriteLine("我的名字是{0},我的暱稱是{1}",name,nickname);
- }
- }
- }
只要函數的參數一樣了,哪怕是你有返回值,我無返回值或者是兩個返回值的類型不一致,都不可以重載。只有參數的類型不一樣,參數的個數不一樣,就可以構成重載。