我正在重构一些我没写过的代码,它包含我不想公开的业务逻辑和专有算法。所有代码目前都标记为内部;出于测试目的,为了确保我不破坏现有的客户端/服务,我想将它们切换为使用接口,并实现这些接口。
我已经将我的类标记为内部,并将其成员标记为受保护的内部,并将我的接口标记为内部,但是为了使用内部接口,我必须公开我的几个属性。
我相信,并且通过一些有限的测试,似乎已经证明只有朋友程序集和程序集中的类可以使用这些内部接口和类。
只要类和接口都保持内部,即使某些方法和属性被标记为公共,它们是否会被公开?
似乎不是这样,但我正在寻找我可能错过的任何东西。
答案 0 :(得分:2)
公共成员只能像其类型一样可访问(“通常,成员的可访问性不大于包含它的类型的可访问性。但是,内部类的公共成员可以从外部访问如果成员实现接口方法或覆盖在公共基类中定义的虚方法,则为程序集。“)。
不要被protected internal
问题所困扰:protected internal
成员可用于程序集外的派生类。
参考文献:
辅助功能级别:http://msdn.microsoft.com/en-us/library/ba0a1yw2.aspx
答案 1 :(得分:2)
如果你的意思是受保护,因为在使用程序集中不能直接使用它们,那么是的,如果interface
和class
标记为internal
,那么它们将不可见在集会之外。可以将接口和成员的访问级别视为单独的锁定来完成。
如果您可以在其访问级别看到interface
,那么您可以存储对它的引用,然后如果您可以在其访问级别看到属性/方法,那么您可以调用/ set / get它们。
请记住,正如@phoog所指出的那样protected internal
比internal
略宽一些。
所有这些都说,如果你的internal
类实现了一个public
接口,并且这些属性也是public
接口的一部分,那么它们就可以看到......但那真的是越来越模糊......
public interface IVisible
{
string VisibleProperty { get; set; }
}
internal class InvisibleClass : IVisible
{
public string VisibleProperty { get; set; }
}
在上文中,您可以通过其他程序集中的InvisibleClass
引用引用类IVisible
如果您可以找到方法构造或接收对它的引用(例如,如果它是从原始程序集内部的工厂方法返回的)。
除此之外,如果你的问题是你想避免通过反编译器,反思等来检查它们,那就是不同的问题......
答案 2 :(得分:1)
您可以从外部访问内部类,它具有公共基类或实现公共接口。但是你只能访问该类中的公共方法,这些公共方法都在基类(或接口)中并在子类中被覆盖(因此该方法也应该是virtual
或接口的一部分 - 这也使它成为virtual
)。为此,您必须获取超类(或接口)变量引用的类的实例。