C#編程基礎第六章:方法


一、為什么需要方法

方法是包含一系列語句的代碼塊,也可稱為函數。方法的作用是模塊化我們的程序,以及提高代
碼的可重用性和可共用性。方法也可以看作就是實現某個功能的工具。比如現實生活中我們想要喝果
汁可以自己動手榨果汁,也可以使用榨汁機這個工具來榨果汁,當然使用工具更簡單方便些,又比如
在我們程序中想要輸出一些信息到控制台,不用我們自己寫代碼來完成輸出信息的功能,而只要調用
Console 控制台類的 WriteLine 方法就可以實現輸出信息到屏幕的功能了。

二、方法的定義和調用

在 C#中,方法分為靜態方法與非靜態方法。非靜態方法也稱為實例方法。在聲明方法的語法中,
實例方法不帶 static 關鍵字,而靜態方法有 static 關鍵字修飾。在本章中我們只了解靜態方法,而
實例方法在以后的課程中再進行學習。

2.1、靜態方法

在類中定義靜態方法的語法如下。

[訪問修飾符]  static 返回類型 方法名 ([ 參數列表 ])
{ 
方法體; 
} 

對此語法結構,作以下說明。
1、訪問修飾符:可選,一般來說使用 public 和 private。默認為 private,這樣的方法只能在類
的內部調用。

2、返回類型:可以是常見的系統基本類型(如 void、int、float、string 等),也可以是自定義
的類型(如對象類型等)。值得注意的是,如果類型是 void,則代表方法沒有返回值;如果是其
它類型,則有返回值,方法體必須有 return 語句,通過 return 語句來返回結果。

3、方法名:如果是 public 修飾的方法,則采用帕斯卡命名法;否則,則采用駝峰命名法。

4、參數列表:可選,作用是接收用戶傳遞過來的數據。參數列表是由逗號分隔的變量組成的,每
個參數都要帶數據類型。

根據語法及說明,我們可以在類中定義一個最簡單的方法試試,代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {

        public static int Sum(int a, int b)
        {
            Console.WriteLine(a+"+"+b+"=");
            return a + b;
        }

        public static void Hello(String name)
        {
            Console.WriteLine("你好,"+name);
        }

        static void Main(string[] args)
        {
            Hello("張三");
            Hello("李四");
            Hello("王五");

            int r = Sum(1, 1);
            Console.WriteLine(r);
            Console.WriteLine(Sum(100, 200));
        }
    }
} 

通過上面的代碼,我們定義了一個最簡單的方法,訪問修飾符和參數列表都省略沒有寫,以及方
法也沒有返回值,所以方法的返回類型是 void,另外我們在本章中只了解靜態方法,所以在定義方法
時都要加上 static 靜態關鍵字, 然后我們可以看出其實現在定義的這個打招呼的方法跟之前我們一
直在用的 Main 方法只是方法名不一樣,其他的代碼完全一模一樣。

注意 :定義方法的代碼,可以寫在 Main 方法定義的前面,也可以寫在 Main 方法定義的后面,但
不能寫到 Main 方法的一對大括號中,這是初學者經常會犯的錯誤。

當然現在上面程序運行后,屏幕上並不會顯示大家好,而是什么都沒顯示。這是因為 Main 方法才
是程序的入口,程序運行時系統會自動調用 Main 方法,而我們定義的 Hello 方法沒有被調用,所以
Hello 方法里面的代碼沒有被執行。那么如果我們希望 Hello 方法在程序運行時可以被執行,就可以
在 Main 方法中調用 Hello 方法即可,代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication7
{
    class Program
    {
        static void add(int n)
        {
            int sum = 0;
            for (int i = 1; i <= n; i++)
            {
                sum = sum + i;
            }
            Console.WriteLine("和為:" + sum);
        }


        static void Main(string[] args)
        {
            add(100);
            add(95);
            add(999);
        }
    }
}

 

調用方法很簡單,只要寫方法名,后面再加上一對小括號就可以了。注意小括號必須要寫,無論
是定義方法還是調用方法,無論是有參數還是沒參數,都必須要有小括號。

