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

时间:2014-08-09 09:15:15

标签: c# member internal access-modifiers

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

问题是:如果我将一个类声明为内部类,那么其成员的访问级别是什么?

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

这是一个很好的2个小时我在谷歌搜索和搜索stackoverflow,我很难找到一个明确和直接的答案,其中不包括1000个推测,技术不那么可能的hypotesis和无用的装饰... < / p>

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

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

帮助,我不知道

5 个答案:

答案 0 :(得分:8)

  

问题是:如果我将一个类声明为内部,那么访问权限   他的成员水平会是多少?

默认为私人。如果有的话,那取决于。如果它们不是公共的,那么访问修饰符适用于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

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

答案 1 :(得分:3)

仅限MSDN

  

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


  

接口默认为内部访问。

希望这张表有所帮助:

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

同时检查此MSDN

答案 2 :(得分:2)

私人除非另有说明。但是,公众将获得与内部相同的结果。

如果稍后将类从内部推广到公共,那么创建公共类对象将变得可见,而内部范围的方法将保持内部。

如果您的班级范围得到更新,您可能需要考虑行为。

Another stack overflow question.

答案 3 :(得分:1)

如果你宣布任何课程为&#34;内部&#34;那意味着你可以在同一个程序集中访问这个类。但是,对于类成员使用什么类型的访问说明符决定它们是否可访问不在同一程序集中的不同类中。

答案 4 :(得分:0)

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

如果您想访问其他程序集中的类,请将该类设为public,并且不希望在程序集外部访问该成员,使其成为内部类。