代码之家  ›  专栏  ›  技术社区  ›  odiseh

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

  •  1
  • odiseh  · 技术社区  · 15 年前

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

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

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

    3 回复  |  直到 15 年前
        1
  •  7
  •   JackCorn    15 年前

    对于您的特定问题,声明为内部的类1可以有一个公共方法。

    为什么?

    Jon Skeets explanation :

    你当然可以把一个类标记为 内部的,但那和 使其公共成员内部化。 例如,假设您有一个类 它实现了一个公共接口。 即使这个班可能是内部的, 一个实例可能仍然“脱离 “通过从 另一个(公共)班级的成员。那 必须引用实例 通过它实现的接口 比类名本身(作为 班上的人不为外界所知 但是公共方法可以 仍然被召唤。

    如果公共方法不是 实现任何接口,我怀疑 这只会对 很少有你认为 可能不在乎。

    社区维基-作为荣誉应该归于乔恩斯凯特

        2
  •  1
  •   Marc Gravell    15 年前

    是的,你可以设定 public 关于 internal / private /ETC类型。

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

    • 如果成员位于接口上,则它(本质上)将是公共api的一部分
    • 该成员可能是虚拟/抽象成员的公共重写-在这种情况下 确实是公开可见的,但是通过基类(同样,类似于接口)

    但是框架中还有很多其他代码使用 反射 并要求公众无障碍:

    • 数据绑定通常在公共属性上工作
    • 部分信任的安全检查可能会对公共成员大惊小怪
    • 序列化(例如 XmlSerializer )可能需要公共成员

    所以还有很多理由要考虑 公众的 而不仅仅是 内部的 ,即使您的代码仅由本地程序集引用。

        3
  •  1
  •   TheVillageIdiot    15 年前

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

    但我试过:

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

    它编译 无一例外!我想 没关系 作为班级 测试将无法在 命名空间 装配 我们已经宣布公共财产不会有任何影响。

    这不起作用:

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