課堂作業:定義一個 Introduce 自我介紹的方法,然后在 Main 方法中調用它,運行看效果。

2.2、方法的參數

 

最簡單的方法是不帶參又沒有返回值的方法,復雜一點的話我們可以定義帶參的方法,在方法中
定義參數的目的是接收要處理的信息和數據,比如你用榨汁機時必須要放入水果才可以榨汁,有些方
法在實現功能時,必須要先接收一些數據,則這些方法就要定義成帶參的方法,以及定義參數時必須
聲明數據類型,比如榨汁機只能接收水果,不能接收其它類型的東西。

在方法中,參數的定義方式一般是這樣的:

[訪問修飾符] 返回類型 方法名稱([ 參數類型 參數名1 1 ,參數類型 參數名 2, … ,  參數類型 參數名稱n n])
{
方法體
}

參數類型可以是系統類型,也可以是用戶自定義類型,參數的名稱的命名方式與變量類似,事實
上在方法中設定的參數可以在方法體內以變量的方式來使用,一個方法可以帶多個參數,但是在同一
個方法的參數列表中不能出現兩個名稱完全相同的參數。

接下來我們定義一個帶參的方法,實現求平方的功能,接收用戶輸入一個整數,代碼如下:

class Program
{
//定義一個求平方的方法
static void Square(int num)
{
Console.WriteLine(num + "的平方是:" + num * num);
}
//定義一個Main方法(主方法,程序的入口)
static void Main()
{
Square(8); //調用Square方法
}
}

注意定義方法時聲明了參數,那么在調用方法時就必須要傳入參數,我們可以把定義方法時的參
數叫做 形式參數,簡稱 形參,把調用時傳遞的參數叫做 實際參數,簡稱 實 參。實參可以是常量、變
量、表達式或者方法等。在調用時,實參的值將按順序傳遞給形參接收。在上例中 num 就是形參,而
調用方法時傳入的數字 8 就是實參。

課堂作業:

1、定義一個 FoodQuery 方法,接收用戶輸入星期幾,然后實現輸出飯堂對應菜單的功能。並在
Main 方法中調用它,運行看效果。

2、定義一個 Rectangle 方法,接收用戶輸入行數和列數,然后實現輸出對應行列數的矩形的功
能,然后在 Main 方法中調用它,運行看效果。

2.3、方法的返回值

最復雜的方法是又有參數又有返回值的方法,在方法中添加返回值的目的就是當方法執行完之后
可以將一個結果返回給調用這個方法的人。就好比榨汁機完成榨汁后會將果汁返回給使用榨汁機的人
一樣。在我們的程序中,一個方法在執行完畢后也需要有一個反饋信息,以告訴用戶執行的結果,這
個反饋我們可以用方法的返回值來實現。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        public static void M1()
        {
            Console.WriteLine("無參數也無返回值的方法");
        }

        public static void M2(int a)
        {
            a++;
            Console.WriteLine(a);
        }

        public static int M3(int a)
        {
            a++;
            return a; 
        }


        static void Main(string[] args)
        {
            M1();
            M1();
            M2(100);
            M2(200);

            int r1 = M3(500);
            Console.WriteLine(r1);
            r1 = M3(600);
            Console.WriteLine(r1);
        }
    }
}

在 C#程序中,方法如果有返回值,那么方法的類型就要由 void 空類型改為對應要返回的值的類
型,比如要返回一個整數,那么方法的類型就要改成 int 類型,要返回一個字符串的話,方法的類型
要改成 string 類型,以及方法如果有返回值的話,在方法體中就必須要有 return 語句,我們通過
return 語句將值返回,return 語句的基本語法如下:

return 表達式; ;

下面我們定義一個簡單的求次方的方法,能接收兩個整型的數,然后計算次方並將結果作為返回
值返回給調用者,比如接收的整數是 2 和 3,那么就要運算 2 的 3 次方,結果為 8。代碼如下:

