1、修饰符
例如public
关键字是访问修饰符,表示用于设置类,属性,方法和构造函数的访问级别。
我们将修饰符分为两种:
- 访问修饰符-控制访问级别
- 非访问修饰符-不控制访问级别,但提供其他功能
1)C#类修饰符
public
、internal
、 partial
、abstract
、sealed
、static
2)C#成员修饰符
public
、protected
、private
、internal
、sealed
、abstract
、virtual
、override
、readonly
、const
2、访问控制修饰符
public | (可以修饰类也可以修饰成员)公共的,最高的访问级别,访问没有限制。 |
internal | (可以修饰类也可以修饰成员)内部的, 类和方法的默认访问修饰符是internal, 只有在本程序集内的成员可以访问, 其他程序集或站点引用其所在的程序集无法访问此类。 例如程序集LibraryA写有ClassA, 程序集LibraryB引用LibraryA, 在LibraryB的类或方法里无法通过LibraryA调用ClassA |
partial | (它只修饰类),部分的,可以将一个类分成几部分写在不同文件中, 最终编译时将合并成一个文件,且各个部分不能分散在不同程序集中。 |
private | (只修饰成员)私有的,最低的访问级别, 被private访问修饰符修饰的成员只有在当前类的内部可以访问, 其他地方一律不得访问。 |
protected | (只修饰成员)受保护的, 只有在当前类内部及所有的子类内部可以访问。 只有继承父类后,才可以调用它的属性 |
3、非访问修饰符
对于类,可以使用final
或abstract
:
const | 修饰字段,表示该字段为只读字段。 const修饰的字段在编译时必须能够明确知道该字段的值, 其值是硬编码到程序中去的, 修改了该类型成员后需要重新编译才能使修改生效, const可以修饰局部变量。 |
abstract | (可以修饰类也可以修饰成员)抽象的, 修饰类的时候表示该类为抽象类, 不能够创建该类的实例。 修饰方法的时候表示该方法需要由子类来实现, 如果子类没有实现该方法那么子类同样是抽象类; 且含有抽象方法的类一定是抽象类。 |
sealed | (可以修饰类也可以修饰成员)密封的, 修饰类时表示该类不能够被继承, 修饰方法时表示该方法不能被重写【sealed相当于java中的final修饰符】 |
static | (可以修饰类也可以修饰成员)静态的, 修饰类时表示该类是静态类, 不能实例化该类的对象,既然不能实例化该类, 那么这个类也就不能含有对象成员, 即该类所有成员为静态;类成员只能通过【类.成员名】的方式访问。 当static修饰构造函数时, 构造函数不能含有任何参数,不能含有修饰符, 构造函数不能对对象成员进行初始化操作。 但是能够对静态成员进行初始化或者调用。 不能保证他在什么时候执行,却能保证在第一次使用类型前执行。 在静态构造函数中初始化的静态成员为最终初始化结果。 |
virtual | 修饰方法成员,表示虚方法。父类可以含有该类的实现, 子类可以覆写该函数。 |
override | 表示该方法为覆写了父类的方法。 |
readonly | 修饰字段,表示该字段为只读字段。readonly是运行时只读, 内容在运行时确定, 所以修改了readonly类型成员后无需重新编译即可生效, Readonly不能修饰局部变量 |
4、readonly修饰符
如果不希望覆盖现有的属性值,请将属性声明为const:
例如:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication { public class MainClass { public readonly int x = 10; public readonly double PI = 3.14; public static void Main(string[] args) { MainClass myObj = new MainClass(); myObj.x = 50; // 会产生一个错误 myObj.PI = 25; // 会产生一个错误 Console.WriteLine(myObj.PI); } } }
5、static修饰符
static
方法是类方法,不需要创建类的对象就可以访问,这与public
不同:
例如:
下面示例说明static
和public
方法之间的区别:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication { public class MainClass { // 静态方法 static void myStaticMethod() { Console.WriteLine("可以在不创建对象的情况下调用静态方法"); } // 公共方法 public void myPublicMethod() { Console.WriteLine("公共方法必须通过创建对象来调用"); } // main方法 public static void Main(string[] args) { myStaticMethod(); // 调用静态方法 // myPublicMethod(); 会出错 MainClass myObj = new MainClass(); // 创建Main类的对象 myObj.myPublicMethod(); // 调用方法 } } }
6、abstract修饰符
abstract
抽象方法属于abstract
类,并且该方法没有实现。方法由子类实现:
例如:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication { public class MyClass { public static void Main(string[] args) { // 创建Student类的一个对象(从Person继承属性和方法) Student myObj = new Student(); Console.WriteLine("Name: " + myObj.Fname); Console.WriteLine("Age: " + myObj.Age); Console.WriteLine("Year: " + myObj.Year); myObj.Study(); // 调用抽象方法 } } //抽象类 public abstract class Person { public String Fname = "cjavapy"; public int Age = 3; public abstract void Study(); // abstract method } // 子类 (从Main类继承) public class Student : Person { public int Year = 2017; public override void Study() { // 实现抽象方法 Console.WriteLine("好好学习,天天向上!!!"); } } }