类成员访问修饰符

时间:2008-10-20 20:47:36

标签: c# .net-3.5

我想要一个类的方法:“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();
        }
    }
}

4 个答案:

答案 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程序集。

相关问题