class Program
{
//定義一個求次方的方法
static int Power(int num1, int num2)
{
int result = 1;
for(int i=0;i<num2;i++)
{
result *= num1;
}
return result;
}
//定義一個Main方法(主方法,程序的入口)
static void Main()
{
//調用Power方法並將返回的結果輸出
Console.WriteLine(Power(2,3));
}
}

課堂作業:

1、定義一個 Max 方法,接收用戶輸入兩個數,然后判斷並返回較大的數,並在 Main 方法中調用
它,以及將得到的較大的數輸出到控制台,最后運行看效果。

2、定義一個 Average 方法,接收一個整型數組,然后計算出平均值並返回結果,然后在 Main 方
法中定義一個整型數組並初始化,接着調用這個方法並傳入數組,最后將得到的結果找個變量保存再
輸出到控制台。

            String ip = "192.168.0.256";
            String[] ips = ip.Split('.');
            for (int i = 0; i < ips.Length; i++)
            {
                int temp = Convert.ToInt32(ips[i]);
                Console.WriteLine(ips[i]);
                if (temp > 255)
                {
                    Console.WriteLine("錯誤");
                }
                else
                {
                    Console.WriteLine("正確");
                }
            }
View Code

三、方法重載

在 C#中,允許同一個類的 2 個或 2 個以上的方法有同一個名字,只要它們的參數聲明不同即
可,這種情況被稱為 方法重載。

當一個重載方法被調用時,C#用參數的類型或參數的數量來表明實際調用的是哪個重載方法。因
此,每個重載方法的參數類型或參數數量必須是不同的。這里面,跟方法的返回值是否相同沒有關
系。

其實,我們非常熟悉的 Console 類的 WriteLine()方法有多達 19 種重載方式,它可以輸出各種形
式的數據,如下所示(部分):

public static void WriteLine();
public static void WriteLine(int);
public static void WriteLine(float);
public static void WriteLine(char);
public static void WriteLine(bool);
public static void WriteLine(double);
public static void WriteLine(string);

接下來我們嘗試定義多個實現數據相加的方法,代碼如下:

 

class Program
{
//方法重載:方法名相同,參數類型或個數不同
static int Add(int x,int y)
{
return x+y;
}
static int Add(int x,int y,int z)
{

return x+y+z;
}
static double Add(double x,double y)
{
return x+y;
}
static void Main()
{
//調用方法並輸出結果
Console.WriteLine(Add(10,20));
Console.WriteLine(Add(10,20,30));
Console.WriteLine(Add(5.3,6.6));
}
}

 

注意 :當調用重載的方法時,編譯器會根據傳入的參數自動進行判斷,決定調用哪個方法。

課堂作業: 定義兩個 Show 方法,第一個 Show 方法接收整數、第二個 Show 方法接收整型數組,如果接收的是整數則輸出該整數,如果接收的是數組則將數組內所有元素取出並輸出。

求最大數

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication10
{
    class Program
    {

        public static int Max(int a, int b, int c)
        {
            if (a > b && a > c)
            {
                return a;
            }
            else if (b > a && b > c)
            {
                return b;
            }
            else
            {
                return c;
            }
        }

        public static int Max(int a, int b)
        {
            return a > b ? a : b;
        }

        public static int Max(params int[] a)
        {
            Array.Sort(a); 
            return a[a.Length-1];
        }

       
        static void Main(string[] args)
        {
            Console.WriteLine(Max(5,3,9));
            Console.WriteLine(Max(5, 3));

            int[] a = {1,4,5,6,0,9,88,98,78,985,-99};
            Console.WriteLine(Max(a));

            Console.WriteLine(Max(1,4,5,9,6,3,1,2));
            Console.WriteLine(Max(1));
            Console.WriteLine(Max(200,300,500,100,700,50));
        }
    }
}

 ASCII編碼與轉換

            //把字符轉換成數字
            Console.WriteLine(Convert.ToInt32('A'));
            for (int i = 0; i < 128; i++)
            {
                //把數字轉換成字符
                Console.WriteLine(i+"->"+Convert.ToChar(i));
            }

 

四、字符串類的常用方法

 

