访问修饰符是 C# 中方法签名的一部分吗?
Posted
技术标签:
【中文标题】访问修饰符是 C# 中方法签名的一部分吗?【英文标题】:Is access modifier part of Method Signature in C#? 【发布时间】:2015-09-21 03:54:34 【问题描述】:MSDN 这里的https://msdn.microsoft.com/en-us/library/ms173114.aspx 说像“private/protected”这样的访问修饰符是 c# 中方法签名的一部分。
但是下面这个链接似乎不这么认为Method Signature in C#
是哪一个?还有一个静态方法呢?关键字“静态”是方法签名的一部分吗?
谢谢
【问题讨论】:
您正在混合该页面中称为用于方法重载的方法签名的一部分和该页面中的“通用”方法签名...据说返回类型不是“方法重载签名”的一部分......显然,即使abstract
/sealed
/public
/private
部分也不属于它。跨度>
谢谢。我很想了解“一般”方法签名指南。 “静态”是方法签名的一部分吗?
我认为这个问题的一个很好的答案会澄清“方法签名”的含义,它是如何使用的,以及为什么可能有多个定义。
一般来说,理柏here 的回答对你的问题来说已经足够好了(这实际上并不是另一个问题的重复......简单地说,答案对两者都有好处)
【参考方案1】:
C# 5.0 specification,1.6.6.方法:
方法的签名由方法的名称、 类型参数的数量及其数量、修饰符和类型 参数。方法的签名不包括返回 输入。
CLI specification,I.8.6.1.5 方法签名:
调用约定* 泛型参数的数量,如果方法是泛型的, 如果调用约定指定 this 是一个实例方法,并且拥有的方法定义属于类型 T,则 this 指针的类型是 ... [此处无关] 零个或多个参数签名的列表——方法的每个参数一个, 结果值的类型签名(如果已生成)。注意事项:
* 调用约定包括静态/实例规范。
供参考,II.15.3 调用约定:
调用约定指定方法如何期望其参数 从调用者传递给被调用的方法。它由两个 部分:第一个处理 this 的存在和类型 指针,而第二个与传输机制有关 论据。
结论:方法签名的定义中没有一个包含访问修饰符。
【讨论】:
但是正如这里写的***.com/a/8809191/613130,方法签名有两种定义。 C# 语言定义 和 CLR,然而,... @xanatos 好的,这很有趣,我认为 CLR 没有公共规范,所以我们怎么知道 CLR 是如何定义签名的。 显然有一个公共规范...有一个完整的 ECMA 标准来描述如何构建程序集... ECMA-335 @xanatos CLR 和 CLI 不一样,但是这个主题在 ECMA-335 中得到了广泛的介绍 @nesh_s 在 CLI 定义中:静态 - 是,访问修饰符 - 否。在 C# 定义中:两者都没有。【参考方案2】:不相信静态是方法签名的一部分,因为即使调用了静态方法:
Classname.StaticMethodName(..);
调用实例方法时:
var o = new Classname();
o.MethodName(..);
它仍然定义了与签名匹配的方法和参数。有关静态与实例方法和签名的更多信息,请参阅此内容:Static and Instance methods with the same name?
访问级别不是签名的一部分,因为您不能拥有:
public void DoThis();
private void DoThis();
两个方法具有相同的签名,因为签名基于方法、泛型参数和方法参数/类型。
以下内容有效:
public void DoThis();
private void DoThis(int x);
或者:
public void DoThis();
private int DoThis<int>();
【讨论】:
void Method()
和 static void Method()
不能在同一个班级。【参考方案3】:
简单地说,没有。方法签名是由它的方法名和它接受的参数决定的。
【讨论】:
不完全正确。有两种定义(CLI 和 C#),一种包括返回类型和静态修饰符,其他不包括。以上是关于访问修饰符是 C# 中方法签名的一部分吗?的主要内容,如果未能解决你的问题,请参考以下文章