方法是什么
方法(Method) 是一个可复用的、命名的代码块。
在这个定义中,描述了方法的三个特点:
- 方法是一个代码块:花括号包裹的是执行特定任务的一系列语句;
- 方法是一个命名的代码块:可以使用一个名字表示这个代码块。
- 方法可复用:将一段常用的功能封装成方法,可以在程序的不同地方多次调用,无需重复编写相同的代码。
比喻
方法就像厨房里的食谱:
- 方法名:食谱的名字(如"做蛋炒饭")
- 参数:需要的食材(如"鸡蛋、米饭、盐")
- 方法体:烹饪步骤
- 返回值:做好的菜品
方法的由来
方法的主要目的:是为了解决代码复用的问题。假设这里有一段经常需要重复调用的代码:
如果没有方法,它将让代码变得臃肿、维护困难。
namespace LessonMethodBasic
{
internal class Program
{
static void Main(string[] args)//特殊方法:入口方法
{
Console.WriteLine("第1步");
Console.WriteLine("第2步");
Console.WriteLine("第3步");
Console.WriteLine("第4步");
Console.WriteLine("第5步");
Console.WriteLine("第1步");
Console.WriteLine("第2步");
Console.WriteLine("第3步");
Console.WriteLine("第4步");
Console.WriteLine("第5步");
}
}
}
如果使用方法,
namespace LessonMethodBasic
{
internal class Program
{
public static string DoJob(/*[形式参数]*/){
Console.WriteLine("第1步");
Console.WriteLine("第2步");
Console.WriteLine("第3步");
Console.WriteLine("第4步");
Console.WriteLine("第5步");
return "成功";
}
static void Main(string[] args)//特殊方法:入口方法
{
//方法调用的语法:方法名([实际参数])
string s = DoJob();//返回值是方法调用结束后,返回的那个值。
Console.WriteLine(s);
}
}
}
方法的书写位置:
在定义一个方法前,首先要清楚方法的书写位置: 方法要写在类中。
类有四大成员:字段、属性、方法、构造函数
定义方法的步骤:
- 第一步:方法体:创建代码块。使用花括号包裹多行代码。由大括号
{}包围,里面是方法被调用时要执行的一系列语句。 - 第二步:命名方法。方法的标识符,用于调用方法。应使用 PascalCase 命名法(每个单词首字母大写)并具有描述性(如
GetUserById)。规则:1.标识符规则 2.帕斯卡 3.有语义 4.英文 5.动词: - 第三步:设置参数列表(Parameters):定义传递给方法的数据,写在括号
()内。多个参数用逗号分隔。每个参数都需要指定类型和名称。即使没有参数,括号()也不能省略。 - 第四步(可选):返回类型(Return Type):方法执行完毕后返回的数据类型(如
int,string,double,bool, 或自定义的类)。如果方法不返回任何值,必须使用关键字void。- 对于非
void返回类型的方法,必须使用return关键字来返回一个与声明类型兼容的值。 - 对于
void方法,return语句可以省略(方法执行到末尾会自动返回)。也可以使用return;来提前结束方法,但不返回任何值。
- 对于非
- 第五步:变量类型:规定方法变量名的数据类型
- 第六步(可选):指定是否是静态方法(类的方法):static指定为静态
- 第七步(可选):访问修饰符(Access Modifier):定义了方法的可访问性。
-
public:方法可以被任何其他代码访问。 -
private:方法只能在定义它的类内部访问(最常见的情况)。 -
protected,internal等:用于更复杂的访问控制。
-
方法的语法
定义方法的语法
[访问修饰符] [静态修饰符] 返回类型 方法名(数据类型 形参名,数据类型 形参名)
{
// 方法体 - 要执行的代码
return 返回值; // 如果返回类型不是void
}
调用方法的语法
可以通过“调用”方法的名称来执行它里面的代码。
方法名(实参);
示例
1.无参数无返回值
namespace ConsoleApp2
{
//默认修饰符:internal
internal class Program
{
//方法定义
public static void PrintHello()
{
Console.WriteLine("Hello, World!");
}
public static void Main(string[] args)
{
//方法调用
PrintHello();
}
}
}
2.有参数无返回值
namespace ConsoleApp2
{
//方法定义
static void QueryAge(string userName, int birthYear)
{
int userAge = 2025 - birthYear;
Console.WriteLine($"{userName}的年龄是{userAge}");
}
internal class Program
{
public static void Main(string[] args)
{
//方法调用
QueryAge("张三", 2007);
}
}
}
3.有参数有返回值
namespace ConsoleApp2
{
//默认修饰符:internal
internal class Program
{
//方法定义
static int squareValue(int value)
{
//return:用于设置返回值的关键字
return value * value;
}
public static void Main(string[] args)
{
//方法调用
squareValue(5);
}
}
}
4.有参数有返回值
// 定义一个加法方法
public int Add(int number1, int number2)
{
int sum = number1 + number2;
return sum; // 返回 int 类型的结果
}
// 调用方法
int result = Add(5, 10); // 将 5 和 10 作为参数传递,并将返回值 15 赋给 result
Console.WriteLine(result); // 输出:15
参数的用法
ref修饰符
示例:ref 修饰符在 C# 中表示引用传递,它让方法能够直接操作调用者的原始变量,而不是操作变量的副本。
static void Main(){
//示例5:ref
int a = 5;
Console.WriteLine($"调用前: {a}"); // 输出: 5
//WithoutRef(a);
//Console.WriteLine($"调用后(无ref): {a}"); // 输出: 5
WithRef(ref a);
Console.WriteLine($"调用后(有ref): {a}"); // 输出: 100
}
// 没有使用 ref 的情况 - 值传递
public static void WithoutRef(int b)
{
b = 100; // 只修改副本
Console.WriteLine($"方法内: {b}"); // 输出: 100
}
// 使用 ref 的情况 - 引用传递
public static void WithRef(ref int c)
{
c = 100; // 修改原始变量
Console.WriteLine($"方法内: {c}"); // 输出: 100
}
示例:下面的num1和num2分别是多少
private static void Increase(ref int num1, int num2)
{
num1++;
num2++;
}
static void Main(string[] args)
{
int num1 = 34;
int num2 = 55;
Increase(ref num1, num2);
Console.WriteLine("{0}和{1}",num1,num2);
}
使用 out 参数(一个方法返回多个值)
有时你需要从一个方法返回多个值,return 关键字只能返回一个。这时可以使用 out 参数。
// 方法尝试将字符串转换为整数,并通过 out 参数返回转换后的值,自身返回转换是否成功
public bool TryParseInt(string input, out int result)
{
try
{
result = int.Parse(input); // 为 out 参数赋值
return true; // 转换成功,返回 true
}
catch
{
result = 0; // 即使失败,也必须为 out 参数赋值
return false; // 转换失败,返回 false
}
}
// 调用方法
string userInput = "42";
if (TryParseInt(userInput, out int parsedValue)) // 调用时也需要使用 out 关键字
{
Console.WriteLine($"Parsing successful! Value is {parsedValue}");
}
else
{
Console.WriteLine("Parsing failed!");
}
// .NET 自带的 int.TryParse() 方法正是这样工作的
参数(Parameter) vs. 实参(Argument)
重要概念区分
-
参数(Parameter):是方法定义时声变量。它们是方法的“占位符”。
- 例如:
(int number1, int number2)中的number1和number2是参数。
- 例如:
-
实参(Argument):是调用方法时实际传递给参数的具体值或表达式。
- 例如:在
Add(5, 10)中,5和10是实参。
- 例如:在
简单记:参数是变量,实参是值。
return语句的用法
return语句用于终止执行并将控制权(可能带有值)返回给调用者。void 方法可省略或用 return; 提前结束
方法名字
- 给方法起好名字
一个好名字的方法(如 CalculateSalary(), ValidateUserInput())可以清晰地表达代码的意图,让读者一眼就知道这段代码在做什么。
// ✅ 好的名字 - 一看就知道做什么
public static double 计算圆的面积(double 半径)
public static string 获取用户名(int 用户ID)
// ❌ 不好的名字 - 太模糊
public static void 处理()
public static int 方法1()
- 保持方法简短
// ✅ 好的:每个方法只做一件事
public static double 计算折扣(double 原价, double 折扣率)
{
return 原价 * 折扣率;
}
public static double 计算总价(double 折后价, double 税费)
{
return 折后价 + 税费;
}