字符串類指的是 System 命名空間的 String 類,但我們平常定義字符串變量時使用的是首字母小
寫的 string 類型,這是為什么呢?其實 string 是 c#中的類,String 是 Fra mework 的類,C#的
string 映射為 Fra mework 的 String,也就是說 string 是 String 的別名而已。string 是關鍵字,
String 不是,也就是說 string 不能作為類、變量、方法的名稱,而 String 可以。如果使用 C#,建議
使用 string,比較符合規范 。

這一節中我們主要掌握字符串類的常見屬性和方法,詳細見下表所示:

Length 獲取字符串的字符數即長度

Contains 判斷指定字符串是否存在於此字符串中

StartsWith 判斷此字符串的開頭是否與指定的字符串相同

EndsWith 判斷此字符串的末尾是否與指定的字符串相同

Format 將字符串數據格式化成指定的格式

IndexOf 返回字符串中第一次出現某個給定字符串的位置

LastIndexOf 返回字符串中最后一次出現某個給定字符串的位置

Insert 在指定的位置插入指定的字符串

Remove 刪除字符串種指定位置、指定數目的字符

Replace 用另一個字符或字符串替換字符串中給定的字符或字符串

Split 在出現指定字符的地方,將字符串拆分為一個子字符串數組

Substring 在字符串中獲取給定位置的子字符串

ToCharArray 將字符串轉換為字符數組

ToUpper 將字符串轉換為大寫形式

ToLower 將字符串轉換為小寫形式

Trim 刪除字符串首尾的空白

在列出的這些方法中,除了 Format()方法是靜態方法,其它都是實例方法。下面就對這些方法進
行一一介紹,代碼如下:

static void Main()
{
string str = "how are you?";
//獲取字符串長度
Console.WriteLine("\"" + str + "\"字符串的長度:" + str.Length);
//判斷字符串中是否包含子字符串
if (str.Contains("are"))
{
Console.WriteLine("字符串中包含了are");
}
//判斷是否以某字符串開頭

if (str.StartsWith("how"))
{
Console.WriteLine("字符串以how開頭");
}
//判斷是否以某字符串結尾
if (str.EndsWith("?"))
{
Console.WriteLine("字符串以?結尾");
}
//查找某字符或子字符串出現的位置,若出現返回下標;若沒有出現返回-1;
int first_Index = str.IndexOf("o");
int last_Index = str.LastIndexOf("o");
Console.WriteLine("字符o在字符串中第一次出現的下標是{0}", first_Index);
Console.WriteLine("字符o在字符串中最后一次出現的下標是{0}", last_Index);
//指定位置插入子字符串
string newStr = str.Insert(3, " old");
Console.WriteLine("原字符串:" + str);
Console.WriteLine("插入后為:" + newStr);
//字符串替換
str = newStr.Replace("old", "tall");
Console.WriteLine("原字符串:" + newStr);
Console.WriteLine("替換后為:" + str);
//字符串拆分
string[] strs = str.Split(' ');
//以空格拆分
Console.WriteLine("第二個子字符串:" + strs[1]);
//字符串刪除
Console.WriteLine("原字符串:" + str);
str = str.Remove(3,5);
Console.WriteLine("刪除后為:" + str);

//字符串截取
string str1 = str.Substring(8); //從指定下標處開始截取到最后
string str2 = str.Substring(0, 3); //從指定下標處開始截取指定長度
Console.WriteLine("str1={0}\nstr2={1}", str1, str2);
//轉換大小寫
string str3 = str.ToUpper();
string str4 = str3.ToLower();
Console.WriteLine("str3={0}\nstr4={1}", str3, str4);
//去除前后的空格
string userName = " Tom ";
newStr = userName.Trim();
Console.WriteLine("\"{0}\"字符串長度是:{1}",userName,userName.Length);
Console.WriteLine("去除收尾空格后字符串的長度是:{0}", newStr.Length);
Console.WriteLine();
}

