C#中的默认访问修饰符是什么?

时间:2010-03-26 06:28:09

标签: c# access-modifiers

类,方法,成员,构造函数,委托和接口的默认访问修饰符是什么?

9 个答案:

答案 0 :(得分:422)

C#中所有内容的默认访问权限是“您可以为该成员声明的最受限制的访问权限”

例如:

namespace MyCompany
{
    class Outer
    {
        void Foo() {}
        class Inner {}
    }
}

相当于

namespace MyCompany
{
    internal class Outer
    {
        private void Foo() {}
        private class Inner {}
    }
}

这种情况的一种例外是使属性(通常是setter)的一部分比属性本身的声明可访问性更受限制:

public string Name
{
    get { ... }
    private set { ... } // This isn't the default, have to do it explicitly
}

这就是C#3.0规范所说的内容(第3.5.1节):

  

取决于其中的上下文   成员声明仅发生   某些类型的申报   允许访问。   此外,当一个成员声明   不包含任何访问修饰符,   声明的背景   发生确定默认值   声明可访问性。

     
      
  • 命名空间隐式具有公共声明的可访问性。无法访问   命名空间上允许使用修饰符   声明。
  •   
  • 在编译单元或命名空间中声明的类型可以具有public或   内部声明的可访问性和   默认为内部声明   可访问性。
  •   
  • 类成员可以具有五种声明的可访问性中的任何一种   并默认为私有声明   可访问性。 (注意一种类型   声明为类的成员即可   有五种声明中的任何一种   可访问性,而声明的类型   作为命名空间的成员可以拥有   仅公开或内部声明   可访问性。)
  •   
  • Struct成员可以声明public,internal或private   可访问性和默认为私有   声明可访问性因为结构   是隐含的密封。结构成员   在结构中引入(即不是   由该结构继承)不能有   保护或保护内部   声明可访问性。 (注意一个   声明为结构成员的类型   可以有公共,内部或私人   声明可访问性,而类型   声明为命名空间的成员   可以只有公共或内部   声明可访问性。)
  •   
  • 接口成员隐式具有公共声明的可访问性。没有   允许访问修饰符   接口成员声明。
  •   
  • 枚举成员隐式具有公开声明的可访问性。没有   允许访问修饰符   枚举成员声明。
  •   

(请注意,嵌套类型将属于“类成员”或“结构成员”部分 - 因此默认为私有可见性。)

答案 1 :(得分:135)

top level class: internal
method: private
members (unless an interface or enum): private (including nested classes)
members (of interface or enum): public
constructor: private (note that if no constructor is explicitly defined, a public default constructor will be automatically defined)
delegate: internal
interface: internal
explicitly implemented interface member: public!

答案 2 :(得分:114)

简答:最低限度的访问权限(参见Jon Skeet的回答)。

答案很长:

非嵌套类型,枚举和委托可访问性可能只有内部或公共可访问性

                     | Default   | Permitted declared accessibilities
------------------------------------------------------------------
namespace            | public    | none (always implicitly public)

enum                 | public    | none (always implicitly public)

interface            | internal  | public, internal

class                | internal  | public, internal

struct               | internal  | public, internal

delegate             | internal  | public, internal

嵌套类型和成员可访问性

                     | Default   | Permitted declared accessibilities
------------------------------------------------------------------
namespace            | public    | none (always implicitly public)

enum                 | public    | none (always implicitly public)

interface            | public    | none

class                | private   | All¹

struct               | private   | public, internal, private²

delegate             | private   | All¹

constructor          | private   | All¹

interface member     | public    | none (always implicitly public)

method               | private   | All¹

field                | private   | All¹

user-defined operator| none      | public (must be declared public)
     

¹所有=== public,protected,internal,private,protected internal

     

2结构不能从结构或类继承(尽管它们可以,接口),因此受保护不是有效的修饰符

嵌套类型的可访问性取决于其可访问性域,该域由成员的已声明可访问性和直接包含类型的可访问性域确定。但是,嵌套类型的可访问性域不能超过包含类型的可访问性域。

注意:CIL还提供 protected和internal (与现有受保护的“或”内部“相对),但据我所知,目前无法在C#中使用。


请参阅:

http://msdn.microsoft.com/en-us/library/ba0a1yw2.aspx
http://msdn.microsoft.com/en-us/library/ms173121.aspx
http://msdn.microsoft.com/en-us/library/cx03xt0t.aspx
(我爱微软URI的人......)

答案 3 :(得分:11)

查看Access Modifiers (C# Programming Guide)

  

类和结构可访问性
  如果没有访问权限,则内部是默认值   修饰符已指定。

     

班级和结构会员辅助功能
  班级成员   (包括嵌套类和结构)   可以用五个中的任何一个来宣布   访问类型。结构成员不能   被宣布为受保护因为   结构不支持继承。

     

会员的可访问性可以   永远不会超过   其包含类型的可访问性

     

用户定义的运算符必须始终如一   宣布为公开。更多   信息,见运营商(C#   参考)。

     

析构函数不具备可访问性   改性剂。

     

其他类型
  直接使用命名空间声明的接口可以是   宣称为公共或内部和   喜欢类和结构,接口   默认为内部访问。

     

枚举成员永远是公开的,   并且没有访问修饰符可以   应用

     

默认情况下,委托具有内部   访问。

答案 4 :(得分:3)

我想添加一些文档链接。详细了解here

enter image description here

答案 5 :(得分:2)

最简单的答案如下:....

默认情况下,C#中的所有成员始终使用最小可访问修饰符。

这就是为什么程序集中的所有顶级类默认情况下都是“内部”的原因,这意味着它们对所在的程序集是公共的,但对于外部程序集则是私有的或被排除在外。顶级课程的唯一其他选择是公开,这更易于访问。对于嵌套类型,除少数罕见例外(如枚举的成员和只能公开的接口)外,它都是私有的。一些例子。对于顶级类和接口,默认值为:

动物类内部动物类

相同

界面动物公共界面动物

相同

对于嵌套的类和接口(内部类型),默认值为:

动物类动物类

相同

界面动物私有界面动物

相同

如果仅假定默认值始终是最私有的,则无需使用访问器,直到需要更改默认值。容易。

答案 6 :(得分:1)

内部是默认修饰符

答案 7 :(得分:1)

默认情况下,类为内部

  • 班级成员默认为私有

默认情况下,接口为内部

    默认情况下,
  • 接口成员是公开。 (接口不允许 我们指定对其成员的任何类型的可访问性。)

    注意: :如果您尝试为接口成员指定任何访问说明符,则会显示编译错误。

结构默认为内部

  • 结构成员默认为私有

答案 8 :(得分:0)

命名空间级别:internal

类型级别:private