C#将类实例的创建限制在命名空间内

jb.*_*jb. 8 c# class-design access-modifiers

我有两个对象,RoomManager并且Room会有几个Room和一个RoomManager.我希望它RoomManager是唯一一个允许创建Room对象的人.所以我想知道是否有一种方法可以使Room构造函数(以及其余的Room方法/属性)只能访问RoomManager.我在考虑将它们移动到自己的命名空间并制作Room私有或内部或其他东西.从可访问性级别(C#参考)我看到内部是针对整个程序集,而不仅仅是命名空间.

Jon*_*eet 9

不,C#(和一般的.NET)没有特定于命名空间的访问修饰符.

一个相当黑客的解决方案是让Room只有一个私有构造函数,并使RoomManager成为一个嵌套类(可能只是名为Manager):

public class Room
{
    private Room() {}

    public class Manager
    {
        public Room CreateRoom()
        {
            return new Room(); // And do other stuff, presumably
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

像这样使用它:

Room.Manager manager = new Room.Manager();
Room room = manager.CreateRoom();
Run Code Online (Sandbox Code Playgroud)

正如我所说的那样,虽然有点hacky.当然,您可以将Room和RoomManager放在自己的程序集中.