【问题标题】:Internal Interfaces & Classes内部接口和类
【发布时间】:2011-11-15 19:06:35
【问题描述】:

我正在重构一些不是我编写的代码,其中包含我不想公开的业务逻辑和专有算法。当前所有代码都标记为内部代码;出于测试目的,并确保我不会破坏现有的客户端/服务,我想将它们切换为使用接口,并实现这些接口。

我已将我的类标记为内部,将它们的成员标记为受保护的内部,并将我的接口标记为内部,但要使用内部接口,我必须公开我的几个属性。

我相信,通过一些有限的测试,似乎已经证明只有朋友程序集和我的程序集中的类可以使用这些内部接口和类。

只要类和接口都保持在内部,即使某些方法和属性被标记为public,它们是否会被公开?

似乎不是这样,但我正在寻找我可能错过的任何东西。

【问题讨论】:

  • 除非您在部分信任的情况下工作,否则可访问性只是很好地要求不要使用某些东西。它绝不会保护专有代码[除了给混淆器更多的回旋余地]。
  • 类不能被保护,除非它们是嵌套的。
  • 已更正,表示类为内部的,其成员为受保护的内部
  • @Brian:如果类是internal,那么可以说,这些属性将是“受保护的”。就好像它们是 internal 类上的 public 属性一样。由于该类是不可见的,因此属性也是如此(当然,前提是该类不能通过更公共的接口了解......)

标签: c# .net visual-studio-2010 .net-4.0 interface


【解决方案1】:

如果您的意思是在 using 程序集中受保护不能直接使用它们,那么是的,如果 interfaceclass 被标记为 internal,那么它们在程序集之外将不可见。将接口和成员上的访问级别视为要通过的单独锁。

如果您可以在其访问级别看到interface,那么您可以存储对它的引用,然后如果您可以在其访问级别看到属性/方法,那么您可以调用/设置/获取它们。

但请记住,正如 @phoog 指出的那样,protected internalinternal 更宽松一些。

说了这么多,如果你的internal 类实现了public 接口,并且这些属性也是public 接口的一部分,它们可能是可见的......但这真的变得模糊......

public interface IVisible
{
    string VisibleProperty { get; set; }
}

internal class InvisibleClass : IVisible
{
    public string VisibleProperty { get; set; }
}

在上面,您可以通过在不同程序集中的 IVisible 引用引用类 InvisibleClass如果您可以找到构造或接收的方法对它的引用(例如,如果它是从原始程序集中的工厂方法返回的)。

除此之外,如果您的问题是您希望避免通过反编译器、反射等检查它们,那是一个不同的问题...

【讨论】:

  • “但这真的变得晦涩难懂......” -- 实际上,如果您花一些时间使用 ILDASM 或类似工具检查 BCL,您会发现这种方法非常常见。
【解决方案2】:

公共成员只能与其类型一样可访问(“通常,成员的可访问性不大于包含它的类型的可访问性。但是,内部类的公共成员可能可以从外部访问如果该成员实现了接口方法或覆盖了在公共基类中定义的虚拟方法,则程序集。")。

不过,不要被protected internal 问题所困扰:protected internal 成员可用于程序集外的派生类。

参考资料:

辅助功能级别:http://msdn.microsoft.com/en-us/library/ba0a1yw2.aspx

访问修饰符:http://msdn.microsoft.com/en-us/library/ms173121.aspx

【讨论】:

  • 如果所有类和接口都是internal,我想不出一种让它们在程序集之外访问的方法。但是为什么不使用protected internal,而不是使用internal(使它们仅在您的程序集中可用)或protected(使它们仅对派生类可用)? protected internal 提供什么价值?
【解决方案3】:

你是对的。由于您无法从外部访问内部类(除了友元程序集),因此您也无法访问其任何方法,即使它们是公开的。

可以从外部访问具有公共基类或实现公共接口的内部类。但是您只能访问该类中既在基类(或接口)中又在子类中被覆盖的公共方法(因此该方法也应该是virtual 或接口的一部分 - 这也使它成为@987654322 @)。为此,您必须获取由超类(或接口)变量引用的类的实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多