【问题标题】:How do I scope a class only to be used inside the Class Library project?如何确定仅在类库项目中使用的类?
【发布时间】:2012-08-17 18:46:41
【问题描述】:

我有一个包含一些公共类和许多内部实用程序类的类库。链接到 DLL 的人不应看到/使用这些实用程序。

namespace MyProject {
    public class PublicClass { }
}
namespace MyProject {
    internal class UtilClass { }
}

当我这样做时,VS 会触发诸如“UtilClass 比 PublicClass.Member 更难访问”之类的错误

我做错了吗?我应该怎么做?我见过我不能使用的带有私有类的库。我如何得到这种行为?

谢谢。

【问题讨论】:

  • 听起来你在PublicClass 中有一个UtilClass 类型的protectedpublic 成员。将该成员的可见性降低到internal
  • 您的代码应该可以编译。
  • 此代码没有说明问题,请发布其余部分。但是,CodesInChaos 的建议很可能是原因。
  • 仅供参考,如果您能够发布所有代码,将来人们会更容易回答您的问题。我这么说是因为正如@CodesInChaos 所说,您发布的代码可以编译。这有意义吗?

标签: c# oop class scope visibility


【解决方案1】:

这意味着您的PublicClass 中有一个UtilClass 类型的public 成员。编译器不允许这样做,因为外部程序集能够访问公共成员,但成员本身的类型是内部的,因此不是不可访问的。

将该成员设为内部而不是公开。

【讨论】:

    【解决方案2】:

    您的错误很常见。例如,如果您有两个类:

    public class PublicClass { ... }
    

    private class PrivateClass { ... }
    

    这不会返回错误。但是,如果您将 PublicClass 添加一个属性,例如

    public PrivateClass MyProperty { ... } 
    

    你会得到一个错误。因为该属性对于您的库的用户是可见的,但该属性的类型是不可见的。

    【讨论】:

      【解决方案3】:

      我怀疑你没有向我们展示你提供的完整代码应该可以工作。

      您必须有一个公共方法或属性来返回您的内部类 E.G. 的实例

      namespace MyProject 
      {
          public class PublicClass 
          {
              public UtilClass DoSomething() {} 
              public UtilClass { get; }
              // External assemblies cannot see the UtilClass  type which is
              // why this does not work.
          }
      }
      

      这显然不能完成,因为外部程序集需要知道它。

      如果您确实需要一个公开行为而不公开您的内部类型的公共属性,那么请考虑拥有一个您的实用程序类可以实现的接口。

      这将允许您将帮助程序类保留在内部,但仍将其(通过接口)公开给外部程序集。

      internal class UtilClass : IMyPublicInterface 
      { 
      }
      
      namespace MyProject 
      {
          public class PublicClass 
          {
              public IMyPublicInterface DoSomething() {} 
              public IMyPublicInterface { get; }
              // External assemblies now only need to know about the public interface.
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2011-12-22
        • 2021-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多