c#方法详细解读

在 C# 中,方法是类或结构体中封装的代码块,用于执行特定操作。方法是实现代码复用、封装逻辑的核心机制。以下是 C# 方法的关键概念和分类:

一、方法的基本结构

方法的定义包含访问修饰符、返回类型、方法名、参数列表和方法体:

// 语法结构
[访问修饰符] [返回类型] 方法名([参数列表])
{
    // 方法体(执行逻辑)
}

示例

public class Calculator
{
    // 有参数、有返回值的方法
    public int Add(int a, int b)
    {
        return a + b; // 返回计算结果
    }
    
    // 无参数、无返回值的方法(void)
    public void ShowMessage()
    {
        Console.WriteLine("Calculation done!");
    }
}

二、方法的核心要素

  1. 访问修饰符:控制方法的可访问性

    • public:任何地方可访问

    • private:仅当前类内部可访问(默认)

    • protected:当前类及派生类可访问

    • internal:同一程序集内可访问

  2. 返回类型

    • 方法执行后返回的数据类型(如intstring

    • 无返回值时用void

  3. 参数

    • 输入参数:方法接收的数据(可多个,用逗号分隔)

    • 参数可指定默认值(可选参数):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"

四、方法的高级特性

  1. 方法重载(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; // 重载(参数数量不同)
    }
  2. 异步方法(async/await): 用于非阻塞操作,提高程序响应性:

    public async Task<string> DownloadDataAsync(string url)
    {
        using (var client = new HttpClient())
        {
            // 异步等待操作完成
            return await client.GetStringAsync(url);
        }
    }

五、方法的调用方式

  1. 直接调用:var result = calculator.Add(2, 3);

  2. 作为委托 /lambda 传递:

    Func<int, int, int> addFunc = calculator.Add;
    int result = addFunc(2, 3);
  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标记异步操作;返回TaskTask<T>网络请求、文件 IO 等耗时操作public async Task<string> DownloadAsync(string url) { ... }

说明:

  • 访问修饰符public/private等)可应用于所有方法,控制访问范围。

  • 方法的核心区别体现在所属范围(实例 / 类)、继承行为(可重写 / 密封)、调用方式(对象 / 类名 / 扩展)等维度。

  • 表格中的 “示例代码” 为简化版,实际使用需结合类定义完整实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张謹礧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值