C#では、別のアセンブリに存在せずに、クラスを独自の名前空間内でのみ表示できますか?これは、他の場所では使用してはならない一般的なヘルパークラスに役立つようです。(つまり、Javaがパッケージプライベートクラスと呼ぶもの)
回答:
私はあなたが望むことが可能だとは思いません。
クラスを作成することはできますinternalが、これはアセンブリの外部の誰もがクラスを使用できないようにするだけです。ただし、これを実行する名前空間ごとに個別のアセンブリを作成する必要があります。それがあなたがそれをしたくない理由だと思います。
名前空間の可視性を強化するためのC#コンパイラの取得
ここに、役立つと思われる「偽の名前空間」の形式として部分クラスを使用する方法を示す記事(C#での名前空間の可視性)があります。
著者は、これは完全には機能しないと指摘し、欠点について説明します。主な問題は、C#の設計者がC#をこのように機能しないように設計したことです。これは、.NET Frameworkの最大の利点の1つである、C#/。NETで予想されるコーディング手法から大きく逸脱しています。
それは巧妙なトリックです…今はそれをしないでください。
System.Net.Mime.MediaTypeNames.Application
内部はアセンブリ(厳密に言えばモジュール)のプライバシーです。名前空間の可視性には影響しません。
同じアセンブリ内の他のクラスからクラスのプライバシーを実現する唯一の方法は、クラスを内部クラスにすることです。
この時点で、クラスがプライベートの場合、そのクラスまたは外部クラス自体にないものには表示されません。
保護されている場合は、プライベートのときに表示できるすべてのユーザーに表示されますが、外部クラスのサブクラスにも表示されます。
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
}
}
本質的に、あなたが望むことを達成する唯一の方法は、名前空間の形式として外部クラスを使用し、そのクラス内で制限することです。
それが直接可能かどうかはわかりませんが、それを偽造するためのいくつかの良い方法は次のとおりです。
1)この種のものを必要とするクラスに、内部クラスとしてヘルパークラスを持つ単一のクラスから継承させます。
2)拡張メソッドを使用してから、名前空間内の拡張メソッドのみを参照します。