10

コードの一部を次に示します。

private class myClass
{
   public static void Main()
   {

   }
}

        'or'

private class myClass
{
   public void method()
   {

   }
}

私は知っています、最初のものはうまくいきません。そして2つ目はそうするでしょう。

しかし、なぜ最初に機能しないのですか? 具体的な理由はありますか?

実際にこの観点で解決策を探しているので、大胆になりました。ごめん

4

4 に答える 4

15

このシナリオでは意味があります。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これは、 isstaticであるか、メソッドを含むかに関係なく当てはまりpublic staticます。

これをネストされたクラスと呼び、別のStackOverflow スレッドで調べます。

于 2011-10-15T10:42:53.500 に答える
3

Richard Ev は、ネストされたクラス内でのアクセスの使用例を示しました。ネストされたクラスのもう 1 つの使用例は、パブリック インターフェイスのプライベート実装です。

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>

于 2011-10-15T10:50:33.187 に答える
1

このコードは構文的に正しいです。しかし、大きな問題は次のとおりです。それは有用ですか、または少なくとも使用したいコンテキストで使用できますか? メソッドはクラスMain内にある必要があるため、おそらくそうではありません。public

于 2011-10-15T10:38:37.183 に答える
0

Main()method はアプリケーションの実行が開始される場所であるため、最初のクラスを ( で) コンパイルできない理由は、アプリケーションの別の場所にpublic static void Main()既にMainmethod があるためです。コンパイラは、アプリケーションの実行を開始する場所を認識していません。

アプリケーションにはMain、既定の動作でコンパイルするメソッドが 1 つだけ必要です。それ以外の場合は、コンパイル時に/mainオプションを追加する必要があります。

于 2011-10-15T11:05:26.370 に答える