C# 修饰符

本文主要介绍C# 修饰符。

1、修饰符

例如public关键字是访问修饰符,表示用于设置类,属性,方法和构造函数的访问级别。

我们将修饰符分为两种:

访问修饰符-控制访问级别
非访问修饰符-不控制访问级别,但提供其他功能
1)C#类修饰符

public、internal、 partial、abstract、sealed、static

2)C#成员修饰符

public、protected、private、internal、sealed、abstract、virtual、override、readonly、const

2、访问控制修饰符

修饰符 Value
public (可以修饰类也可以修饰成员)公共的,最高的访问级别,访问没有限制。
internal (可以修饰类也可以修饰成员)内部的,类和方法的默认访问修饰符是internal,只有在本程序集内的成员可以访问,其他程序集或站点引用其所在的程序集无法访问此类。例如程序集LibraryA写有ClassA,程序集LibraryB引用LibraryA,在LibraryB的类或方法里无法通过LibraryA调用ClassA
partial (它只修饰类),部分的,可以将一个类分成几部分写在不同文件中,最终编译时将合并成一个文件,且各个部分不能分散在不同程序集中。
private (只修饰成员)私有的,最低的访问级别,被private访问修饰符修饰的成员只有在当前类的内部可以访问,其他地方一律不得访问。
protected (只修饰成员)受保护的,只有在当前类内部及所有的子类内部可以访问。只有继承父类后,才可以调用它的属性

3、非访问修饰符

对于类,可以使用final或abstract:

修饰符 Value
const 修饰字段,表示该字段为只读字段。const修饰的字段在编译时必须能够明确知道该字段的值,其值是硬编码到程序中去的,修改了该类型成员后需要重新编译才能使修改生效,const可以修饰局部变量。
abstract (可以修饰类也可以修饰成员)抽象的,修饰类的时候表示该类为抽象类,不能够创建该类的实例。修饰方法的时候表示该方法需要由子类来实现,如果子类没有实现该方法那么子类同样是抽象类;且含有抽象方法的类一定是抽象类。
sealed (可以修饰类也可以修饰成员)密封的,修饰类时表示该类不能够被继承,修饰方法时表示该方法不能被重写【sealed相当于java中的final修饰符】
static (可以修饰类也可以修饰成员)静态的,修饰类时表示该类是静态类,不能实例化该类的对象,既然不能实例化该类,那么这个类也就不能含有对象成员,即该类所有成员为静态;类成员只能通过【类.成员名】的方式访问。当static修饰构造函数时,构造函数不能含有任何参数,不能含有修饰符,构造函数不能对对象成员进行初始化操作。但是能够对静态成员进行初始化或者调用。不能保证他在什么时候执行,却能保证在第一次使用类型前执行。在静态构造函数中初始化的静态成员为最终初始化结果。
virtual 修饰方法成员,表示虚方法。父类可以含有该类的实现,子类可以覆写该函数。
override 表示该方法为覆写了父类的方法。
readonly 修饰字段,表示该字段为只读字段。readonly是运行时只读,内容在运行时确定,所以修改了readonly类型成员后无需重新编译即可生效,Readonly不能修饰局部变量

4、readonly修饰符

如果不希望覆盖现有的属性值,请将属性声明为const:

例如:

// An highlighted block
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication
{
    public class MyMainClass
    {
        public readonly int x = 10;
        public readonly double PI = 3.14;
        public static void Main(string[] args)
        {
            MyMainClass myObj = new MyMainClass();
            myObj.x = 50;  // 会产生一个错误 
            myObj.PI = 25; // 会产生一个错误
            Console.WriteLine(myObj.PI);
        }
    }
}

5、static修饰符

static方法是类方法,不需要创建类的对象就可以访问,这与public不同:

例如:

下面示例说明static和public方法之间的区别:

// An highlighted block
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication
{
    public class MyMainClass
    {
        // 静态方法
        static void StaticMethod()
        {
            Console.WriteLine("可以在不创建对象的情况下调用静态方法");
        }
        // 公共方法
        public void PublicMethod()
        {
            Console.WriteLine("公共方法必须通过创建对象来调用");
        }
        // main方法
        public static void Main(string[] args)
        {
            StaticMethod(); // 调用静态方法
                              // myPublicMethod(); 会出错
            MyMainClass myObj = new MyMainClass(); // 创建MyMain类的对象
            myObj.PublicMethod(); // 调用方法
        }
    }
}

6、abstract修饰符

abstract抽象方法属于abstract类,并且该方法没有实现。方法由子类实现:

例如:

// An highlighted block
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.Nmae);
            Console.WriteLine("Age: " + myObj.Age);
            Console.WriteLine("Year: " + myObj.Year);
            myObj.Study(); // 调用抽象方法
        }
    }
    //抽象类 
    public abstract class Person
    {
        public String Nmae= "ceb";
        public int Age = 10;
        public abstract void Study(); // abstract method
    }
    // 子类 (从Main类继承)
    public class Student : Person
    {
        public int Year = 2017;
        public override void Study()
        { // 实现抽象方法
            Console.WriteLine("好好学习,天天向上!!!");
        }
    }
}
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