C#/。NETでの名前空間のみのクラスの可視性?


88

C#では、別のアセンブリに存在せずに、クラスを独自の名前空間内でのみ表示できますか?これは、他の場所では使用してはならない一般的なヘルパークラスに役立つようです。(つまり、Javaがパッケージプライベートクラスと呼ぶもの)


私はあなたの質問を理解していません。あなたが「内部」を意味していなかったので、私は私の答えを削除しましたか?
Zyphrax 2009

3
@nos:Javaのパッケージレベルの可視性に相当するものを探していますか?
ジョンサンダース

回答:



80

クラスを作成することはできますinternalが、これはアセンブリの外部の誰もがクラスを使用できないようにするだけです。ただし、これを実行する名前空間ごとに個別のアセンブリを作成する必要があります。それがあなたがそれをしたくない理由だ思います。

名前空間の可視性を強化するためのC#コンパイラの取得

ここに、役立つと思われる「偽の名前空間」の形式として部分クラスを使用する方法を示す記事(C#での名前空間の可視性)があります。

著者は、これは完全には機能しないと指摘し、欠点について説明します。主な問題は、C#の設計者がC#をこのように機能しないように設計したことです。これは、.NET Frameworkの最大の利点の1つである、C#/。NETで予想されるコーディング手法から大きく逸脱しています。

それは巧妙なトリックです…今はそれをしないでください。


1
例を見つけました:System.Net.Mime.MediaTypeNames.Application
Bitterblue 2013

この記事では、すべての呼び出しの前に「名前空間」名を付ける必要があると書かれていますが、C#6の「静的を使用する」ではその必要はありません。「名前空間」を静的部分クラスにしてから、クライアントコードに「
usingstatic

@ Pumkko'using static 'ステートメントを使用できるようにするために、クラスは静的である必要はありませんが、名前空間として使用している場合は、とにかくそうする必要があります。
ファジーロジック

21

内部はアセンブリ(厳密に言えばモジュール)のプライバシーです。名前空間の可視性には影響しません。

同じアセンブリ内の他のクラスからクラスのプライバシーを実現する唯一の方法は、クラスを内部クラスにすることです。

この時点で、クラスがプライベートの場合、そのクラスまたは外部クラス自体にないものには表示されません。

保護されている場合は、プライベートのときに表示できるすべてのユーザーに表示されますが、外部クラスのサブクラスにも表示されます。

public class Outer
{
    private class Hidden     { public Hidden() {} }
    protected class Shady    { public Shady() {} }
    public class Promiscuous { public Promiscuous() {} }
}

public class Sub : Outer
{
    public Sub():base() 
    {
        var h = new Hidden();      // illegal, will not compile
        var s = new Shady();       // legal
        var p = new Promiscuous(); // legal
    }
}

public class Outsider 
{
    public Outsider() 
    {
        var h = new Outer.Hidden();      // illegal, will not compile
        var s = new Outer.Shady()        // illegal, will not compile
        var p = new Outer.Promiscuous(); // legal
    }
}

本質的に、あなたが望むことを達成する唯一の方法は、名前空間の形式として外部クラスを使用し、そのクラス内で制限することです。


@ShuggyCoUK:パブリッククラスサブ:アウターは封印する必要がありますパブリッククラスサブ:アウター??? +1しかし...それは私のために働く
IAbstract 2010年

0

単一のアセンブリがある場合は、そのアセンブリに必要な数の名前空間を定義できますが、IDEでどの修飾子を適用しても、他の名前空間のクラスを常に表示できます。


0

それが直接可能かどうかはわかりませんが、それを偽造するためのいくつかの良い方法は次のとおりです。

1)この種のものを必要とするクラスに、内部クラスとしてヘルパークラスを持つ単一のクラスから継承させます。

2)拡張メソッドを使用してから、名前空間内の拡張メソッドのみを参照します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.