C#のSingletonは、同じ名前空間にない場合は「アクセスできません」?
-
22-10-2019 - |
質問
シングルトンクラスを次の方法で実装しようとしました(VS2008 SP1を使用しています)。
namespace firstNamespace
{
class SingletonClass
{
private SingletonClass() {}
public static readonly SingletonClass Instance = new SingletonClass();
}
}
別の名前空間のクラスからアクセスしたい場合(これは問題であり、同じ名前空間で動作するようです)。
namespace secondNamespace
{
...
firstNamespace.SingletonClass inst = firstNamespace.SingletonClass.Instance;
...
}
コンパイラエラーが発生します:
error CS0122: 'firstNamespace.SingletonClass' is inaccessible due to its protection level
誰かがこれを解決する方法を考えていますか?
よろしくお願いします!
解決
キーワードがありません public
クラスの定義から。
他のヒント
シングルトンが別のアセンブリにあるように聞こえます。クラスのデフォルトの修飾子は内部であるため、アセンブリでのみアクセスできます。
SingletonClassには内部可視性があるため、2つの名前空間が異なるアセンブリにある場合、クラス全体がアクセスできません。
変化する
class SingletonClass
に
public class SingletonClass
変化する
class SingletonClass
に
public class SingletonClass
公開するために、したがってアクセス可能です
またはさらに良い:
public sealed class SingletonClass
メンバーは静的であるため:
あなたのクラス SingletonClass
他の名前空間に表示されます。しかし、それは他のアセンブリ/プロジェクトでは見えません。
あなたのクラスはプライベートです。これは、現在のプロジェクトのすべてのコード(= Assembly = .DLL)がこのクラスを見ることができることを意味します。ただし、クラスは他のプロジェクトのコード用に隠されています。
名前空間とアセンブリの間には弱い相関関係があります。 Mscorlib.dllとSystem.dllなど、複数のアセンブリに1つの名前空間が存在できます。どちらもシステムネームスペースが含まれています。
ただし、通常、Visual Studioで新しいプロジェクトを作成すると、新しい名前空間が表示されます。
1つのアセンブリに複数の名前空間を追加することもできます。これは、新しいフォルダーを作成するときにVisual Studioで自動的に発生します。
あなたはsingletonclassです クラス 公開されていないので、外には見えません 名前空間 組み立て.
修正: :コメントは正しい、と言うように MSDN:
他のクラスまたは構造体内にネストされていないクラスと構造体は、公開または内部のいずれかです。一般に宣言されたタイプは、他のタイプでアクセスできます。 内部として宣言されたタイプは、同じアセンブリ内のタイプでのみアクセス可能です. 。前の例のように、クラスと構造体は、キーワードパブリックがクラス定義に追加されない限り、デフォルトで内部として宣言されます。クラスまたは構造体の定義は、内部キーワードを追加して、アクセスレベルを明示的にすることができます。アクセス修飾子は、クラスまたは構造体自体に影響しません。常に、それ自体とすべてのメンバーにアクセスできます。