C#入門-Day7:函數

更新於 2024/05/25閱讀時間約 14 分鐘

函數的基本結構

在 C# 中,函數(方法)的定義由以下部分組成:訪問修飾符、返回類型、方法名稱、參數列表和方法體。以下是函數定義的基本結構和一些示例:

基本結構

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

訪問修飾符

訪問修飾符指定方法的可見性或訪問級別。常見的訪問修飾符有:

  • public:方法對所有人可見。
  • private:方法僅對包含它的類可見。
  • protected:方法對包含它的類及其派生類可見。
  • internal:方法僅對同一程序集內的代碼可見。
  • protected internal:方法對同一程序集內的代碼和任何派生類可見。
  • private protected:方法僅對包含它的類及同一程序集內的派生類可見。

函數的呼叫

在 C# 中,函數(方法)的呼叫可以根據具體需求和上下文通過多種方式進行。以下是一些常見的方法呼叫方式:

直接呼叫

  • 在同一類中呼叫:在同一類內部,直接使用方法名稱來呼叫方法。
    class MyClass
    {
    void PrintHello()
    {
    Console.WriteLine("Hello, world!");
    }

    void CallMethod()
    {
    PrintHello(); // 直接呼叫
    }
    }

  • 在另一個類中呼叫:使用類的實例來呼叫方法。
    class MyClass
    {
    public void PrintHello()
    {
    Console.WriteLine("Hello, world!");
    }
    }

    class Program
    {
    static void Main(string[] args)
    {
    MyClass myClass = new MyClass();
    myClass.PrintHello(); // 使用實例呼叫
    }
    }

靜態方法呼叫

  • 在同一類中呼叫:在同一類內部,直接使用方法名稱來呼叫靜態方法。
    class MyClass
    {
    static void PrintHello()
    {
    Console.WriteLine("Hello, world!");
    }

    static void CallMethod()
    {
    PrintHello(); // 直接呼叫靜態方法
    }
    }

  • 在另一個類中呼叫:使用類名來呼叫靜態方法。
    class MyClass
    {
    public static void PrintHello()
    {
    Console.WriteLine("Hello, world!");
    }
    }

    class Program
    {
    static void Main(string[] args)
    {
    MyClass.PrintHello(); // 使用類名呼叫靜態方法
    }
    }

使用參數呼叫

呼叫方法時,傳遞參數以匹配方法定義。

class Calculator
{
public int Add(int a, int b)
{
return a + b;
}
}

class Program
{
static void Main(string[] args)
{
Calculator calculator = new Calculator();
int result = calculator.Add(3, 4); // 使用參數呼叫
Console.WriteLine(result); // Output: 7
}
}

使用 ref 和 out 參數呼叫

使用 refout 關鍵字來傳遞參數。

class Modifier
{
public void DoubleValue(ref int number)
{
number *= 2;
}

public void InitializeOut(out int number)
{
number = 10;
}
}

class Program
{
static void Main(string[] args)
{
Modifier modifier = new Modifier();

int a = 5;
modifier.DoubleValue(ref a); // 使用 ref 參數呼叫
Console.WriteLine(a); // Output: 10

int b;
modifier.InitializeOut(out b); // 使用 out 參數呼叫
Console.WriteLine(b); // Output: 10
}
}

使用可選參數和具名參數呼叫

呼叫方法時,可以省略可選參數或指定參數名稱。

class Greeter
{
public void Greet(string name, string greeting = "Hello")
{
Console.WriteLine($"{greeting}, {name}!");
}
}

class Program
{
static void Main(string[] args)
{
Greeter greeter = new Greeter();
greeter.Greet("Alice"); // 使用可選參數呼叫
greeter.Greet(name: "Bob", greeting: "Hi"); // 使用具名參數呼叫
}
}

使用異步方法呼叫

呼叫異步方法,使用 await 關鍵字。

class AsyncExample
{
public async Task<int> GetNumberAsync()
{
await Task.Delay(1000);
return 42;
}
}

class Program
{
static async Task Main(string[] args)
{
AsyncExample example = new AsyncExample();
int result = await example.GetNumberAsync(); // 使用 await 呼叫異步方法
Console.WriteLine(result); // Output: 42
}
}

委派和事件

使用委派和事件來呼叫方法。

class Program
{
public delegate void PrintDelegate(string message);

public static void PrintMessage(string message)
{
Console.WriteLine(message);
}

static void Main(string[] args)
{
PrintDelegate del = PrintMessage; // 使用委派呼叫
del("Hello, delegate!");

// 使用匿名方法或 Lambda 表達式
PrintDelegate del2 = (msg) => Console.WriteLine(msg);
del2("Hello, Lambda!");
}
}

這些是 C# 中方法呼叫的主要方式。每種方式都可以根據具體情況選擇使用,以達到最佳效果。

