KMC*_*KMC 23 c# method-signature
方法签名(或方法的签名)的正确定义是什么?
在谷歌上,我找到了各种定义:
它是方法名称和参数列表的组合
这是method signature = method name + argument list什么意思?然后我看不出" 方法 "和" 方法签名 " 之间的区别.
如果我有一个方法:
public void Foo(int x, int y) { ... }
Run Code Online (Sandbox Code Playgroud)
我的方法签名会是以下之一,还是两者都不是?
如果有人问我该方法的方法签名是什么,我该怎么回答?
Eri*_*ert 28
这里有一些正确的答案,它们将方法签名定义为方法名称,泛型arity,形式参数arity和形式参数类型和种类,但不是返回类型或"params"修饰符.
虽然这是正确的,但这里有一些细微之处.该方法的C#语言定义的方法签名是从不同的方式,CLR定义方法签名,和C#等语言之间的互操作时,可导致一些有趣的问题.
对于CLR,方法签名由方法名称,泛型arity,形式参数arity,形式参数类型和种类以及返回类型组成.所以有第一个区别; CLR考虑返回类型.
CLR也不认为"out"和"ref"具有不同的形式参数种类; C#的确如此.
CLR还有一个有趣的功能叫做"可选和必需的类型修饰符",通常称为"modopts"和"modreqs".可以使用另一种告诉您"主"类型的类型来注释方法签名中的类型.例如,在C++中,这是两个不同的签名:
void M(C const & x);
void M(C & x);
Run Code Online (Sandbox Code Playgroud)
两个签名都定义了一个方法M,它采用"引用C"类型的参数.但是因为第一个是const引用而第二个不是,所以C++语言认为这些是不同的签名.CLR通过允许C++/CIL编译器在形式参数类型上为特殊的"this is const"类型发出modopt来实现这一点.
没有办法在C#中读取或设置mod,但C#编译器仍然知道它们并且会以某种方式尊重它们.例如,如果您在C++/CIL中声明了一个公共虚方法,如:
void V(C const * x)
Run Code Online (Sandbox Code Playgroud)
并且在用C#编写的派生类中重写它,C#编译器将不会强制执行const正确性; C#编译器不知道const modopt的含义.但是C#编译器将确保在modopt到位的情况下将重写方法发送到元数据中.这是必要的,因为CLR需要覆盖和重写方法的签名才能匹配; 编译器必须遵守签名匹配的CLR规则,而不是C#规则.
Rob*_*ner 13
来自MSDN:
方法的签名包括方法的名称以及每个形式参数的类型和种类(值,引用或输出),按从左到右的顺序考虑.方法的签名特别不包括返回类型,也不包括可以为最右边的参数指定的params修饰符.
这里重要的部分是方法的返回类型不属于其签名.所以你不能重载只有返回类型不同的方法!
方法签名是编译器可用于标识方法的方法的属性集.
attrbutes是:方法名称,参数数量,参数类型和参数顺序.
不同方法签名的示例:
Foo()
Foo(int)
Foo(String)
Foo(int, string)
Foo(string, int)
Run Code Online (Sandbox Code Playgroud)
所有这些方法都不同,当您在代码中调用它们时,编译器可以使用方法签名推断您打算执行哪个方法.
不要忘记模块化编程中方法的范围......