私有类中使用公共方法?

10

这里是一段代码:

private class myClass
{
   public static void Main()
   {

   }
}

        'or'

private class myClass
{
   public void method()
   {

   }
}

我知道,第一个解决方案不会起作用。而第二个会起作用。

但是第一个为什么不行?有具体原因吗?

实际上,我正在从这个角度寻找解决方案,所以将其加粗了。抱歉。


很难猜到你的意思,两者都不是有效的。只有嵌套类可以是私有的。非嵌套类不能是私有的,因为它永远无法被任何代码使用。 - Hans Passant
@rapsalands - 你具体指的“不起作用”是什么意思? - Richard Ev
@Hans:为什么没有人使用它?私有类可以在命名空间内访问,可以实例化,并且公共成员可以通过它访问。 - Sandy
@Richard:它无法编译。 - Sandy
不行。编译器已经明确表示过了:在命名空间中定义的元素不能被显式地声明为 private、protected 或 protected internal - Hans Passant
@Hans:谢谢,你说得对。我误解了一些事情。感谢你的耐心等待。它们都不会起作用。 - Sandy
4个回答

15

在这种情况下,这将是有意义的;你有一个公共类SomeClass,在其中你想要封装一些仅与SomeClass相关的功能。你可以通过在SomeClass内声明一个私有类(在我的示例中为SomePrivateClass)来实现这一点,如下所示。

public class SomeClass
{
    private class SomePrivateClass
    {
        public void DoSomething()
        {

        }
    }

    // Only SomeClass has access to SomePrivateClass,
    // and can access its public methods, properties etc
}

无论SomePrivateClassstatic还是包含public static方法,这都是正确的。

我会称之为嵌套类,在另一个StackOverflow线程中有详细探讨。


2
“只有 SomeClass 可以访问[...]它的公共方法” - 这并不完全准确。如果您将嵌套的私有类的引用提供给外部的类之外的某个人,它也将可以访问这些公共方法(请参阅我的答案以获取示例)。 - Allon Guralnek
2
Allon提出了一个很好的观点。然而,在这种情况下,您正在提供对实现公共接口的私有类实例的引用。因此,“外部的某个人”通过提供的接口访问私有类,它没有明确知道私有类本身。 - Richard Ev
DoSomething 可以被什么访问? - Frederick
1
@Frederick - 任何可以访问SomePrivateClass实例的SomeClass内部内容都可以调用该实例上的DoSomething方法。 - Richard Ev

3

Richard Ev提供了一个访问嵌套类内部的用例。嵌套类的另一个用例是公共接口的私有实现:

public class MySpecialCollection<T> : IEnumerable<T>
{ 
    public IEnumerator<T> GetEnumerator()
    {
        return new MySpecialEnumerator(...);
    }

    private class MySpecialEnumerator : IEnumerator<T>
    {
        public bool MoveNext() { ... }
        public T Current
        { 
            get { return ...; }
        }
        // etc...
    } 
}

这样可以提供一个公共接口或基类的私有(或受保护的或内部的)实现。使用者不需要知道也不需要关心具体的实现细节。这也可以通过将 MySpecialEnumerator 类设置为内部类来完成,因为您无法拥有非嵌套的私有类。
BCL 广泛使用非公共实现。例如,由 LINQ 操作符返回的对象是实现了 IEnumerable<T> 的非公共类。

1

这段代码在语法上是正确的。但是最重要的问题是:它是否有用,或者至少在你想使用它的上下文中可用?可能不是,因为 Main 方法必须在一个 public 类中。


0

Main() 方法是应用程序执行的起点,所以你无法编译你的第一个类(带有 public static void Main())是因为你的应用程序中已经有了其他地方的 Main 方法。编译器不知道从哪里开始执行你的应用程序。

你的应用程序必须只有一个 Main 方法才能使用默认行为进行编译,否则你需要在编译时添加 /main 选项。


谢谢,但我没有两个Main方法。我修改了Program.cs中的一个方法。问题在于私有类而不是方法名称。还是谢谢。 - Sandy
你的项目、应用程序或库是什么类型?如果你把所有的代码都添加到问题中,那会很有帮助的。 :) - Ekk
这里私有类不是问题。 - Ekk
它的应用,在库中Main方法的必要性是什么? - Sandy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接