当我们指定了类的访问说明符时,是否有任何约束来指定类成员的访问说明符?

时间:2009-08-24 09:37:51

标签: c# oop

假设我们有一个名为class1的类。

class1有几个属性和方法,我们决定将class1的访问说明符指定为internal。

现在,我们可以将class1方法的访问说明符设置为public吗?

3 个答案:

答案 0 :(得分:7)

对于您的具体问题,声明为内部的第1类可以使用公共方法。

为什么?

查看Jon Skeets explanation

  

你当然可以将课程标记为   内部,但那是不同的   使其公共成员内部化。   例如,假设你有一个班级   它实现了一个公共接口。   即使班级可能是内部的,   一个实例可能仍然“离开了   装配“通过从...返回   另一个(公共)课程的成员。那   必须引用实例   通过它实现的接口   而不是类名本身(作为   上课不为外界所知   程序集)但公共方法可以   仍被称为。

     

如果公共方法不是   我怀疑,实现任何接口   它只会对a产生影响   很少有你的反思案例   可能不关心。

社区维基 - 因为应该归功于Jon Skeet

答案 1 :(得分:1)

通过规则访问说明符的方法和属性不能比包含它的类更容易访问。

但我试过这个:

internal class Test
{
    public string Testing{get;set;}
}

它编译,没有任何异常!我认为没关系因为测试将无法在我们声明的命名空间程序集之外访问,所以公共属性不会有任何区别。

这不起作用:

private class Test
{
    public string Testing{get;set;}
    internal string TestingAgain{get;set;}
}

答案 2 :(得分:1)

是的,您可以为public / internal / etc类型的成员设置private

正如其他回复所指出的那样,外部代码将无法看到属性,除非它能看到类型 - 但有很多细微差别:

  • 如果成员在接口上,它将(基本上)成为公共API的一部分
  • 该成员可能是虚拟/抽象成员的公共覆盖 - 在这种情况下, 将真正公开显示,但是通过基类(再次,类似于接口)

但是框架中有很多其他代码使用 reflection 并要求公共可访问性:

  • 数据绑定通常适用于公共属性
  • 部分信任的安全检查可能对公众成员很挑剔
  • 序列化(例如XmlSerializer)可能需要公共成员

因此,即使您的代码仅由本地程序集引用,仍然有很多理由考虑public而不仅仅是internal