c# - 如果实现在同一个程序集中,为什么部分方法不能公开?

标签 c# .net partial-classes

根据 MSDN Documentation对于部分类(class):

Partial methods are implicitly private

所以你可以拥有这个

// Definition in file1.cs
partial void Method1();

// Implementation in file2.cs
partial void Method1()
{
  // method body
}

但你不能拥有这个

// Definition in file1.cs
public partial void Method1();

// Implementation in file2.cs
public partial void Method1()
{
  // method body
}

但这是为什么呢?编译器无法处理公共(public)分部方法是否有某种原因?

最佳答案

部分方法必须在编译时完全可解析。如果它们在编译时不存在,那么它们将完全从输出中消失。部分方法起作用的全部原因是删除它们不会影响单行调用站点之外的 API 或程序流(这也是它们必须返回 void 的原因)。

当您向公共(public) API 添加方法时 - 您正在为其他对象定义契约(Contract)。由于分部方法的全部意义在于使其成为可选的,您基本上会说:“我有一个您可以依赖的契约(Contract)。哦,等等,但是您不能依赖此方法。”

为了使公共(public) API 合理,部分方法必须真的要么总是存在,要么总是消失——在这种情况下,它不应该是部分的。

理论上,语言设计者可以改变部分方法的工作方式,以实现这一点。他们可以使用 stub (即:一种什么都不做的方法)来实现它们,而不是从它们被调用的任何地方删除它们。但是,这不会那么有效,并且对于部分方法设想的用例来说是不必要的。

关于c# - 如果实现在同一个程序集中,为什么部分方法不能公开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2024790/

相关文章:

c# - Duck Typing DynamicObject 派生

c# - PrintPreviewDialog中MeasureString测得的字符串高度与实际打印时不一致

c# - PCL 程序集和读取资源文件

c# - 后台对象的初始化

c# - 如何在 Microsoft Graph 中使用 DI

c# - 如何查看 silverlight 项目中部分类的其余部分?

c# - ASP.NET MVC 路由返回 null

c# - 如何在不使用partial关键字的情况下进行部分类?

c# - 我应该将 Dispose 逻辑分离到一个部分类文件中吗?

c# - EAZfuscator 无法自动工作