2024-05-25|閱讀時間 ‧ 約 35 分鐘

C#入門-Day7:函數

    函數的基本結構

    在 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# 的函數返回值能夠靈活應對不同的需求,從簡單的數值返回到複雜的異步操作,都可以通過合適的返回值類型來實現。

    分享至
    成為作者繼續創作的動力吧!
    © 2024 vocus All rights reserved.