公共,私人,受保护和没有什么区别?

我所有的大学生涯中,我一直在使用public ,想知道publicprivateprotected之间的区别吗?

还有什么static做,而不是什么都没有?

访问修饰符

上市

types或成员可以通过相同程序集或引用它的其他程序集中的任何其他代码进行访问。

私人的

types或成员只能由同一个类或结构中的代码访问。

保护

types或成员只能由同一个类或结构中的代码或派生类中的代码访问。

内部

types或成员可以由同一个程序集中的任何代码访问,但不能从另一个程序集访问。

内部保护

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

如果设置访问修饰符,则使用默认的访问修饰符。 所以总是有一些访问修饰符的forms,即使它没有设置。

静态的

一个类的静态修饰符意味着这个类不能被实例化,并且它的所有成员都是静态的。 静态成员有一个版本,无论其封闭types创build了多less个实例。

静态类与非静态类基本相同,但有一点不同:静态类不能在外部实例化。 换句话说,您不能使用new关键字来创build类types的variables。 由于没有实例variables,因此可以使用类名称本身访问静态类的成员。

但是,有一个这样的事情, 静态构造函数 。 任何类都可以有其中之一,包括静态类。 它们不能直接调用,也不能有参数(除了类本身的任何types参数外)。 在创build第一个实例或引用任何静态成员之前,会自动调用一个静态构造函数来初始化该类。 看起来像这样:

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

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

 MyStaticClass.ServiceMethod(...); 

公开 – 如果您可以看到课程,那么您可以看到该方法

私人 – 如果你是class级的一部分 ,那么你可以看到的方法,否则不能。

受保护 – 与私人相同,所有后代也可以看到该方法。

静态(类) – 记得“类”和“对象”之间的区别? 忘了这一切。 它们与“静态”一样…这个类是它自己的唯一实例。

静态(方法) – 每当你使用这个方法时,它将有一个独立于它所属类的实际实例的引用框架。

一个graphics化的概述(总而言之)

能见度

如果您在前面没有访问修饰符,请参阅这里:
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 

关于Nothing的问题

  • 命名空间types默认是内部的
  • 任何types的成员,包括嵌套types默认都是私有的

在这里输入图像描述

 using System; namespace ClassLibrary1 { public class SameAssemblyBaseClass { public string publicVariable = "public"; protected string protectedVariable = "protected"; protected internal string protected_InternalVariable = "protected internal"; internal string internalVariable = "internal"; private string privateVariable = "private"; public void test() { // OK Console.WriteLine(privateVariable); // OK Console.WriteLine(publicVariable); // OK Console.WriteLine(protectedVariable); // OK Console.WriteLine(internalVariable); // OK Console.WriteLine(protected_InternalVariable); } } public class SameAssemblyDerivedClass : SameAssemblyBaseClass { public void test() { SameAssemblyDerivedClass p = new SameAssemblyDerivedClass(); // NOT OK // Console.WriteLine(privateVariable); // OK Console.WriteLine(p.publicVariable); // OK Console.WriteLine(p.protectedVariable); // OK Console.WriteLine(p.internalVariable); // OK Console.WriteLine(p.protected_InternalVariable); } } public class SameAssemblyDifferentClass { public SameAssemblyDifferentClass() { SameAssemblyBaseClass p = new SameAssemblyBaseClass(); // OK Console.WriteLine(p.publicVariable); // OK Console.WriteLine(p.internalVariable); // NOT OK // Console.WriteLine(privateVariable); // Error : 'ClassLibrary1.SameAssemblyBaseClass.protectedVariable' is inaccessible due to its protection level //Console.WriteLine(p.protectedVariable); // OK Console.WriteLine(p.protected_InternalVariable); } } } 

  using System; using ClassLibrary1; namespace ConsoleApplication4 { class DifferentAssemblyClass { public DifferentAssemblyClass() { SameAssemblyBaseClass p = new SameAssemblyBaseClass(); // NOT OK // Console.WriteLine(p.privateVariable); // NOT OK // Console.WriteLine(p.internalVariable); // OK Console.WriteLine(p.publicVariable); // Error : 'ClassLibrary1.SameAssemblyBaseClass.protectedVariable' is inaccessible due to its protection level // Console.WriteLine(p.protectedVariable); // Error : 'ClassLibrary1.SameAssemblyBaseClass.protected_InternalVariable' is inaccessible due to its protection level // Console.WriteLine(p.protected_InternalVariable); } } class DifferentAssemblyDerivedClass : SameAssemblyBaseClass { static void Main(string[] args) { DifferentAssemblyDerivedClass p = new DifferentAssemblyDerivedClass(); // NOT OK // Console.WriteLine(p.privateVariable); // NOT OK //Console.WriteLine(p.internalVariable); // OK Console.WriteLine(p.publicVariable); // OK Console.WriteLine(p.protectedVariable); // OK Console.WriteLine(p.protected_InternalVariable); SameAssemblyDerivedClass dd = new SameAssemblyDerivedClass(); dd.test(); } } } 

嗯。

看到这里: 访问修饰符 。

简而言之:

公共给出的方法或types从其他types/类完全可见性。

Private只允许私有方法/variables访问私有方法/variables的types(注意,嵌套类也可以访问包含私有方法/variables的类)。

受保护类似于私有,除了派生类也可以访问受保护的方法。

“没有”是VB.NET等于null。 虽然如果你指的是“没有”意味着“无访问修饰符”,那么它取决于,虽然一个非常粗略的经验法则(当然在C#中)是,如果你没有明确指定访问修饰符,方法/variables声明通常受到限制 。 即

 public class MyClass { string s = ""; } 

实际上是一样的:

 public class MyClass { private string s = ""; } 

当没有显式指定访问修饰符时,链接的MSDN文章将提供完整描述。

公开 – 任何人都可以访问。
私人 – 只能在课堂上进行访问。
保护 – 只能在类中或从类inheritance的任何对象中访问。

没有什么是像null,但在VB中。
静态意味着你有一个对象的实例,该类的每个实例的方法。

嗯…

静态意味着您可以访问该function,而无需具有该类的实例。

您可以直接从类定义中访问。

“私有”状态表示variables只能由同一类的对象访问。 受保护的状态将该访问扩展为包括该类的后代。

“从上面的表格中我们可以看出私人和受保护之间的尊重……我认为两者都是一样的……那么这两个单独的命令需要什么”

查看MSDN链接了解更多信息

这些访问修饰符指定您的成员可见的位置。 你应该读这个。 以IainMH给出的链接为出发点。

静态成员是每个类一个,而不是每个实例一个。

仔细观察你的课程的可访问性。 公共和受保护的类和方法默认情况下可供所有人访问。

此外,Microsoft在创buildVisual Studio中的新类时显示访问修饰符(公共,保护等关键字)并不是非常明确。 所以,要小心,考虑一下你的class级的可访问性,因为这是你的实施内部的大门。

我认为这与良好的面向对象devise有关。 如果您是图书馆的开发人员,则希望隐藏图书馆的内部工作。 这样,以后可以修改库的内部工作。 所以你把你的成员和辅助方法作为私有的,只有接口方法是公共的。 应该被覆盖的方法应该被保护。