总目录
文章目录
前言
方法是包含一系列语句的代码块。 程序通过调用该方法并指定任何所需的方法参数使语句得以执行。
一、方法概述
Main 方法是每个 C# 应用程序的入口点,并在启动程序时由公共语言运行时 (CLR) 调用。 在使用顶级语句的应用程序中,Main 方法由编译器生成并包含所有顶级语句。
1、方法签名
方法的访问修饰符(如 public
和 private
),可选修饰符(如 abstract
和sealed
),返回值,方法的名称,方法的参数列表,这些一同构成了方法的签名
- 当我们写重载方法的时候,要求方法签名中的 方法名相同即可
- 当我们写委托的时候以及对应的方法的时候,需要签名中的返回值和参数列表相同
以下案例包含四种方法的形式:
abstract class Motorcycle
{
// Anyone can call this.
public void StartEngine() {/* Method statements here */ }
// Only derived classes can call this.
protected void AddGas(int gallons) { /* Method statements here */ }
// Derived classes can override the base class implementation.
public virtual int Drive(int miles, int speed) { /* Method statements here */ return 1; }
// Derived classes must implement this.
public abstract double GetTopSpeed();
}
2、调用/访问方法/方法形参与实参
调用/访问( 略过):通过方法名调用方法,形如:xxxx.方法名();
public double Sum(double num1, double num2)
{
return num1 + num2;
}
如上(double num1, double num2)
声明在方法的参数列表中的变量,就是形参
public void Show()
{
int numA = 12345;
double result = Sum(numA, 12);
Console.WriteLine($"计算结果:{result}");
}
如上numA 和 12 均是实参,用于初始化形参的表达式或变量称作为实参,实参位于方法调用的参数列表中。
二、扩展方法
扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 扩展方法是一种静态方法,但可以像扩展类型上的实例方法一样进行调用。
1.实现扩展方法
为一个现有类型(类,接口,string,int 等数据类型)添加扩展方法,需要三个要素:
- 1.扩展方法所在的类为静态类
- 2.扩展方法本身要为静态方法
- 3.扩展方法的第一个参数要用关键字this,指向要扩展的类型
代码如下(示例):
public class DomainEntity
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
public static class DomainEntityExtensions
{
public static string FullName(this DomainEntity value)
=> $"{value.FirstName} {value.LastName}";
}
2、扩展方法调用
public void Test()
{
DomainEntity domainEntity = new DomainEntity()
{
Id=1,
FirstName= "Benjamin",
LastName= "Franklin"
};
//调用:方式1(类似于xxx.ToString())
string fullName = domainEntity.FullName();
Debug.WriteLine($"输出结果:{fullName}");//输出结果:Benjamin Franklin
//调用:方式2,通过静态类,像实例方法一样传入参数调用
fullName = DomainEntityExtensions.FullName(domainEntity);
Debug.WriteLine($"输出结果:{fullName}");输出结果:Benjamin Franklin
}
3、优先级问题
当扩展方法与 类中已有的方法重名时,类中的实例方法的优先级高于扩展方法
4、其他扩展方法示例
1.获得枚举的Description
public static class MyExtension
{
/// <summary>
/// 扩展方法,获得枚举的Description
/// </summary>
/// <param name="value">枚举值</param>
/// <param name="nameInstead">当枚举值没有定义DescriptionAttribute,是否使用枚举名代替,默认是使用</param>
/// <returns>枚举的Description</returns>
public static string GetDescription(this Enum value, Boolean nameInstead = true)
{
Type type = value.GetType();
string name = Enum.GetName(type, value);
if (name == null)
{
return null;
}
FieldInfo field = type.GetField(name);
DescriptionAttribute attribute = System.Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;
if (attribute == null && nameInstead == true)
{
return name;
}
return attribute?.Description;
}
}
public enum City
{
[Description("北京(首都)")]
BeiJing,
[Description("上海")]
ShangHai,
[Description("广州")]
GuangZhou,
}
public void Test()
{
City city = City.BeiJing;
var res= city.GetDescription();
Debug.WriteLine(res);//北京(首都)
}
2.其他常用扩展方法
三、方法参数列表详解
1、可选自变量(可选参数)
由上图可知,我们使用可选参数的时候,有以下几点需要注意:
- 1 方法的参数列表中,可选参数不可在必需参数之前
- 2 方法的参数列表中,可以均使用可选参数,也可均不使用,也可部分使用(部分使用时需遵循第一点规则)
2、命名自变量(命名参数)
3、可变数量参数
使用 params 关键字可以指定采用数目可变的参数的方法参数。
- 参数类型必须是一维数组。
- 在方法声明中的 params 关键字之后不允许有任何其他参数,并且在方法声明中只允许有一个 params 关键字。
- 在使用不定长参数params时,如果除了params参数还有其他参数,params参数要作为最后一个参数.否则程序无法识别.
结语
以上就是本文的内容,希望以上内容可以帮助到您,如文中有不对之处,还请批评指正。
参考资料:
C#编程指南 - 方法
方法参数(C# 参考)
C#中的参数和调用方式(可选参数、具名参数、可空参数、不定长参数)
C#参数详解一(形参和实参)
常见扩展方法