【问题标题】:Make class invisible outside of assembly使类在程序集之外不可见
【发布时间】:2013-07-26 06:04:16
【问题描述】:

假设我有狗类:

public class Dog {
    public String Breed { get; set; }
    public String Color { get; set; }
    ...
}

还有一个动物类:

public class Animals {
    public Dog[] Dogs { get; set; }

    public Dog[] GetDogs() {
        ...
        return Dogs;
    }
    ...
}

上面的类在我的类库中,我将它添加为我的项目的引用。一切正常,但我想要的是使用这个库的人不应该能够使用类Dog,我的意思是他应该无法执行Dog dog = new Dog(); 之类的操作。我试图将其设为 internal,但是,我还必须在 Animals 类中编写 internal,如果这样做,我将无法使用 GetDogs() 方法。

有什么建议吗?

【问题讨论】:

    标签: c# class access-modifiers


    【解决方案1】:

    您可以将Dog 类设为public,但将其默认构造函数设为internal

    public class Dog
    {
        internal Dog() {}
    }
    

    在默认构造函数上使用internal 将限制从程序集外部的代码对其进行初始化。

    【讨论】:

      【解决方案2】:

      如果动物是唯一使用 dog 的类,那么您可以将 dog 设置为动物中的嵌套私有类,因此只能在动物中访问。但是你为什么要这样做呢?

      【讨论】:

        【解决方案3】:

        Dog改为

        public class Dog
        {
            internal Dog()
            {
        
            }
            public String Breed { get; set; }
            public String Color { get; set; }
        }
        

        然后

        Dog d = new Dog();
        

        会产生

        “Dog”类型没有定义构造函数。无法访问内部 构造函数'Dog'在这里。

        【讨论】:

          【解决方案4】:

          为 Dog 类创建内部构造函数。 internal Dog(){}。那么只有那个程序集可以创建new Dog(),但是每个人都可以使用Dog类。

          【讨论】:

          • 这很好用,但有可能让用户根本看不到这个类吗?
          • 如果Animal 类具有类型为Dog 的属性,那么人们需要查看Dog 才能使用该属性。但是您可以使用继承并使父类/抽象类/接口对公共可见,而子类 (Dog) 将是内部的。
          【解决方案5】:

          如果您希望归还 Dogs,您必须将其公开。 如果您希望防止在程序集之外创建 Dogs - 将其构造函数设为内部。

          另一种选择是使用接口。

          【讨论】:

            猜你喜欢
            • 2020-11-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多