2016-07-17 5 views
1

私はinternalキーワードを理解しようとしていましたが、いつ使用する必要がありますか。幸い、私は深さのジョンスキートの本C#で読んでいるよう今日、イテレータを実装する方法について第3版は、p.161-162にinternalのための使用があります:6.32Jon Skeetの本の中のこの例で使われているinternalキーワードは何故ですか?

リスト

なぜinternal IterationSampleIterator 6.3

class IterationSampleIterator : IEnumerator 
{ 
    IterationSample parent; 
    int position; 

    internal IterationSampleIterator(IterationSample parent) 
    { 
     this.parent = parent; 
     position = -1; 
    } 

    public bool MoveNxt() 
    { 
     if (position != parent.values.Length) 
     { 
      position++' 
     } 
     return position < parent.values.Length; 
    } 

    public object Current 
    { 
     get 
     { 
      if (position == -1 || 
       position == parent.values.Length) 
      { 
       throw new InvalidOperationException(); 
      } 
      int index = position + parent.startingPoint; 
      index = index % parent.values.Length; 
      return parent.values[index]; 
     } 
    } 

    public void Reset() 
    { 
     position = -1; 
    } 
} 

リスト

using System; 
using System.Collections; 

public class IterationSample : IEnumerable 
{ 
    object[] values; 
    int startingPoint; 

    public IterationSample(object[] values, int startingPoint) 
    { 
     this.values = values; 
     this.startingPoint = startingPoint; 
    } 

    public IEnumerator GetEnumerator() 
    { 
     throw NotImplementedException(); 
    } 
} 

?私が理解するように、internalは通常publicの代わりです。 public IterationSampleIteratorpublicinternalに置き換えて解決できる問題を引き起こす原因を理解するのを助けてください。

+1

私は自分自身に逆の質問をするべきだと思います。 'internal'で十分なら'なぜ 'public'を使うのですか? – JLRishe

答えて

3

投稿コードをさらに深くする前に、MSDN Linkの.Net C#のアクセス修飾子について確認してください。

私たちは、assembly (mostly dll)内でのみアクセスしたいと考えているときは、内部に何かを作っています。 publicと似ているかもしれませんが、使用方法は全く異なります。publicの場合は、どこからでもすべての発信者がアクセスできます。サンプルコードでは、内部の使用は、異なる視点を有する

、これはコンストラクタinternalすることにより、IterationSampleIteratorクラスのオブジェクトを制御することが多いので、このクラスは、それ自身のアセンブリ内の発信者からインスタンス化することができます外部からの他の発信者はそれを行うことはできません。

アセンブリ外のすべてのユーザーについては、CurrentのようなプロパティまたはMoveNextResetなどのメソッドを呼び出すことができます。内部実装ではオブジェクトに直接アクセスできません。

通常、アセンブリ内では、内部的に使用され、ラップされた機能を公開する特定のクラスが存在します。私はSystem.IOがそのようなクラスを公開しているアセンブリの1つであり、アセンブリの境界内で使用できると考えています。

2

それは「publicinternalpublicを交換することによって解決される問題を引き起こす可能性」についてではありません。問題を解決することではありません。あなたのプロジェクトや図書館のデザインについてです。

修飾子をクラス(またはそのメンバー)に使用すると、そのクラス(またはメンバー)は同じアセンブリ内でのみアクセスでき、他のアセンブリからはアクセスできません。

たとえば、DLLライブラリを設計していて、DLLの他のクラスで使用するクラスがありますが、このクラスをDLLのユーザーに公開したくないとします。 publicを使用すると、ユーザーはクラスを表示して使用できます。しかし、internalを使用すると、ユーザーはクラスを表示または使用できなくなりますが、他のすべてのクラスは引き続きそのクラスを使用できます。

+0

しかし、このクラスをDLLのユーザーに公開したくない理由は何ですか? – user6048670

+1

百万の理由があるかもしれません。あなたは、「内部使用のための」*または「役員によって完成される」*のようなタイトルのセクションを持っていたいくつかの政府書式に記入しましたか?あなたがそれらを見ることができないように単にそれらのセクションを隠すことができるが、役員だけができればいいのではないでしょうか?私は彼らがそうするのが大好きだと思う。実際には物理的な論文では可能ではありませんが、ソフトウェアでは 'internal'修飾子を使うことができます。今これはもう意味をなさないでしょうか? –

関連する問題