第五單元 函數(方法)

来源:https://www.cnblogs.com/xuyubing/archive/2023/05/29/17441568.html
-Advertisement-
Play Games

1. 函數(方法)的簡介 函數,在C# 中更多的被稱為方法。它表示一個的類所具有的行為(方法,函數)。 方法的作用 封裝一些公共的代碼,以達到功能重覆利用,減少代碼冗餘。例如,我們經常要進行 輸入,輸出,系統於是幫我們封裝好了 Console.WriteLine(), Console.ReadLin ...


1. 函數(方法)的簡介

函數,在C# 中更多的被稱為方法。它表示一個的類所具有的行為(方法,函數)。

方法的作用

封裝一些公共的代碼,以達到功能重覆利用,減少代碼冗餘。例如,我們經常要進行 輸入,輸出,系統於是幫我們封裝好了 Console.WriteLine(), Console.ReadLine()等方法。

一個方法是把一些相關的語句組織在一起,用來執行一個任務的語句塊。每一個 C# 程式至少有一個帶有 Main 方法的類。

要使用一個方法,您需要:

  • 定義方法

  • 調用方法

2. C# 中定義方法

當定義一個方法時,從根本上說是在聲明它的結構的元素。在 C# 中,定義方法的語法如下:

<Access Specifier> <Return Type> <Method Name>(Parameter List)
{
   Method Body
}

下麵是方法的各個元素:

  • Access Specifier:訪問修飾符,這個決定了變數或方法對於另一個類的可見性。

  • Return type:返回類型,一個方法可以返回一個值。返回類型是方法返回的值的數據類型。如果方法不返回任何值,則返回類型為 void

  • Method name:方法名稱,是一個唯一的標識符,且是大小寫敏感的。它不能與類中聲明的其他標識符相同。

  • Parameter list:參數列表,使用圓括弧括起來,該參數是用來傳遞和接收方法的數據。參數列表是指方法的參數類型、順序和數量。參數是可選的,也就是說,一個方法可能不包含參數。

  • Method body:方法主體,包含了完成任務所需的指令集。

有參有返回值

下麵的代碼片段顯示一個函數 FindMax,它接受兩個整數值,並返回兩個中的較大值。它有 public 訪問修飾符,所以它可以使用類的實例從類的外部進行訪問。

class Program
{
    static void Main(string[] args)
    {
        int a =10;
        int b =5;
        int result = FindMax(a,b); // 調用方法
        Console.WriteLine(result);
    }

    // 定義一個求最大值的方法
    public static int FindMax(int num1, int num2)
    {
        /* 局部變數聲明 */
        int result;

        if (num1 > num2)
            result = num1;
        else
            result = num2;

        return result;
    }
}

 

形參與實參

num1,num2 這兩個變數並不是實際上定義的變數,他倆只是 a,b 這兩變數在記憶體中複製的一個副本,我們把num1,num2 這種用於接收方法的參數值的變數叫作 形參, 把 a,b 這種實際被定義的變數且用於傳遞的變數叫作實參

無參有返回值方法

class Program
{
    static void Main(string[] args)
    {
      
        int result = FindMax(); // 調用方法
        Console.WriteLine(result);
    }

    // 定義一個求最大值的方法
    public static int FindMax()
    {
        int num1=10 ;
        int num2=5 ;
        int result;

        if (num1 > num2)
            result = num1;
        else
            result = num2;

        return result;
    }
}

 

無參無返回值

class Program
{
    static void Main(string[] args)
    {
        Hello(); // 調用方法,不能接返回值
    }

    
    public static void Hello()
    {
        Console.WriteLine("我是無參無返回值函數");
    }
}

有參無返回值

class Program
{
    static void Main(string[] args)
    {
        int a =20;
        int b =10;
        Sum(a,b); // 調用方法,不能接返回值
        Console.WriteLine($"a={a},b={b}"); // a=20,b=10;
    }

    
    public static void Sum(int a,int b)
    {    
        a=2;
        b=1;
        Console.WriteLine("a+b={0}",a+b); // a+b=3
    }
}

 

3. 參數傳遞

當調用帶有參數的方法時,您需要向方法傳遞參數。在 C# 中,有三種向方法傳遞參數的方式:

