在 C# 中,方法是类或结构体中封装的代码块,用于执行特定操作。方法是实现代码复用、封装逻辑的核心机制。以下是 C# 方法的关键概念和分类:
一、方法的基本结构
方法的定义包含访问修饰符、返回类型、方法名、参数列表和方法体:
// 语法结构 [访问修饰符] [返回类型] 方法名([参数列表]) { // 方法体(执行逻辑) }
示例:
public class Calculator { // 有参数、有返回值的方法 public int Add(int a, int b) { return a + b; // 返回计算结果 } // 无参数、无返回值的方法(void) public void ShowMessage() { Console.WriteLine("Calculation done!"); } }
二、方法的核心要素
-
访问修饰符:控制方法的可访问性
-
public
:任何地方可访问 -
private
:仅当前类内部可访问(默认) -
protected
:当前类及派生类可访问 -
internal
:同一程序集内可访问
-
-
返回类型:
-
方法执行后返回的数据类型(如
int
、string
) -
无返回值时用
void
-
-
参数:
-
输入参数:方法接收的数据(可多个,用逗号分隔)
-
参数可指定默认值(可选参数):
int Multiply(int a, int b = 2)
-
可使用params关键字接收可变数量参数:
public int Sum(params int[] numbers) { int total = 0; foreach (int num in numbers) total += num; return total; } // 调用:Sum(1, 2, 3) 或 Sum(1, 2, 3, 4, 5)
-
三、方法的分类
1. 实例方法 vs 静态方法
-
实例方法:属于类的实例,需通过对象调用
public class Person { public string Name; // 实例方法(操作实例成员) public void Introduce() { Console.WriteLine($"Hello, I'm {Name}"); } } // 调用:需先创建实例 var person = new Person { Name = "Alice" }; person.Introduce();
-
静态方法:属于类本身,用
static
修饰,通过类名调用public class MathUtil { // 静态方法(不依赖实例) public static int Max(int a, int b) { return a > b ? a : b; } } // 调用:直接通过类名 int max = MathUtil.Max(3, 5);
2. 虚方法、抽象方法与重写方法
用于实现多态性:
-
虚方法(virtual):基类中定义,允许派生类重写
public class Animal { public virtual void MakeSound() { Console.WriteLine("Animal sound"); } }
-
抽象方法(abstract):仅在抽象类中定义,无实现,强制派生类重写
public abstract class Shape { public abstract double CalculateArea(); // 无方法体 }
-
重写方法(override):派生类中重写基类的虚方法或抽象方法
public class Dog : Animal { public override void MakeSound() { Console.WriteLine("Woof!"); // 重写基类方法 } } public class Circle : Shape { public double Radius; public override double CalculateArea() { return Math.PI * Radius * Radius; // 实现抽象方法 } }
3. 密封方法(sealed)
防止派生类进一步重写已重写的方法:
public class Dog : Animal { public sealed override void MakeSound() { Console.WriteLine("Woof!"); // 密封后不可再被重写 } } public class Puppy : Dog { // 错误:无法重写密封方法 // public override void MakeSound() { } }
4. 扩展方法
为现有类型添加方法,无需修改原类型定义(静态类 + 静态方法 +this
关键字):
// 扩展方法必须在静态类中定义 public static class StringExtensions { // 为string类型添加反转方法 public static string Reverse(this string str) { char[] chars = str.ToCharArray(); Array.Reverse(chars); return new string(chars); } } // 使用:直接作为string的方法调用 string original = "hello"; string reversed = original.Reverse(); // 结果:"olleh"
四、方法的高级特性
-
方法重载(Overload): 同一类中定义多个同名方法,参数列表(类型、数量、顺序)不同:
public class Calculator { public int Add(int a, int b) => a + b; public double Add(double a, double b) => a + b; // 重载(参数类型不同) public int Add(int a, int b, int c) => a + b + c; // 重载(参数数量不同) }
-
异步方法(async/await): 用于非阻塞操作,提高程序响应性:
public async Task<string> DownloadDataAsync(string url) { using (var client = new HttpClient()) { // 异步等待操作完成 return await client.GetStringAsync(url); } }
五、方法的调用方式
-
直接调用:
var result = calculator.Add(2, 3);
-
作为委托 /lambda 传递:
Func<int, int, int> addFunc = calculator.Add; int result = addFunc(2, 3);
-
反射调用:动态调用方法(适用于未知类型场景)
总结
方法是 C# 中组织代码的基本单元,通过合理使用不同类型的方法(实例 / 静态、虚方法 / 抽象方法、扩展方法等),可以实现代码的复用、封装和多态,是面向对象编程的核心机制。根据场景选择合适的方法类型,能显著
表格
以下是 C# 中各类方法的汇总表格,包含核心特性、修饰符、使用场景及示例:
方法类型 | 修饰符 / 关键字 | 核心特性 | 典型使用场景 | 简单示例代码 |
---|---|---|---|---|
实例方法 | 无(默认) | 属于类的实例,需通过对象调用;可访问实例成员和静态成员 | 操作对象的状态或行为(如Person.SayHello() ) | public void Introduce() { ... } |
静态方法 | static | 属于类本身,通过类名调用;只能访问静态成员;无this 指针 | 工具类、辅助方法(如Math.Max() ) | public static int Add(int a, int b) { ... } |
虚方法 | virtual (基类) | 基类中定义,允许派生类重写;有默认实现 | 需在派生类中灵活扩展的方法(如Animal.MakeSound() ) | public virtual void MakeSound() { ... } |
抽象方法 | abstract (仅抽象类中) | 无实现体;强制派生类重写;只能在抽象类中定义 | 定义基类模板(如Shape.CalculateArea() ) | public abstract double CalculateArea(); |
重写方法 | override | 派生类中重写基类的虚方法或抽象方法;实现多态 | 定制基类方法的具体行为(如Dog.MakeSound() ) | public override void MakeSound() { Console.WriteLine("Woof"); } |
密封方法 | sealed override | 阻止派生类进一步重写;需配合override 使用 | 保护核心方法逻辑不被修改 | public sealed override void MakeSound() { ... } |
扩展方法 | static (类)+ this (参数) | 为现有类型添加方法,无需修改原类型;定义在静态类中 | 增强系统类型功能(如为string 添加Reverse() ) | public static string Reverse(this string s) { ... } |
重载方法 | 无(同名不同参) | 同一类中方法名相同,参数列表(类型 / 数量 / 顺序)不同;编译时绑定 | 提供多参数组合的灵活调用(如Add(int) /Add(double) ) | public int Add(int a) { ... } public double Add(double a) { ... } |
异步方法 | async + Task /Task<T> | 非阻塞执行;使用await 标记异步操作;返回Task 或Task<T> | 网络请求、文件 IO 等耗时操作 | public async Task<string> DownloadAsync(string url) { ... } |
说明:
-
访问修饰符(
public
/private
等)可应用于所有方法,控制访问范围。 -
方法的核心区别体现在所属范围(实例 / 类)、继承行为(可重写 / 密封)、调用方式(对象 / 类名 / 扩展)等维度。
-
表格中的 “示例代码” 为简化版,实际使用需结合类定义完整实现。