C#入門-Day7:函數

更新於 發佈於 閱讀時間約 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
留言分享你的想法!
avatar-img
Michael楊
17會員
111內容數
日後將分享關於我的經驗(日常、工作、技術),並期待未來能創造屬於我的宇宙。
Michael楊的其他內容
2024/05/25
本章講述了C#開發中的程序集,命名空間和 NuGet 包管理器。程序集是 .NET 應用的基礎,命名空間用於組織和預防命名衝突,而 NuGet 用於管理 .NET 的外部庫和依賴項。
Thumbnail
2024/05/25
本章講述了C#開發中的程序集,命名空間和 NuGet 包管理器。程序集是 .NET 應用的基礎,命名空間用於組織和預防命名衝突,而 NuGet 用於管理 .NET 的外部庫和依賴項。
Thumbnail
2024/05/25
本章節介紹C#的「例外處理」,包括使用try-catch語法處理錯誤,finally關鍵字的使用,以及如何主動引發和自定義異常。
Thumbnail
2024/05/25
本章節介紹C#的「例外處理」,包括使用try-catch語法處理錯誤,finally關鍵字的使用,以及如何主動引發和自定義異常。
Thumbnail
2024/05/25
本章節的目的是讓讀者瞭解C#的物件導向特性,包括類別、繼承、多型、封裝等基本概念,以及介面、抽象類別、靜態類別等進階主題。此外,本章節也將介紹如何使用列舉、委派、Lambda表達式、泛型及反射,這些都是C#中常見的強大功能。
Thumbnail
2024/05/25
本章節的目的是讓讀者瞭解C#的物件導向特性,包括類別、繼承、多型、封裝等基本概念,以及介面、抽象類別、靜態類別等進階主題。此外,本章節也將介紹如何使用列舉、委派、Lambda表達式、泛型及反射,這些都是C#中常見的強大功能。
Thumbnail
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
這篇內容,將會講解什麼是函式,以及與函式相關的知識。包括函式的簡介、Runtime Function、自訂函式、Script Function 腳本函式、Method 方法。
Thumbnail
這篇內容,將會講解什麼是函式,以及與函式相關的知識。包括函式的簡介、Runtime Function、自訂函式、Script Function 腳本函式、Method 方法。
Thumbnail
在這一章中,我們探討了 PHP 中的函數,包括函數的基本結構、不同的函數定義方式(如函數聲明、函數表達式、箭頭函數和匿名函數)以及如何呼叫函數。我們還討論了函數的參數處理方式,包括單個參數、多個參數、預設參數值和剩餘參數。此外,我們還介紹了函數的返回值,包括返回單個值、返回物件和返回函數的情況。
Thumbnail
在這一章中,我們探討了 PHP 中的函數,包括函數的基本結構、不同的函數定義方式(如函數聲明、函數表達式、箭頭函數和匿名函數)以及如何呼叫函數。我們還討論了函數的參數處理方式,包括單個參數、多個參數、預設參數值和剩餘參數。此外,我們還介紹了函數的返回值,包括返回單個值、返回物件和返回函數的情況。
Thumbnail
本章節主要介紹Java語言中的函數(也稱為方法)的使用,包括函數的基本結構、函數表達式(Lambda表達式)、箭頭函數、匿名函數的使用,以及如何呼叫函數、如何使用函數參數和函數的返回值等內容。通過學習本章節,讀者將能夠熟練掌握Java語言中的函數相關知識,並能夠在實際編程中靈活運用。
Thumbnail
本章節主要介紹Java語言中的函數(也稱為方法)的使用,包括函數的基本結構、函數表達式(Lambda表達式)、箭頭函數、匿名函數的使用,以及如何呼叫函數、如何使用函數參數和函數的返回值等內容。通過學習本章節,讀者將能夠熟練掌握Java語言中的函數相關知識,並能夠在實際編程中靈活運用。
Thumbnail
這章節的目的是介紹 Kotlin 語言中函數的基本用法和概念,包括函數的聲明、使用、參數和返回值等。通過學習這章節,讀者可以熟練掌握如何在 Kotlin 中定義和使用函數,來解決各種問題。
Thumbnail
這章節的目的是介紹 Kotlin 語言中函數的基本用法和概念,包括函數的聲明、使用、參數和返回值等。通過學習這章節,讀者可以熟練掌握如何在 Kotlin 中定義和使用函數,來解決各種問題。
Thumbnail
此章節旨在解釋Swift語言中函數的基本結構和操作方式,包括函數的聲明、呼叫、參數和返回值。閱讀這個章節可以幫助你理解並掌握如何在Swift編程中有效地使用和管理函數。
Thumbnail
此章節旨在解釋Swift語言中函數的基本結構和操作方式,包括函數的聲明、呼叫、參數和返回值。閱讀這個章節可以幫助你理解並掌握如何在Swift編程中有效地使用和管理函數。
Thumbnail
本章節旨在介紹TypeScript中的函數,包括其基本結構、如何呼叫函數、函數的參數以及函數的返回值等相關概念。通過本章節,讀者可以學習到如何在TypeScript中使用不同的方式來定義函數,如函數聲明、函數表達式、箭頭函數和匿名函數等。
Thumbnail
本章節旨在介紹TypeScript中的函數,包括其基本結構、如何呼叫函數、函數的參數以及函數的返回值等相關概念。通過本章節,讀者可以學習到如何在TypeScript中使用不同的方式來定義函數,如函數聲明、函數表達式、箭頭函數和匿名函數等。
Thumbnail
本章節的目的是讓讀者瞭解C#的物件導向特性,包括類別、繼承、多型、封裝等基本概念,以及介面、抽象類別、靜態類別等進階主題。此外,本章節也將介紹如何使用列舉、委派、Lambda表達式、泛型及反射,這些都是C#中常見的強大功能。
Thumbnail
本章節的目的是讓讀者瞭解C#的物件導向特性,包括類別、繼承、多型、封裝等基本概念,以及介面、抽象類別、靜態類別等進階主題。此外,本章節也將介紹如何使用列舉、委派、Lambda表達式、泛型及反射,這些都是C#中常見的強大功能。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News