我想要一个类的方法:“One
”(“AccessibleWithinSameNamespace
”)可由班级访问:“Two
”,而不是“Two
” “延伸”One
“。
这两个类都在同一个命名空间中,所以我想也许有一个访问修饰符可以模拟“ protected ”修饰符,但是对于命名空间。
一些代码:
namespace Test
{
class One
{
public void AccessibleToAll()
{
}
protected void AccessibleWithinSameNamespace()
{
// I am not public
// I can be accessed from other classes
// within the same namespace of my class
}
}
}
namespace Test
{
class Two
{
public Two()
{
One one = new One();
// I am able to access this method because my class
// is in the same namespace as the class: "One"
one.AccessibleWithinSameNamespace();
}
}
}
答案 0 :(得分:4)
如果两个类都在同一个程序集中,则可以使用internal修饰符。
用你的例子:
namespace Test
{
class One
{
public void AccessibleToAll()
{
}
internal void AccessibleWithinSameNamespace()
{
// I am not public
// I can be accessed from other classes
// within the same namespace of my class
}
}
}
namespace Test
{
class Two
{
public Two()
{
One one = new One();
// I am able to access this method because my class
// is in the same namespace as the class: "One"
one.AccessibleWithinSameNamespace();
}
}
}
答案 1 :(得分:1)
C#和.NET没有“在同一名称空间内”的概念。内部是最接近的等价物。
答案 2 :(得分:1)
问题不在于命名空间的访问修饰符,而是函数的访问修饰符。 “受保护”意味着它可以由子类访问,而不是由其他类访问,即使它们位于同一名称空间中。
您有多种解决方案可供选择...... 1.你可以为函数“internal”创建访问修饰符,然后在同一个程序集中的所有类/函数(或标记有一些很酷的程序集标志,以便它们假装在同一个程序集中)可以访问它 2.使“TWO”成为“一个”的子类,然后两个可以调用它(但不是通过“One”的实例,如同一个代码所示
答案 3 :(得分:1)
由于名称空间是任意的 - 它们实际上不是一个安全边界。任何人都可以创建一个重用命名空间Test的程序集。
您可以做的最好的事情是使用已经提到的内部装配进行限制(如果需要,可以InternalsVisibleTo)。
编辑:InternalsVisibleTo允许其他程序集访问internal方法和类,就像它们在同一个程序集中一样。您可以强烈命名其他程序集,从而提供安全性。这通常用于测试程序集以测试主程序集的内部成员,而不会通过包含测试代码来膨胀主程序集。
请注意,VB.NET编译器不尊重InternalsVisibleTo - 因此VB程序集无法调用InternalsVisibleTo属性程序集。但是,C#可以调用具有适当的InternalsVisibleTo属性的VB.NET程序集。