函數的參數

向函數傳遞參數

值傳遞(Pass by Value)

預設的傳遞方式,函數接收參數的副本,修改不會影響原始變數。

void ModifyValue(int x)
{
x = 10;
}

int a = 5;
ModifyValue(a);
Console.WriteLine(a); // Output: 5

引用傳遞(Pass by Reference)

使用 ref 關鍵字,函數接收變數的引用,修改會影響原始變數。

void ModifyRef(ref int x)
{
x = 10;
}

int a = 5;
ModifyRef(ref a);
Console.WriteLine(a); // Output: 10

輸出參數(Out Parameter)

使用 out 關鍵字,參數不需要初始化,函數內必須賦值。

void InitializeOut(out int x)
{
x = 10;
}

int a;
InitializeOut(out a);
Console.WriteLine(a); // Output: 10

參數陣列(Parameter Array)

使用 params 關鍵字,可以傳遞可變數量的參數。

void PrintParams(params int[] numbers)
{
foreach (var number in numbers)
{
Console.WriteLine(number);
}
}

PrintParams(1, 2, 3, 4); // Output: 1 2 3 4

具名參數(Named Parameters)

調用函數時指定參數名稱,可以不按順序傳遞。

void PrintDetails(string name, int age)
{
Console.WriteLine($"Name: {name}, Age: {age}");
}

PrintDetails(age: 30, name: "John"); // Output: Name: John, Age: 30

可選參數(Optional Parameters)

在函數定義時給參數提供預設值,調用時可以省略。

void Greet(string name, string greeting = "Hello")
{
Console.WriteLine($"{greeting}, {name}!");
}

Greet("Alice"); // Output: Hello, Alice!
Greet("Bob", "Good morning"); // Output: Good morning, Bob!

函數的返回值

在 C# 中,函數的返回值有多種形式和變化,根據需求的不同,可以選擇適合的返回值類型。以下是一些常見的返回值類型及其變化形式:

基本類型(Primitive Types)

函數可以返回基本數據類型,如 int, float, double, bool, char, string 等。

int Add(int a, int b)
{
return a + b;
}

複合類型(Complex Types)

函數可以返回類、結構或其他複合數據類型。

class Person
{
public string Name { get; set; }
public int Age { get; set; }
}

Person GetPerson()
{
return new Person { Name = "Alice", Age = 30 };
}

集合類型(Collections)

函數可以返回集合類型,如陣列(Array)、列表(List<T>)、字典(Dictionary<TKey, TValue>)等。

List<int> GetNumbers()
{
return new List<int> { 1, 2, 3, 4, 5 };
}

Nullable 類型(Nullable Types)

函數可以返回可空類型(Nullable<T>),特別是當需要表示數值類型的可空性時。

int? GetNullableInt()
{
return null; // Or return some integer value
}

元組(Tuples)

函數可以返回元組,以返回多個值而不需要定義新的類或結構。

(int, string) GetTuple()
{
return (1, "Hello");
}

var result = GetTuple();
Console.WriteLine(result.Item1); // Output: 1
Console.WriteLine(result.Item2); // Output: Hello

異常(Exceptions)

通過拋出異常來表示函數的錯誤狀態,這不是傳統意義上的返回值,但也是函數行為的一部分。

void DoSomething()
{
throw new InvalidOperationException("An error occurred");
}

Task 和 Task<TResult>(異步方法)

當函數是異步方法時,可以返回 TaskTask<TResult> 來表示異步操作。

async Task<int> GetNumberAsync()
{
await Task.Delay(1000);
return 42;
}

Void

函數不返回任何值時使用 void

void PrintMessage(string message)
{
Console.WriteLine(message);
}

