Skip to content

C# - 方法

方法(Method)是执行特定任务的可重用代码块。方法是 C# 程序的构建块,它允许你将代码组织成逻辑的、可管理单元。每个 C# 应用程序都从一个名为 Main 的特殊方法开始执行。

使用方法涉及两个步骤:

  • 定义方法:描述方法做什么、它需要什么(参数)以及它返回什么。
  • 调用方法:执行方法内部的代码。

在 C# 中定义方法的语法如下:

<访问修饰符> <返回类型> <方法名称>(<参数列表>)
{
// 方法体
// 执行任务的代码
}
  • 访问修饰符:决定可见性(例如,public,private)。public 方法可以从任何地方调用,而 private 方法只能从同一类内部调用。
  • 返回类型:方法发送回的值的数据类型。如果方法不返回值,使用 void 关键字。
  • 方法名称:方法的描述性名称,遵循 PascalCase 命名约定(例如,CalculateSum)。
  • 参数列表:方法的输入变量的逗号分隔列表,用括号括起来。如果没有参数,使用空括号 ()。每个参数都有一个类型和一个名称。
  • 方法体:包含方法被调用时执行的语句的代码块。
public class Greeter
{
// 一个没有参数且没有返回值的方法
public void SayHello()
{
Console.WriteLine("Hello, World!");
}
// 一个带有参数和返回值的方法
public int Add(int a, int b)
{
int sum = a + b;
return sum;
}
}

要调用方法,你需要它所属的类的实例(除非它是 static 方法)。然后使用点(.)运算符。

using System;
public class Greeter
{
public void SayHello() => Console.WriteLine("Hello, World!");
public int Add(int a, int b) => a + b;
}
public class Program
{
public static void Main(string[] args)
{
// 创建 Greeter 类的实例
var greeter = new Greeter();
// 调用 SayHello 方法
greeter.SayHello(); // 输出: Hello, World!
// 调用 Add 方法并存储结果
int result = greeter.Add(10, 5);
Console.WriteLine($"The sum is: {result}"); // 输出: The sum is: 15
}
}

对于只包含单个表达式的方法,你可以使用一种更简洁的语法,称为表达式主体成员。

public class Calculator
{
// 传统方法体
public int Multiply(int x, int y)
{
return x * y;
}
// 使用表达式主体的相同方法
public int Add(int x, int y) => x + y;
}

你可以在另一个方法内部定义一个方法。这些方法被称为局部函数,并且只在包含它们的方法内部可见。它们对于不需要在其他地方公开的辅助例程很有用。

public void ProcessOrders(IEnumerable<Order> orders)
{
foreach (var order in orders)
{
// ... 某些逻辑 ...
Log(order.Id, "Processing");
// ... 更多逻辑 ...
Log(order.Id, "Completed");
}
// 局部函数只能在 ProcessOrders 内部访问
void Log(int orderId, string message)
{
Console.WriteLine($"[{DateTime.Now:T}] Order {orderId}: {message}");
}
}

C# 提供了几种向方法传递参数的方式,每种方式都有不同的行为。

关键字描述
(无)值传递。传入参数的副本。方法内部对参数的更改不会影响原始变量。
ref引用传递。传入参数的引用。方法内部对参数的更改会影响原始变量。变量在传入前必须被初始化。
out输出引用传递。用于从方法返回多个值。调用代码无需初始化变量,但方法在返回前必须给它赋值。
in输入引用传递。传入引用是为了性能(避免复制),但方法不能修改变量。变量在传入前必须被初始化。

out 的一个常见用例是 int.TryParse 方法,它尝试将字符串解析为整数,并返回一个布尔值表示成功与否,同时通过 out 参数提供结果。

string userInput = "123";
// 我们直接在调用处声明 'parsedValue'
if (int.TryParse(userInput, out int parsedValue))
{
Console.WriteLine($"Successfully parsed: {parsedValue}");
}
else
{
Console.WriteLine("Invalid number.");
}
  • 单一职责原则:一个方法应该只做一件事,并把它做好。避免创建处理太多任务的庞大方法。
  • 清晰命名:为方法使用描述性的、动词开头的名称(例如,GetUserById,CalculateTotalPrice)。
  • 保持简短:目标是创建简短、集中的方法。如果一个方法变得太长,考虑将其分解为更小的私有辅助方法或局部函数。
  • 为简洁使用表达式主体:如果一个方法只有一行代码,表达式主体成员(=>)可以提高可读性。