为什么没有“外部”访问修饰符?

时间:2010-12-11 15:57:37

标签: c#

也许我错过了一些东西,但是C#不应该有方法的外部访问修饰符?即一个修饰符,它使方法公开但仅适用于其他类,即该方法本身不能调用该方法?

对于像锁定这样的公共方法这样的东西来确保锁不会从类中重新出现那么这对它有用吗?

4 个答案:

答案 0 :(得分:8)

没有必要。访问控制用于限制从不受信任的客户端代码访问成员。

请记住,在OOP中,一个类代表一个自治的,独立的代码单元,并且隐含地假设它是自洽的。

如果您不能相信自己班级中的代码不会导致重入,那么您可以信任什么?用语言特征防止一切可能的可能性是不切实际的;有时,作为开发人员,您可以确保自己的代码正常工作:)

答案 1 :(得分:5)

具有显式实现的接口方法可能是您想要的最接近的方法。当然,如果一个类将this强制转换为接口类型,它仍然可以自己调用它们。

答案 2 :(得分:3)

我认为这没用。没有范式可以定义它的任何需要。

在您的示例中:即使存在external关键字,您如何确保在不释放锁的情况下无法在外部重新输入锁定?

班级之间有合同,班级总是与自己签订合同。我认为没有关键字可以帮助避免这样的编程错误。在此特定示例中,类应根据其使用级别正确实现锁定。

答案 3 :(得分:0)

这是我在Typescript上的笔。

也许这对于任何人都可以描述的问题都可以用外部访问修饰符解决

codepen

class ExternalUser {

  private static _time: number = 0;
  position: {x: number, y: number} = {x: 0, y: 0};

  constructor () {
    setInterval(this.bind(this.tick), 100);
  }

  external static set time(val: number) {
    ExternalUser._time = val;
  }

  static get time(): number {
    return ExternalUser._time;
  }

  private tick() {
    let someRandomThing = Math.random() > 0.95;
    if (someRandomThing) {
      ExternalUser.time += 100;// throws error, because set time is external
    }
    this.position={x: 10 * ExternalUser.time, y: ExternalUser.time * 10};
  }
}