這些變化使 C# 的函數返回值能夠靈活應對不同的需求,從簡單的數值返回到複雜的異步操作,都可以通過合適的返回值類型來實現。

    avatar-img
    15會員
    111內容數
    日後將分享關於我的經驗(日常、工作、技術),並期待未來能創造屬於我的宇宙。
    留言0
    查看全部
    avatar-img
    發表第一個留言支持創作者!
    Michael楊 的其他內容
    本文是C#入門教程的一部分,涵蓋了流程控制的各種語句與迴圈。這包括if、else if和else語句,三元運算子,switch語句,以及for、foreach和while迴圈。文中還介紹了如何在迴圈中使用break、continue、return和goto語句。
    C#中的運算符包括算術運算子(如加法、減法、乘法等)、比較運算子(如等於、不等於、大於等)、賦值運算子(如賦值、加並賦值等)、邏輯運算子(如與、或、非等)和位元運算子(如按位與、按位或等)。這些運算符有不同的優先等級,例如括號的優先等級最高,其次是次方、乘、除、餘數等。
    內容涵蓋資料型別、型別轉換、自訂型別、元組型別、集合型別和字典型別等主題。文章首先詳述內建型別如bool、byte、char等的定義和使用,接著討論型別轉換,包括隱含轉換和明確轉換。之後文章介紹自訂型別的建立,以及元組、集合、陣列和字典型別的操作與例子。
    在學習C#之前,必須先建立開發環境,例如安裝Visual Studio或其他IDE,並且建立第一個C#專案。可以在Visual Studio中或使用dotnet CLI來建立各種類型的專案。
    C#程式由一或多個檔案組成,包含命名空間、類別、結構、介面、列舉和委派等型別。Main方法是C#應用程式的進入點。在C#中,註解用於在程式碼中添加說明,有單行和多行兩種類型。變數的定義需要指定變數的類型和名稱,可以一次為多個變數賦值。
    C#是一種開源、跨平台、面向對象的編程語言,具有類型安全、泛型、模式匹配等特性。廣泛應用於桌面和Web應用程序、遊戲開發、移動應用、雲計算等領域。全球數十萬家公司像微軟、Unity Technologies、Stack Overflow等使用C#支持其業務。C#還提供豐富的進階學習資源和主題。
    本文是C#入門教程的一部分,涵蓋了流程控制的各種語句與迴圈。這包括if、else if和else語句,三元運算子,switch語句,以及for、foreach和while迴圈。文中還介紹了如何在迴圈中使用break、continue、return和goto語句。
    C#中的運算符包括算術運算子(如加法、減法、乘法等)、比較運算子(如等於、不等於、大於等)、賦值運算子(如賦值、加並賦值等)、邏輯運算子(如與、或、非等)和位元運算子(如按位與、按位或等)。這些運算符有不同的優先等級,例如括號的優先等級最高,其次是次方、乘、除、餘數等。
    內容涵蓋資料型別、型別轉換、自訂型別、元組型別、集合型別和字典型別等主題。文章首先詳述內建型別如bool、byte、char等的定義和使用,接著討論型別轉換,包括隱含轉換和明確轉換。之後文章介紹自訂型別的建立,以及元組、集合、陣列和字典型別的操作與例子。
    在學習C#之前,必須先建立開發環境,例如安裝Visual Studio或其他IDE,並且建立第一個C#專案。可以在Visual Studio中或使用dotnet CLI來建立各種類型的專案。
    C#程式由一或多個檔案組成,包含命名空間、類別、結構、介面、列舉和委派等型別。Main方法是C#應用程式的進入點。在C#中,註解用於在程式碼中添加說明,有單行和多行兩種類型。變數的定義需要指定變數的類型和名稱,可以一次為多個變數賦值。
    C#是一種開源、跨平台、面向對象的編程語言,具有類型安全、泛型、模式匹配等特性。廣泛應用於桌面和Web應用程序、遊戲開發、移動應用、雲計算等領域。全球數十萬家公司像微軟、Unity Technologies、Stack Overflow等使用C#支持其業務。C#還提供豐富的進階學習資源和主題。
    你可能也想看
    Google News 追蹤
    Thumbnail
    投資新手大多從身邊市場開始著手,選擇台股市場入門,單筆投資或台股定期定額投資,隨著經驗累積,進入美股市場也是好選擇,這篇文章帶你前進美股投資,證券開戶選擇國內券商複委託,使用美股定期定額投資,並以國泰 CUBE App為例說明。 內容目錄: 1.一站式開戶:以國泰世華 CUBE App 為例
    Thumbnail
    這是張老師的第三本書,我想前二本應該也有很多朋友們都有讀過,我想絕對是受益良多,而這次在書名上就直接點出,著重在從投資的角度來切入
    Thumbnail
    完成了Debug.log()的測試,接著還是要跟各位簡單講一下C#的一些規則,之後看程式會(比較)看得懂。 又講到變數? 在Unity中,變數是重要的工具,用來儲存和管理資料。讓開發者能夠靈活調整遊戲的行為和性能,減少代碼的重複性,使得遊戲開發更加高效和簡潔。透過使用變數,開發者可以輕鬆修改資料
    Thumbnail
    在進行資訊輸入的過程中,經常需要在不同語言的文字之間切換輸入法,這可能會影響效率。不過,透過程式設計的方法,我們可以實現在選取到需要輸入中文的輸入框時自動切換到中文輸入法,讓操作更加便利。在這篇文章中,我們將介紹兩種實現自動切換中文輸入法的方法,一種是切換輸入法,另一種是使用IME輸入法。
    Thumbnail
    當我的自營工作室客源開始穩定時,C就這樣悄悄走進我的生命裡,至今為止,我和C從來沒有吵架過,連一點點的不愉快、疙瘩甚至懷疑都沒有,對我而言,C的意義只有美好。她總是希望我過得好,我也祝福她永遠快樂。     我的租屋處是一棟由五樓透天隔間的大套房,而我就住在頂樓,旁邊還有一間空房一直沒人承租
    Thumbnail
    JSON(JavaScript Object Notation)是一種常用的數據交換格式,用於在不同的應用程序之間傳遞結構化數據。在C#中,我們可以使用Newtonsoft.Json模組來處理JSON資料。
    Thumbnail
    一、C#介紹 二、為什麼要學C# 三、.NET Framework介紹
    Thumbnail
    發洩完情緒之後,內心裡,總會有一種抒坦。是那種放下的感覺,是那種,什麼都好,都可以不重要,只有自己的那種,唯我獨尊的快感。可以不必再在意些什麼,不必再掙扎著去要求些什麼。唯有放寛心了,才能更真實去體驗自己正在經歷的過程。放下些什麼,才能獲得些什麼。 昨晚,C因為工作無法前來陪伴休假的我。經前症候群嚴
    Thumbnail
    這篇文章將會介紹官方設置好的偵測玩家輸入,在撰寫遊戲程式的時候肯定需要偵測玩家輸入,其實並不需要自行撰寫程式來監控玩家操作,而是直接調閱官方的資料庫即可。
    Thumbnail
    前言 輸出 printf 格式控制字元、格式控制符(format char) 前言 輸出控制字元、輸出控制符 轉義字元、轉義符 格式控制字元、格式控制符 輸入 scanf gets gets與scanf差異
    Thumbnail
    投資新手大多從身邊市場開始著手,選擇台股市場入門,單筆投資或台股定期定額投資,隨著經驗累積,進入美股市場也是好選擇,這篇文章帶你前進美股投資,證券開戶選擇國內券商複委託,使用美股定期定額投資,並以國泰 CUBE App為例說明。 內容目錄: 1.一站式開戶:以國泰世華 CUBE App 為例
    Thumbnail
    這是張老師的第三本書,我想前二本應該也有很多朋友們都有讀過,我想絕對是受益良多,而這次在書名上就直接點出,著重在從投資的角度來切入
    Thumbnail
    完成了Debug.log()的測試,接著還是要跟各位簡單講一下C#的一些規則,之後看程式會(比較)看得懂。 又講到變數? 在Unity中,變數是重要的工具,用來儲存和管理資料。讓開發者能夠靈活調整遊戲的行為和性能,減少代碼的重複性,使得遊戲開發更加高效和簡潔。透過使用變數,開發者可以輕鬆修改資料
    Thumbnail
    在進行資訊輸入的過程中,經常需要在不同語言的文字之間切換輸入法,這可能會影響效率。不過,透過程式設計的方法,我們可以實現在選取到需要輸入中文的輸入框時自動切換到中文輸入法,讓操作更加便利。在這篇文章中,我們將介紹兩種實現自動切換中文輸入法的方法,一種是切換輸入法,另一種是使用IME輸入法。
    Thumbnail
    當我的自營工作室客源開始穩定時,C就這樣悄悄走進我的生命裡,至今為止,我和C從來沒有吵架過,連一點點的不愉快、疙瘩甚至懷疑都沒有,對我而言,C的意義只有美好。她總是希望我過得好,我也祝福她永遠快樂。     我的租屋處是一棟由五樓透天隔間的大套房,而我就住在頂樓,旁邊還有一間空房一直沒人承租
    Thumbnail
    JSON(JavaScript Object Notation)是一種常用的數據交換格式,用於在不同的應用程序之間傳遞結構化數據。在C#中,我們可以使用Newtonsoft.Json模組來處理JSON資料。
    Thumbnail
    一、C#介紹 二、為什麼要學C# 三、.NET Framework介紹
    Thumbnail
    發洩完情緒之後,內心裡,總會有一種抒坦。是那種放下的感覺,是那種,什麼都好,都可以不重要,只有自己的那種,唯我獨尊的快感。可以不必再在意些什麼,不必再掙扎著去要求些什麼。唯有放寛心了,才能更真實去體驗自己正在經歷的過程。放下些什麼,才能獲得些什麼。 昨晚,C因為工作無法前來陪伴休假的我。經前症候群嚴
    Thumbnail
    這篇文章將會介紹官方設置好的偵測玩家輸入,在撰寫遊戲程式的時候肯定需要偵測玩家輸入,其實並不需要自行撰寫程式來監控玩家操作,而是直接調閱官方的資料庫即可。
    Thumbnail
    前言 輸出 printf 格式控制字元、格式控制符(format char) 前言 輸出控制字元、輸出控制符 轉義字元、轉義符 格式控制字元、格式控制符 輸入 scanf gets gets與scanf差異