C# 为什么没有"?;“外部”;访问修改器?

C# 为什么没有"?;“外部”;访问修改器?,c#,C#,也许我遗漏了一些东西,但C#不应该为方法设置外部访问修饰符吗?一个修饰符,使一个方法公开,但只对其他类公开,即该方法不能被类本身调用 对于执行锁定以确保锁不会从类中重新生成的公共方法来说,这不是很有用吗?带有显式实现的接口方法可能是最接近您需要的方法。当然,如果类将this强制转换为接口类型,它仍然可以自己调用它们。没有任何范例可以定义对它的任何需求 在您的示例中:即使存在external关键字,您如何确保在不释放锁的情况下无法从外部重新输入锁 类之间存在契约,并且类始终与其自身存在契约。我认为

也许我遗漏了一些东西,但C#不应该为方法设置外部访问修饰符吗?一个修饰符,使一个方法公开,但只对其他类公开,即该方法不能被类本身调用


对于执行锁定以确保锁不会从类中重新生成的公共方法来说,这不是很有用吗?

带有显式实现的接口方法可能是最接近您需要的方法。当然,如果类将
this
强制转换为接口类型,它仍然可以自己调用它们。没有任何范例可以定义对它的任何需求

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


类之间存在契约,并且类始终与其自身存在契约。我认为没有关键字可以帮助避免这样的编程错误。在这个特定的示例中,类应该根据其使用级别正确地实现锁定。

不需要它。访问控制用于限制不受信任的客户端代码对成员的访问

请记住,在OOP中,类表示一个自治的、自包含的代码单元,并且隐式地假定它是自一致的


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

这是我的打字脚本

也许这对任何人来说都是有用的,可以用外部访问修改器来描述这个问题


有一个
extern
关键字,但它不用于您描述的内容。这只对有多重人格障碍的程序员有用。如果希望类无法访问方法,请将它们放在其他类中。根据设计,oop类应该能够访问和控制类中包含的方法和数据。实际上,我认为其他答案更好。我本来打算大声疾呼,说你不应该需要这种行为,但是想出一个聪明的解决方案的诱惑太大了。这个界面就是一个很好的例子
IProgress.Report
是一个私有成员,因此任何创建
Progress
类的人都看不到
Report()
方法,但是所有使用
IProgress
接口的消费者都可以调用
Report()
方法进行回调。我不知道,我认为澄清代码意图并确保某些行为的语法通常是一件好事,这就是为什么我们有readonly关键字之类的东西。一个类没有理由不能与自己有一个“契约”
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};
  }
}