协慌网

登录 贡献 社区

在 C#中,公共,私有,受保护和没有访问修饰符之间有什么区别?

在我上大学的全部时间里,我一直在使用public ,是否想知道publicprivateprotected之间的区别?

相对于什么都不做, static

答案

访问修饰符

来自docs.microsoft.com

public

该类型或成员可以由同一程序集或引用它的另一个程序集中的任何其他代码访问。

private

类型或成员只能由相同类或结构中的代码访问。

protected

类型或成员只能由相同类或结构或派生类中的代码访问。

private protected (在 C#7.2 中添加)

该类型或成员只能由相同类或结构中的代码访问,或者只能由同一程序集中的派生类访问,而不能从另一个程序集中访问。

internal

可以通过同一程序集中的任何代码访问类型或成员,但不能从另一个程序集中访问该类型或成员。

protected internal

可以通过同一程序集中的任何代码或另一个程序集中的任何派生类访问类型或成员。

如果设置访问修饰符,则使用默认访问修饰符。因此,即使未设置访问修饰符,总会有某种形式。

static修饰符

类上的 static 修饰符意味着该类无法实例化,并且其所有成员都是静态的。静态成员具有一个版本,无论创建多少个其封闭类型的实例。

静态类与非静态类基本相同,但是有一个区别:静态类不能在外部实例化。换句话说,您不能使用 new 关键字来创建类类型的变量。因为没有实例变量,所以您可以使用类名本身来访问静态类的成员。

但是,有一个诸如静态构造函数之类的东西。任何类都可以具有其中之一,包括静态类。它们不能直接调用,也不能具有参数(类本身上的任何类型参数除外)。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。看起来像这样:

static class Foo()
{
    static Foo()
    {
        Bar = "fubar";
    }
    
    public static string Bar { get; set; }
}

静态类通常用作服务,您可以像这样使用它们:

MyStaticClass.ServiceMethod(...);

图形概述(概述)

能见度

由于静态类是密封的,因此无法继承它们(从 Object 除外),因此关键字 protected 在静态类上无效。



对于默认设置(如果您没有在前面放置任何访问修饰符),请参见此处:
C#类和成员(字段,方法等)的默认可见性?

非嵌套

enum                              public
non-nested classes / structs      internal
interfaces                        internal
delegates in namespace            internal
class/struct member(s)            private
delegates nested in class/struct  private

嵌套:

nested enum      public
nested interface public
nested class     private
nested struct    private

此外,还有密封关键字,这使类不可继承。
另外,在 VB.NET 中,关键字有时会有所不同,因此这里是一个备忘单:

VB与CS等效

公共- 如果您可以看到该类,那么您可以看到该方法

私有- 如果您是该类的一部分,则可以看到该方法,否则就看不到。

受保护- 与私有相同,所有子孙也可以看到该方法。

静态(类) - 还记得 “类” 和 “对象” 之间的区别吗?算了吧它们与 “静态” 相同... 类是自身的唯一实例。

静态(方法) - 每当使用此方法时,它都会具有一个独立于其所属类的实际实例的参考框架。