通過上面例子我們發現,字符串類的所有方法都不會改變原來字符串的值,而是會返回一個新的
字符串,所以使用的時候需要注意。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication14
{
    class Program
    {
        static void Main(string[] args)
        {
            String str = "hello big world!";
            //1求字符串長度
            Console.WriteLine(str.Length);
            //2用於判斷字符中是否包含子字符串
            if (str.Contains("hello"))
            {
                Console.WriteLine("含有hello");
            }
            else
            {
                Console.WriteLine("沒有hello");
            }
            //3是否以特定字符開頭
            if (str.StartsWith("ok"))
            {
                Console.WriteLine("以ok開頭");
            }
            //是否以特定字符結尾
            if (str.EndsWith("world!"))
            {
                Console.WriteLine("以world!結束");
            }
            //4 子字符串開始位置
            Console.WriteLine(str.IndexOf("o"));
            //5 子字符串結束位置
            Console.WriteLine(str.LastIndexOf("o"));

            //6 插入字符串  "hello good world!"
            Console.WriteLine(str.Insert(5, " good"));
            //7替換字符串
            Console.WriteLine(str.Replace("o","**"));

            //8刪除從指定位置開始長度的字符
            Console.WriteLine(str.Remove(5,4));
            //9拆分字符串為數組 hello big world!
            String[] a=str.Split(' ');
            foreach (var item in a)
            {
                Console.WriteLine(item);
            }
            //10截取子字符串
            Console.WriteLine(str.Substring(6,3));
            //11轉大寫
            Console.WriteLine(str.ToUpper());
            //12轉小寫
            Console.WriteLine(str.ToLower());
            //13去除字符串首尾空格,注意中間的空格不會去掉
            str = "     Hello      Trim     ";
            Console.WriteLine(str+"!");
            Console.WriteLine(str.Trim()+"!");
        }
    }
}

課堂作業: 現有一包含了文件路徑及名稱的字符串"E:\C#編程基礎\test.txt",請編寫程序只把
文件名取出。

郵箱驗證:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication15
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("請輸入郵箱:");
            String mail = Console.ReadLine();
            Console.WriteLine(Verify(mail));
        }
        //郵箱是否正確
        public static string Verify(String mail)
        {
            //1、郵箱必須包含@與.
            if (!mail.Contains("@") || !mail.Contains("."))
            {
                return "郵箱必須包含@與.";
            }
            //2、@與.不能開始與結束
            if (mail.StartsWith("@") || mail.StartsWith("."))
            {
                return "郵箱不能以@與.開始";
            }
            if (mail.EndsWith("@") || mail.EndsWith("."))
            {
                return "郵箱不能以@與.結束";
            }
            //3、@必須在.的前面出現
            if (mail.IndexOf("@") > mail.IndexOf("."))
            {
                return "@必須在.的前面出現";
            }
            //4、@只能有一個
            int at = 0, dot = 0;
            //88@qq.com
            foreach (char item in mail.ToCharArray())
            {
                if (item == '@') { at++; }
                if (item == '.') { dot++; }
            }
            if (at != 1)
            {
                return "@只能有一個"; 
            }
            //5、.可以有多個
            if (dot < 1)
            {
                return ".必須有1個或以上";
            }
            //6、用戶名的長度要大於等於3
            String name = mail.Substring(0, mail.IndexOf("@"));  //取出名字
            if (name.Length < 3)
            {
                return "用戶名的長度要大於等於3";
            }
            return "正確";
        }


    }
}

 五、內部測試

5.1、定義一個方法Add,接收1個整型參數n,方法中將n增大1並返回;在Main方法中調用該方法,輸出結果。

5.2、再定義一個Add方法實現重載功能,接收2個整型參數m與n,方法中實現m與n的和並返回;在Main方法中調用該方法,輸出結果。

5.3、斐波那契數列(Fibonacci sequence),又稱黃金分割數列、因數學家萊昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的是這樣一個數列:0、1、1、2、3、5、8、13、21、34、……

定義一個方法Fibonacci,接收整型參數n,方法實現計算出第1-n位的斐波那契數列,如Fibonacci(6),則輸出0 1 1 2 3 5;在Main中調用,提示用戶輸入n


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM