如果我声明一个内部类,内部成员的默认访问级别是啥?

Posted

技术标签:

【中文标题】如果我声明一个内部类,内部成员的默认访问级别是啥?【英文标题】:If I declare an internal class, what the default access level of internal members be?如果我声明一个内部类,内部成员的默认访问级别是什么? 【发布时间】:2014-10-02 17:32:59 【问题描述】:

我正在构建一个具有一些基本功能的 DLL。长话短说,我正在制作一些静态类供开发人员使用。这些类使用了一些其他的类来做脏活,我将它们标记为内部的,因为我不希望人们访问它们。

问题是:如果我将一个类声明为内部类,他的成员的访问级别是多少?

我必须将其所有成员标记为内部,否则它们也会自动标记为内部?

这是一个很好的 2 小时,我在 *** 中搜索和搜索,我正在努力寻找一个明确而直接的答案,其中不包括 1000 个猜测、技术上不太可能的假设和无用的装饰......

MSDN 像往常一样令人困惑(从未在 msdn 上找到明确的答案)。

从我在这里看到的http://msdn.microsoft.com/en-us/library/ms173121.aspx 我猜无论你如何设置类访问级别,他的所有成员都将是私有的(方法、变量等)。

帮忙,我不知道

【问题讨论】:

您理解正确:默认情况下它们是私有的。虽然我不明白为什么要大惊小怪,为什么要花两个小时 - 你可以启动 Visual Studio 并在 2 分钟内对其进行测试。 @FarhadJabiyev:- where as members of a struct are public by default. 不,那不是真的,它们默认是私有的 只是我的两分钱:如果您只是想让您的 lib 更具可读性,请减少静态类的使用,并且仅通过实现抽象工厂/单例来提供接口实现。为什么要为语言特定的东西烦恼,比如内部修饰符。 @ovm 我会的,如果我知道这甚至意味着什么。 TheodorosChatzigiannakis 当我大部分时间在 Visual Studio 中测试东西时,我担心意外的结果或不准确的测试,所以我更喜欢圣经参考或专业人士的回答,更不用说测试这将需要构建 2 个单独的项目并尝试将其中的一个链接起来另一个。太麻烦了,google一下比较快。我的恐惧来了,你告诉我一件事,其他人说相反……为什么会发生这种情况??? :( 【参考方案1】:

仅来自MSDN

类成员和结构成员的访问级别,包括 嵌套的类和结构,默认是私有的。


接口默认为内部访问。

希望这张表有所帮助:

Members of    Default member accessibility
----------    ----------------------------
enum          public
class         private
interface     public
struct        private

也可以查看MSDN

【讨论】:

【参考方案2】:

问题是:如果我将一个类声明为内部类,那么访问权限是什么? 他的会员等级会是?

默认为私有。如果还有别的,那就要看情况了。如果它们不是公共的,则访问修饰符将按照 MSDN 中的说明应用(例如,在程序集之外不可见)。

但是,在您发布的链接中,有一个适用于非静态类的问题:

通常,成员的可访问性不大于 包含它的类型的可访问性。然而,一个公共成员 如果可以从程序集外部访问内部类的 该成员实现接口方法或覆盖虚拟方法 在公共基类中定义。


关于上一段,既然静态类不能实现接口,也不能继承其他类,那你就放心了。只要您将静态类声明为内部的,成员就不会在其他程序集中可用(除非您的开发人员使用反射)。

举例说明它如何对非静态类起作用:

组装 1

public interface ISomePublicInterface

    int GetValue();


internal class InternalClass : ISomePublicInterface

    public int GetValue()
    
        return 100;
    


public static class SomeFactory

    public static ISomePublicInterface GetInternalInstanceAsInterface()
    
        return new InternalClass();
    

组装 2

ISomePublicInterface val = SomeFactory.GetInternalInstanceAsInterface();
Console.WriteLine(val.GetValue()); //-->> Calls public method in internal class
Console.WriteLine(val.GetType());

猜猜输出是什么?

Assembly1.InternalClass

所以,现在您可以访问程序集之外的类型,并且可以通过反射调用其他内部方法(这不是获取它的唯一方法)。

【讨论】:

【参考方案3】:

除非另有说明,否则为私有。但是,public 会得到与 internal 相同的结果。

如果您稍后将一个类从内部提升为公共,那么创建公共类对象将变得可见,而内部作用域的方法将保持在内部。

如果您的类范围更新,您可能需要考虑行为。

Another stack overflow question.

【讨论】:

【参考方案4】:

内部类的所有成员都是内部的,可以在同一个程序集中访问,既不在类也不在成员之外。

如果您想访问其他程序集中的类,请将类设为公共,而您不想在程序集外部访问的成员将它们设为内部。

【讨论】:

【参考方案5】:

如果你将任何类声明为“内部”,那么这意味着你可以在同一个程序集中访问这个类。但是你对类成员使用什么样的访问说明符决定它们是可访问的,它们不在同一个程序集中的不同类中。

【讨论】:

以上是关于如果我声明一个内部类,内部成员的默认访问级别是啥?的主要内容,如果未能解决你的问题,请参考以下文章

java类中的成员缺省(默认的)的修饰符是啥??

java内部类

内部类

这个匿名内部类为何不使用final也可以访问外部成员?

Java - 私有内部类的私有成员与默认成员

Java中的静态类