在C#中,public,private,protected和没有访问修饰符之间有什么区别?
在C#中,public,private,protected和没有访问修饰符之间有什么区别?
在我上大学的所有年份里,我一直在使用public
,想知道public
、private
和protected
之间的区别?
另外,相对于没有任何内容,static
的作用是什么?
一个图形概述(简要总结)
实际上,情况比这复杂一些。
现在(自 C# 7.2 开始),还有私有受保护(private protected),并且派生类是否在相同的程序集中很重要。
因此,概述需要扩展:
还可以参见有关主题的 C# .NET 文档。
由于静态类是密封的,它们不能被继承(除了 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
此外,还有一个 sealed 关键字,使一个类不能被继承。
另外,在 VB.NET 中,关键字有时是不同的,因此这里有一个速查表:
访问修饰符
类型或成员可以被同一程序集或引用它的另一个程序集中的任何其他代码访问。
类型或成员只能被同一类或结构中的代码访问。
类型或成员只能被同一类或结构中的代码,或派生类中的代码访问。
private protected
(在C# 7.2中添加)类型或成员只能被同一类或结构中的代码或来自同一程序集的派生类中的代码访问,但是不能从另一个程序集中访问。
类型或成员可以被同一程序集中的任何代码访问,但不能从另一个程序集中访问。
这种类型或成员可以被同一程序集中的任何代码访问,或者被其他程序集中的任何派生类访问。
当没有访问修饰符时,会使用默认的访问修饰符。因此,即使未设置访问修饰符,始终存在某种形式的访问修饰符。
static
修饰符
类上的static
修饰符意味着该类无法实例化,并且其所有成员都是静态的。一个静态成员只有一个版本,而不管创建其封闭类型的实例有多少个。
静态类基本上与非静态类相同,但有一个区别:静态类不能从外部进行实例化。换句话说,您不能使用new
关键字创建该类类型的变量。由于没有实例变量,您需要使用类名本身来访问静态类的成员。
然而,存在一种叫做静态构造函数的东西。任何类都可以具有其构造函数,包括静态类。它们不能直接调用,也不能有参数(除了类本身的任何类型参数)。在创建第一个实例或引用任何静态成员之前,将自动调用该静态构造函数来初始化类。它看起来像这样:
static class Foo() { static Foo() { Bar = "fubar"; } public static string Bar { get; set; } }
静态类通常用作服务,您可以像这样使用它们:
MyStaticClass.ServiceMethod(...);