C# 方法仅可供外部访问?

C# 方法仅可供外部访问?,c#,.net,vb.net,C#,.net,Vb.net,有没有可能让方法具有只能在外部调用而不能在内部调用的方法?如果是,怎么做 Public Class Foo Public Sub New() Bar ' Should fail to compile as Bar is only accessible externally.' End Class Public External Sub Bar() End Sub End Class 不,这在C或VB中是不可能的。你为什么要这么做?为什么信任类内的代码比信任类外的代码少?

有没有可能让方法具有只能在外部调用而不能在内部调用的方法?如果是,怎么做

Public Class Foo
  Public Sub New()
    Bar ' Should fail to compile as Bar is only accessible externally.'
  End Class
  Public External Sub Bar()
  End Sub
End Class

不,这在C或VB中是不可能的。你为什么要这么做?为什么信任类内的代码比信任类外的代码少?

不,这在C或VB中是不可能的。你为什么要这么做?为什么信任类内的代码比信任类外的代码要少

有没有可能让方法具有只能在外部调用而不能在内部调用的方法?如果是,怎么做

Public Class Foo
  Public Sub New()
    Bar ' Should fail to compile as Bar is only accessible externally.'
  End Class
  Public External Sub Bar()
  End Sub
End Class
不,这不可能在编译时停止,您可以在运行时遍历堆栈,但这闻起来很可怕

你能解释一下你为什么想要这个吗

有没有可能让方法具有只能在外部调用而不能在内部调用的方法?如果是,怎么做

Public Class Foo
  Public Sub New()
    Bar ' Should fail to compile as Bar is only accessible externally.'
  End Class
  Public External Sub Bar()
  End Sub
End Class
不,这不可能在编译时停止,您可以在运行时遍历堆栈,但这闻起来很可怕


你能解释一下你为什么要这样做吗?

我认为这不是一个简单的方法,通常情况下是相反的,你想在内部使用一些东西,防止消费者调用内部的东西。在内部,作为类的设计者,您知道事情是如何工作的,并且不需要阻止您访问某些方法


该类的设计者/编码者可能已经编写了内部方法和公共方法,因此他/她将知道什么不应该从内部调用。。。如果有道理的话。。。如果你有一个好的设计,我有点怀疑。

我认为这不是一个简单的方法,通常是相反的方法,你想在内部使用一些东西,防止消费者调用内部的东西。在内部,作为类的设计者,您知道事情是如何工作的,并且不需要阻止您访问某些方法


该类的设计者/编码者可能已经编写了内部方法和公共方法,因此他/她将知道什么不应该从内部调用。。。如果有道理的话。。。如果你有一个好的设计,我有点怀疑。

我很好奇你为什么要这样做?曾经

但不,简而言之,你不能。您是开发人员,所以请确保您从未调用它

现在,您可以尝试强制它在运行时失败:

public void MyExternalOnlyMethod(object sender) 
{
    if(sender==this) throw new ICantCallMeException();
}
当然,您必须确保您对这个方法的内部方法调用(您不应该首先编写这个方法)必须以发送者的身份发送它

但是就像其他人说的

为什么


使用抽象方法几乎是最接近的,但这只是为了要求派生类实现某些您自己在类中不会实现的功能。

我很好奇您为什么要这样做?曾经

但不,简而言之,你不能。您是开发人员,所以请确保您从未调用它

现在,您可以尝试强制它在运行时失败:

public void MyExternalOnlyMethod(object sender) 
{
    if(sender==this) throw new ICantCallMeException();
}
当然,您必须确保您对这个方法的内部方法调用(您不应该首先编写这个方法)必须以发送者的身份发送它

但是就像其他人说的

为什么


使用抽象方法几乎是最接近的,但这只是为了要求派生类实现某些您自己在类中不会实现的功能。

如果显式实现接口,则实现需要强制转换;听起来不完全像你想要的,但在紧要关头它可能会起作用?但是,也许最好能概括一下你为什么要这样做,也许有一个更好的整体方法

public class Foo : IBar
{
    void IBar.Bar() {}

    void AMethod() { 
        Bar(); // Compile Failure
        ((IBar)this).Bar(); // No failure
    }
 }

请注意,这需要外部代码也将对象引用为IBar,这可能会使它更不适合作为解决方案。抱歉。

如果显式实现接口,则实现需要强制转换;听起来不完全像你想要的,但在紧要关头它可能会起作用?但是,也许最好能概括一下你为什么要这样做,也许有一个更好的整体方法

public class Foo : IBar
{
    void IBar.Bar() {}

    void AMethod() { 
        Bar(); // Compile Failure
        ((IBar)this).Bar(); // No failure
    }
 }

请注意,这需要外部代码也将对象引用为IBar,这可能会使它更不适合作为解决方案。抱歉。

我很好奇:你需要它做什么?它必须是可能的,因为构造函数不能在内部访问。我不是说你应该,但你不能。你可以访问构造函数,只是不像方法那样。从内部到外部都一样。我很好奇:你需要它做什么?它必须是可能的,因为构造函数不能在内部访问。我不是说你应该,但你不能。你可以访问构造函数,只是不像方法那样。从内部和从外部相同。这仍然可以从对象内部的其他方法调用。哦,你的意思是该方法可能是发送方,我想?看到了。假设我想阻止自己喂食婴儿。@Adam:那么你就不用在代码中调用这个方法了。类中的代码不受信任

船员行动。@Jon Skeet我想这会使事情变得更糟。这仍然可以从对象内部的其他方法调用。哦,你是说这个方法可能是发送者,我想?看。假设我想阻止自己喂食婴儿。@Adam:那么你就不用在代码中调用这个方法了。相信类内的代码不会出错。@Jon Skeet我认为这会使出错更加困难。这只是出于好奇,因为你可以有内部唯一的。我想让调用功能更明确。这只是出于好奇,因为你可以有内部唯一的。我想让调用功能更明确。也许他只是好奇。就我个人而言,当我几年前第一次了解访问修饰符时,我也在想同样的事情。大约一秒钟后,我意识到这样一个功能是无用的。请参阅下面我发布的注释和链接,其他假设方法在默认情况下是非递归的,您可以添加一个属性来显式地允许它。@亚当:为什么不在代码中明确说明呢?你为什么需要编译器来强制执行这一点?@Jon,我认为当你实现一个适配器或包装类时,它可能会很有用:这样的修饰符会阻止你递归调用相同的方法stackoverflow exeption,而不是包装的方法。也许他只是好奇。就我个人而言,当我几年前第一次了解访问修饰符时,我也在想同样的事情。大约一秒钟后,我意识到这样一个功能是无用的。请参阅下面我发布的注释和链接,其他假设方法在默认情况下是非递归的,您可以添加一个属性来显式地允许它。@亚当:为什么不在代码中明确说明呢?为什么您需要编译器来强制执行此操作?@Jon,我认为当您实现适配器或包装器类时,它可能会很有用:这样的修饰符将阻止您递归调用相同的方法stackoverflow exeption,而不是包装的方法。