C#访问修饰符的演变

C#语言中,访问修饰符是控制类成员访问权限的重要工具。它们包括public、protected、internal和private。public允许任何代码访问,protected允许所有派生类访问,internal允许同一程序集中的任何代码访问,而private则仅限于同一类中的代码访问。除此之外,C#还支持protected internal,它允许同一程序集中的所有代码以及所有派生类访问。

然而,之前缺少了一种更严格的访问控制:只允许同一程序集中的代码以及从该类派生的类访问这些成员。CLR(公共语言运行时)已经支持这种访问控制一段时间了,但在C#中并不合法。团队希望在C# 6中引入这个特性,使用“private protected”作为关键字。这引起了巨大的反馈。虽然每个人都喜欢这个特性,但对语法有很多负面反馈。经过多次讨论、思考和实验,这个特性又回来了,而且使用的是相同的语法。

让解释一下背后的一些思考。团队的一个主要目标是,这个特性不应该需要一个新的关键字,可能会破坏代码。新关键字可能在现有代码中用作标识符(变量、字段、方法、类名等)。实际上,C#语言设计团队自C# 2.0以来已经成功避免了添加任何新的全局关键字。所有LINQ、dynamic、async和await等特性都是使用上下文关键字实现的。上下文关键字只在特定上下文中具有特殊含义。这使得语言设计者能够添加新特性,而不太担心它们可能会破坏现有代码。

使用上下文关键字在谈论访问修饰符时非常困难。请记住,访问修饰符是可选的。类的成员有一个默认访问权限:private。因此,当语言解析器查看方法声明时,第一个标记可能是可选的访问修饰符,或者可能是返回类型。因此,用于新限制性访问的新关键字可能会破坏代码:如果某个开发人员创建了一个与提议的修饰符同名的类型,那么代码将会破坏。

所以,新关键字是不行的。这排除了像“protected or internal”和“protected and internal”这样的建议。如果不是因为破坏代码的问题,这些建议会很好。无论如何,这个特性都需要使用当前关键字的组合来实现。这种新的访问比当前的“protected internal”访问更受限制。使用的修饰符应该反映这一点。现在的设计问题变成了什么组合的访问修饰符关键字能够反映更受限制的访问,同时表达内部和受保护的修饰符都在起作用?

首先排除了将当前的“protected internal”访问重新用于这个特性,并将新的关键字组合用于现有特性的建议,这将会破坏太多的代码,而且工具无法知道是想要旧的含义还是新的含义。

另一个可能的建议是使“protected internal”保持当前的含义,使“internal protected”承担新的含义。那也是一个破坏性的变化。在当今世界,可以以任何顺序输入“protected”和“internal”关键字,它们具有相同的含义。这不符合破坏性变化的担忧。

在可能的组合中,“private protected”是最好的。除了“private internal”,它是唯一一个有意义的两个访问修饰符的组合,并且尚未使用。另一个选择可能是“private protected internal”,但那需要额外的打字。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485