2012-03-10 16 views
12

可能性の重複:以下に述べるよう
What is the difference between 'protected' and 'protected internal'?
What is the difference between Public, Private, Protected, and Nothing?混乱:内部、保護および保護された内部

コードは次のとおりです。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace testanotherlib 
{ 
    public class A 
    { 
     internal void InternalDisplay() 
     { 
      Console.WriteLine("Internal Display Method."); 
     } 

     protected void ProtectedDisplay() 
     { 
      Console.WriteLine("Protected Display Method."); 
     } 

     protected internal void ProtectedInternalDisplay() 
     { 
      Console.WriteLine("ProtectedInternal Display Method."); 
     } 

     public void PublicDisplay() 
     { 
      Console.WriteLine("Public Display Method."); 
     } 
    } 
} 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace testanotherlib 
{ 
    public class B : A 
    { 
    } 
} 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using testanotherlib; 
namespace testlib 
{ 
    public class C:A 
    { 
    } 
} 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using testlib; 
using testanotherlib; 

namespace testapp 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      B objB = new B(); 
      C objC = new C(); 
     } 
    } 
} 

私は理解しようとしていますInの差保護され、保護された内部。そのために、上記のコードを使用した例を作成しました。

クラスライブラリプロジェクトtestanotherlibに私はクラスA &クラスBを持っています。クラスライブラリプロジェクトtestlibに私はクラスCを持っています。プログラムクラスは別のコンソールアプリケーションにあります。プログラムクラスのメインメソッドの中で私はクラスB(objB)とクラスC(objC)のオブジェクトを作成しました。 objBおよびobjCでは、クラスAのパブリックメソッドにのみアクセスできます。私はクラスBのすべてのメソッドにアクセス可能になると期待されていた。親切に私がこれを理解するのを手伝ってください。プロジェクトに関する他の情報が必要な場合は、私に相談してください。

よろしく、 Priyank

+0

?あなたのコードはメンバーを使用することは決してありません。そのため、話しが難しくなります。 –

+0

@JonSkeet:クラスobjBを持つクラスAならすべてのメソッドにアクセスできることを期待していました。 –

+1

@PriyankThakkar: 'testApp'から? *なぜ*あなたはそれを期待していましたか? 'testApp'のコードは' A'と同じアセンブリにはないので、内部のメンバは見えません。 –

答えて

12

次の5つのアクセスレベルは、アクセス修飾子を使用して指定することができます。

公共:アクセスが制限されません。

protected:アクセスは、含まれるクラスから派生した1つ以上の型に限定されます。

内部:アクセスは現在のアセンブリに限定されています。

protected internal:アクセスは、現在のアセンブリまたは包含クラスから派生した型に限定されます。

プライベート:アクセスは含むタイプに制限されています。あなたはクラスAを参照して、クラスAのすべてのメソッドにアクセスできるように期待していた

Taken directly from Microsoft's MSDN library.

+0

'または'のために 'protected internal'の定義が不正確に見えます。あなたはそれが 'と'ではないと確信していますか? – ciuncan

+5

あなたは正しいかもしれません。 Microsoftにすぐにお知らせください! –

+0

ああ、私はリンクに気付かず、検索するのが怠惰でした。ごめんなさい。それでもやはり論理的なようです。 – ciuncan

5

internal

現在、フレンドリーなアセンブリでのみ見えます。

protected

Aを継承したクラス内でのみ見えます。 Aを継承するクラス内の可視

protected internal

。また、現在のフレンドリーなアセンブリ内にも表示されます。

+0

ちょっとサイモン..助けてくれてありがとう:) –

+0

保護内部は保護されたOR内部を意味する;あなたは保護された内部としてそれを記述しました。 – Tuan

4

protectedメソッドとメンバには、proctedメソッドを宣言するクラスから派生した別のクラスからのみアクセスできます。

class A 
{ 
    protected void Method() {} 
} 

class B : A 
{ 
    public void Foo() 
    { 
     Method(); // works! 
    } 
} 

class C 
{ 
    public void Foo() 
    { 
     Method(); // won't work, obviously 

     var tmp = new A(); 
     tmp.Method(); // won't work either because its protected 
    } 
} 

internal同じアセンブリのメソッドのみ表示させます。同じアセンブリ内のクラスの場合、メソッドは公開されているように使用できます。あなたの現在のassebmlyの外のクラスのためのプライベートのような。

protectedとinternalを組み合わせると、そのアセンブリ内のすべてのクラスに対して同じアセンブリでメソッドを使用できるようになります。また、保護されているため、どのアセンブリに関係なく、すべての派生クラスでこのメソッドを使用できるようになります。

+0

あなたは内部の間違って保護されている、私の答えやクリスを参照してくださいその問題です。 – Terkel

+0

@SimonBangTerkildsenああ、あなたは正しい。私は私の答えを訂正した。それを知らなかった。まあ、自分で使ったことはありません。したがって、内部的には保護されたキーワードを覆い隠します。そして、導出されると内部は無視されます。それを知らなかったし、実際にそれが好きではなかった:)しかし、これには正当な理由が必要です。 – dowhilefor

+0

@dowhilefor:素晴らしい例でそれを説明してくれてありがとう:) :) –

関連する問題