方式描述
值參數 這種方式複製參數的實際值給函數的形式參數,實參和形參使用的是兩個不同記憶體中的值。在這種情況下,當形參的值發生改變時,不會影響實參的值,從而保證了實參數據的安全。
引用參數 (關鍵字:ref)這種方式複製參數的記憶體位置的引用給形式參數。這意味著,當形參的值發生改變時,同時也改變實參的值。
輸出參數 (關鍵字 out )這種方式可以返回多個值。

按值傳遞參數

這是參數傳遞的預設方式。在這種方式下,當調用一個方法時,會為每個值參數創建一個新的存儲位置。

實際參數的值會複製給形參,實參和形參使用的是兩個不同記憶體中的值。所以,當形參的值發生改變時,不會影響實參的值,從而保證了實參數據的安全。下麵的實例演示了這個概念:

public static void swap(int x, int y)
{
    int temp;

    temp = x; /* 保存 x 的值 */
    x = y;    /* 把 y 賦值給 x */
    y = temp; /* 把 temp 賦值給 y */
}

static void Main(string[] args)
{
  
    /* 局部變數定義 */
    int a = 100;
    int b = 200;

    Console.WriteLine("在交換之前,a 的值: {0}", a);
    Console.WriteLine("在交換之前,b 的值: {0}", b);

    /* 調用函數來交換值 */
    swap(a, b);

    Console.WriteLine("在交換之後,a 的值: {0}", a);
    Console.WriteLine("在交換之後,b 的值: {0}", b);

    Console.ReadLine();
}

 

當上面的代碼被編譯和執行時,它會產生下列結果:

在交換之前,a 的值:100
在交換之前,b 的值:200
在交換之後,a 的值:100
在交換之後,b 的值:200

  

結果表明,即使在函數內改變了值,值也沒有發生任何的變化。

按引用傳遞參數-ref

引用參數是一個對變數的記憶體位置的引用。當按引用傳遞參數時,與值參數不同的是,它不會為這些參數創建一個新的存儲位置。引用參數表示與提供給方法的實際參數具有相同的記憶體位置。

在 C# 中,使用 ref 關鍵字聲明引用參數。下麵的實例演示了這點:

public void swap(ref int x, ref int y)
{
    int temp;

    temp = x; /* 保存 x 的值 */
    x = y;    /* 把 y 賦值給 x */
    y = temp; /* 把 temp 賦值給 y */
}

static void Main(string[] args)
{
    /* 局部變數定義 */
    int a = 100;
    int b = 200;

    Console.WriteLine("在交換之前,a 的值: {0}", a);
    Console.WriteLine("在交換之前,b 的值: {0}", b);

    /* 調用函數來交換值 */
    swap(ref a, ref b);

    Console.WriteLine("在交換之後,a 的值: {0}", a);
    Console.WriteLine("在交換之後,b 的值: {0}", b);

    Console.ReadLine();
}

 

當上面的代碼被編譯和執行時,它會產生下列結果:

在交換之前,a 的值:100
在交換之前,b 的值:200
在交換之後,a 的值:200
在交換之後,b 的值:100

  

結果表明,swap 函數內的值改變了,且這個改變可以在 Main 函數中反映出來。

按輸出傳遞參數-out

return 語句可用於只從函數中返回一個值。但是,可以使用 輸出參數 來從函數中返回兩個值。輸出參數會把方法輸出的數據賦給自己,其他方面與引用參數相似。

下麵的實例演示了這點:

public void getValue(out int x )
{
    int temp = 5;
    x = temp;
}

static void Main(string[] args)
{
    /* 局部變數定義 */
    int a = 100;

    Console.WriteLine("在方法調用之前,a 的值: {0}", a);

    /* 調用函數來獲取值 */
    getValue(out a);

    Console.WriteLine("在方法調用之後,a 的值: {0}", a);
    Console.ReadLine();
}

 

當上面的代碼被編譯和執行時,它會產生下列結果:

在方法調用之前,a 的值: 100
在方法調用之後,a 的值: 5

 

忽略輸出參數

static void Main(string[] args)
{
    int a = 10;
    int b = 5;
    int res= Sum(a,out b,out _); // out _ 忽略輸出第三個參數
}

// 定義一個求最大值的方法
public static int Sum(int num1, out int num2,out int result)
{
    num1 = 2;
    num2 = 3;
    result = num2 + num1;
    return result;
}

 

4. 方法重載

一、 描述

  在面向對象的語言中,允許我們在同一個類中定義多個方法名相同、參數列表(參數類型,參數個數)不同的方法,這樣的形式我們稱為方法重載。調用時編譯器會根據實際傳入參數的形式,選擇與其匹配的方法執行。


