在 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
關鍵字來傳遞參數。
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# 中方法呼叫的主要方式。每種方式都可以根據具體情況選擇使用,以達到最佳效果。
向函數傳遞參數
預設的傳遞方式,函數接收參數的副本,修改不會影響原始變數。
void ModifyValue(int x)
{
x = 10;
}
int a = 5;
ModifyValue(a);
Console.WriteLine(a); // Output: 5
使用 ref
關鍵字,函數接收變數的引用,修改會影響原始變數。
void ModifyRef(ref int x)
{
x = 10;
}
int a = 5;
ModifyRef(ref a);
Console.WriteLine(a); // Output: 10
使用 out
關鍵字,參數不需要初始化,函數內必須賦值。
void InitializeOut(out int x)
{
x = 10;
}
int a;
InitializeOut(out a);
Console.WriteLine(a); // Output: 10
使用 params
關鍵字,可以傳遞可變數量的參數。
void PrintParams(params int[] numbers)
{
foreach (var number in numbers)
{
Console.WriteLine(number);
}
}
PrintParams(1, 2, 3, 4); // Output: 1 2 3 4
調用函數時指定參數名稱,可以不按順序傳遞。
void PrintDetails(string name, int age)
{
Console.WriteLine($"Name: {name}, Age: {age}");
}
PrintDetails(age: 30, name: "John"); // Output: Name: John, Age: 30
在函數定義時給參數提供預設值,調用時可以省略。
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# 中,函數的返回值有多種形式和變化,根據需求的不同,可以選擇適合的返回值類型。以下是一些常見的返回值類型及其變化形式:
函數可以返回基本數據類型,如 int
, float
, double
, bool
, char
, string
等。
int Add(int a, int b)
{
return a + b;
}
函數可以返回類、結構或其他複合數據類型。
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
Person GetPerson()
{
return new Person { Name = "Alice", Age = 30 };
}
函數可以返回集合類型,如陣列(Array
)、列表(List<T>
)、字典(Dictionary<TKey, TValue>
)等。
List<int> GetNumbers()
{
return new List<int> { 1, 2, 3, 4, 5 };
}
函數可以返回可空類型(Nullable<T>
),特別是當需要表示數值類型的可空性時。
int? GetNullableInt()
{
return null; // Or return some integer value
}
函數可以返回元組,以返回多個值而不需要定義新的類或結構。
(int, string) GetTuple()
{
return (1, "Hello");
}
var result = GetTuple();
Console.WriteLine(result.Item1); // Output: 1
Console.WriteLine(result.Item2); // Output: Hello
通過拋出異常來表示函數的錯誤狀態,這不是傳統意義上的返回值,但也是函數行為的一部分。
void DoSomething()
{
throw new InvalidOperationException("An error occurred");
}
當函數是異步方法時,可以返回 Task
或 Task<TResult>
來表示異步操作。
async Task<int> GetNumberAsync()
{
await Task.Delay(1000);
return 42;
}
函數不返回任何值時使用 void
。
void PrintMessage(string message)
{
Console.WriteLine(message);
}
這些變化使 C# 的函數返回值能夠靈活應對不同的需求,從簡單的數值返回到複雜的異步操作,都可以通過合適的返回值類型來實現。