72

わかりました、これは少しばかげた質問かもしれません。確かに明白な答えがありますが、ここで微妙な点を見逃していないかどうか興味がありました.

クラスで宣言されたメンバーとクラスでpublic宣言されたメンバーの間に可視性/使いやすさの点で違いはありますか?internalinternalinternal

すなわち間

internal class Foo
{
    public void Bar()
    {
    }
}

internal class Foo
{
    internal void Bar()
    {
    }
}

publicメソッドをおよびとして宣言し、virtualである派生クラスでオーバーライドした場合、publicこの修飾子を使用する理由は明らかです。しかし、これは唯一の状況ですか...他に何か不足していますか?

4

5 に答える 5

64

このケースを考えてみましょう:

public interface IBar { void Bar(); }
internal class C : IBar
{
    public void Bar() { }
}

ここで、C.Bar を内部としてマークすることはできません。C.Bar は D.GetBar() の呼び出し元からアクセスできるため、これを行うとエラーになります。

public class D
{
    public static IBar GetBar() { return new C(); } 
}

コメンターがフォローアップの質問をしました: インターフェイス メソッドの明示的な実装はpublicと見なされますか、それともprivateと見なされますか? (C# では、明示的な実装にアクセス修飾子を配置することはできません。)

一歩下がって、メンバーについて正確に「パブリック」または「プライベート」とは何かを考えてみてください。「プライベートとは、メソッドをクラスの外部から呼び出すことができないことを意味する」などの間違ったことを考えている人がいますが、それは真実ではありません。クラスはプライベート メソッドへのデリゲートを作成し、それを誰にでも渡すことができ、プライベート メソッドを呼び出すことができます。

むしろ、アクセシビリティは、物の名前をどこで使用できるかを決定します! 明示的なインターフェイスの実装は、そもそもクラス宣言スペースに名前を追加しません。クラスではなく、インターフェイスを介して名前でのみ参照できます。明示的なインターフェイスの実装を publicまたはprivate と考えるのは、実際には意味がありません。それらには参照できる名前がないからです。

于 2010-04-01T23:23:27.963 に答える
46

publicメンバーは、クラスにいるinternalときだけです。internal

MSDN から:

メンバーのアクセシビリティは、それを含む型のアクセシビリティを超えることはできません。たとえば、内部型で宣言されたパブリック メソッドには、内部アクセシビリティしかありません。

このように考えると、publicプロパティにアクセスします....?見えないクラス?:)

この場合、エリックの答えは非常に重要です。直接ではなくインターフェースを介して公開されている場合違いはありますが、扱っているメンバーとその状況にあるかどうかによって異なります。

于 2010-04-01T23:18:12.690 に答える
2

publicクラスのメンバーは基本クラスのメンバーをinternalオーバーライドできるため、間接的にはもう少し公開されます。publicpublic

于 2010-04-01T23:16:34.177 に答える
2

WPF で XAML から使用すると、これら 2 つに違いがある別の例に直面しました。

XAML:

<Button Tag="{x:Static vm:Foo+Bar.e1}" />

internalenum を含むコードは正常にコンパイルされます。

internal class Foo
{
    internal enum Bar
    {
        e1,
        e2,
    }
}

しかし、驚くべきことにそれを次のように変更するとpublic、エラーが発生します。

internal class Foo
{
    public enum Bar
    {
        e1,
        e2,
    }
}

最後の例では、コンパイル エラーが発生します。

エラー MC3064: マークアップ内で使用できるのはパブリック クラスまたは内部クラスのみです。「バー」タイプはパブリックでも内部でもありません。

public残念ながら、この場合の何が問題なのかを説明することはできません。私の推測では、「WPF がそのように機能するという理由だけで」です。internalエラーを取り除くには、ネストされたクラスの修飾子を変更するだけです。

于 2015-10-08T14:59:55.403 に答える
1

リフレクションに関しては、メンバーが公開されているかどうかが重要です。

たとえば、ネストされたプライベートクラスをWPFバインディングに渡すこともでき、バインディングは通常どおりパブリックプロパティに対して機能します。

于 2012-06-26T15:57:15.057 に答える