Частный класс с методом Public? - PullRequest
9 голосов
/ 15 октября 2011

Вот кусок кода:

private class myClass
{
   public static void Main()
   {

   }
}

        'or'

private class myClass
{
   public void method()
   {

   }
}

Я знаю, первый не будет работать. И второй будет.

Но почему сначала не работает? Есть ли какая-то конкретная причина для этого?

На самом деле ищет решение в этой перспективе, поэтому сделал его смелым. К сожалению

Ответы [ 4 ]

12 голосов
/ 15 октября 2011

Было бы значимым в этом сценарии;у вас есть открытый класс SomeClass, внутри которого вы хотите инкапсулировать некоторые функции, относящиеся только к SomeClass.Вы можете сделать это, объявив закрытый класс (SomePrivateClass в моем примере) в SomeClass, как показано ниже.

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

        }
    }

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

Это справедливо независимо от того, SomePrivateClass равен static илисодержит public static методов.

Я бы назвал это вложенным классом , и он рассматривается в другом потоке StackOverflow .

3 голосов
/ 15 октября 2011

Ричард Эв дал пример использования доступа во вложенных классах. Другой вариант использования для вложенных классов - это частная реализация открытого интерфейса:

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>.

0 голосов
/ 15 октября 2011
В методе

Main() начинается выполнение приложения, поэтому вы не можете скомпилировать свой первый класс (с помощью public static void Main()), потому что у вас уже есть метод Main где-то еще в вашем приложении.Компилятор не знает, с чего начать выполнение вашего приложения.

Ваше приложение должно иметь только один метод Main для компиляции с поведением по умолчанию, в противном случае вам нужно добавить параметр / main , когда выскомпилируйте его.

0 голосов
/ 15 октября 2011

Этот код синтаксически правильный.Но главный вопрос: это полезно или, по крайней мере, пригодно для использования в контексте, где вы хотите его использовать?Вероятно, нет, поскольку метод Main должен принадлежать классу public.

...