Skip to main content

概述

签名是什么

在编程的世界里,“签名”(Signature)就像是一个函数的“身份证”或“外部轮廓”

它只定义了这个成员“长什么样”,而不定义它“具体怎么干活”。就像一份合同,只规定了甲方乙方要对接哪些信息,至于拿到信息后回公司怎么处理,合同是不管的。


1. 方法签名的组成部分

在 C# 中,一个方法的签名严格由以下几个核心要素构成:

  • 方法名称(如 Calculate
  • 参数的数量
  • 参数的类型
  • 参数的修饰符(如 ref, out, in

特别注意: 返回类型(如 intvoid)在 C# 编译器的定义中不属于方法签名的一部分。但在接口定义的上下文中,我们通常把返回类型、名称和参数列表看作一个完整的“方法声明”。


2. 为什么叫“签名”?

你可以这样理解:

  • 接口: 是一张空表格。它写着:“这里需要一个叫 Alert 的方法,且不需要传入任何参数。”
  • 实现接口的类: 就像是在这张表格上签字确认。类说:“我承诺提供一个一模一样的 Alert 方法,它的名字、参数和接口要求的一分不差。”

3. 代码对比:签名 vs. 实现

在接口中,你看到的只是签名;在类中,你看到的是签名 + 实现

public interface ICalculator
{
// 这就是【签名】:
// 它告诉外界:有个方法叫 Add,接收两个 int,返回一个 int
int Add(int x, int y);
}

public class SimpleMath : ICalculator
{
// 这就是【实现】:
// 签名必须和接口一致,但后面多了大括号 {} 里的具体逻辑
public int Add(int x, int y)
{
return x + y; // 具体的干活逻辑
}
}


4. 属性和事件的签名

不只是方法有签名,接口中的其他成员也有:

  • 属性签名: 定义属性的名称、类型以及它是可读(get)、可写(set)还是两者兼有。

  • 例子: string Name { get; set; }

  • 事件签名: 定义事件的名称和它所基于的委托类型(Delegate)。

  • 例子: event EventHandler OnDataReceived;


总结

理解签名的关键在于**“一致性”: 接口定下了签名,实现它的类就必须精准匹配**这些签名,否则编译器就会报错。这保证了无论你切换哪个实现类,调用者代码里的方法调用方式(传什么参数、叫什么名字)都不需要改变。

需要我为你演示一下,如果方法签名不匹配(比如参数类型错了),C# 编译器会报什么样的错误吗?