二、 重載的分析

1.生活中的方法重載

img

2.將生活重載的表現形式,抽象成代碼的形式:

img

3.構成方法重載的條件

  • 方法名相同。

  • 方法參數類型不同或者參數個數不同。

  • 在同一個類中。

平均數案例:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(Avg(2,6,4)); // 請問會執行哪個方法?
    }
    
    static int Avg(int num1,int num2,int num3)
    {
        return (num1+num2+num3) / 3;
    }
    
    // 方法2:與方法1,參數類型不同,構成重載
    static decimal Avg(decimal num1,decimal num2,decimal num3)
    {
        return (num1+num2+num3) / 3.0m;
    }
    // 方法3:與方法2,參數個數不同,構成重載
    static decimal Avg(decimal num1,decimal num2)
    {
        return (num1+num2) / 2.0m;
    }
}

 

5. 作業

  1. 定義一個接收三個形參的方法( 方法重載,decimal, int , long),使用三目運算符計算最小值

  2. 定義一個無參有返回值的方法,在方法中從控制台接收三個數字,計算並返回平均值。

  3. 定義一個無參無返回值的方法。

  4. 定義一個有兩個輸出參數(out)的方法 , 並將兩個參數的值進行交換,輸出實參的交換後的值。

 

視頻教程:

譽尚學教育_譽尚學教育騰訊課堂官網 (qq.com)
或者:
C# 最強入門編程(.Net 學習系列開山巨作)_嗶哩嗶哩_bilibili

 

海闊平魚躍,天高任我行,給我一片藍天,讓我自由翱翔。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文將為大家詳細講解Java中Properties配置類怎麼用,這是我們進行開發時經常用到的知識點,也是大家在學習Java中很重要的一個知識點,更是我們在面試時有可能會問到的問題!文章較長,乾貨滿滿,建議大家收藏慢慢學習。文末有本文重點總結,主頁有全系列文章分享。技術類問題,歡迎大家和我們一起交流討... ...
  • SQLAlchemy是著名的ORM(Object Relational Mapping-對象關係映射)框架。其主要作用是在編程中,把面向對象的概念跟資料庫中表的概念對應起來。對許多語言(例如JAVA/PYTHON)來說就是定義一個對象,並且這個對象對應著一張資料庫的表。而這個對象的實例,就對應著表中... ...
  • 摘要:Python Web程式員必看系列,學習如何壓縮 JS 代碼。 本文分享自華為雲社區《Python壓縮JS文件,PythonWeb程式員必看系列,重點是 slimit》,作者: 夢想橡皮擦 。 本篇博客將學習壓縮 JS 代碼,首先要學習的模塊是 jsmin。 jsmin 庫 Python 中的 ...
  • ## 文章首發 [【重學C++】05 | 說透右值引用、移動語義、完美轉發(下)](https://mp.weixin.qq.com/s/w7yXp6efE7_V0EHxXWJiJA) ## 引言 大家好,我是只講技術乾貨的會玩code,今天是【重學C++】的第五講,在第四講《[【重學C++】04 ...
  • 面試題==知識點,這裡所記錄的面試題並不針對於面試者,而是將這些面試題作為技能知識點來看待。不以刷題進大廠為目的,而是以學習為目的。這裡的知識點會持續更新,目錄也會隨時進行調整。 ...
  • 在Winform中動態讀寫app.config文件 https://blog.csdn.net/kingmax54212008/article/details/38987277?spm=1001.2101.3001.6650.7&utm_medium=distribute.pc_relevant.n ...
  • Winform中通過自帶的App.config實現從配置文件中讀取配置 場景 Winform中實現保存配置到文件/項目啟動時從文件中讀取配置(序列化與反序列化對象): Winform中實現保存配置到文件/項目啟動時從文件中讀取配置(序列化與反序列化對象)_winform 讀取配置文件_霸道流氓氣質的 ...
  • # 什麼是線程 Thread - 線程是一個可執行路徑,它可以獨立於其它線程執行。 - 每個線程都在操作系統的進程(Process)內執行,而操作系統進程提供了程式運行的獨立環境。 - 單線程應用,在進程的獨立環境里只跑一個線程,所以該線程擁有獨占權 - 多線程應用,單個進程中會跑多個線程,它們會共 ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...