C# 修饰符

C# 是面向对象的编程语言,对象就是面向对象程序设计的核心。所谓对象就是真实世界中的实体,对象与实体是一一对应的,也就是说现实世界中每一个实体都是一个对象,它是一种具体的概念。本文主要介绍C# 修饰符。

1、修饰符

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

我们将修饰符分为两种:

  • 访问修饰符-控制访问级别
  • 非访问修饰符-不控制访问级别,但提供其他功能

1)C#类修饰符

publicinternalpartialabstractsealedstatic

2)C#成员修饰符

publicprotectedprivateinternalsealedabstractvirtualoverridereadonlyconst

2、访问控制修饰符

public

(可以修饰类也可以修饰成员)公共的,最高的访问级别,访问没有限制。

internal

(可以修饰类也可以修饰成员)内部的,

类和方法的默认访问修饰符是internal,

只有在本程序集内的成员可以访问,

其他程序集或站点引用其所在的程序集无法访问此类。

例如程序集LibraryA写有ClassA,

程序集LibraryB引用LibraryA,

在LibraryB的类或方法里无法通过LibraryA调用ClassA

partial

(它只修饰类),部分的,可以将一个类分成几部分写在不同文件中,

最终编译时将合并成一个文件,且各个部分不能分散在不同程序集中。

private

(只修饰成员)私有的,最低的访问级别,

被private访问修饰符修饰的成员只有在当前类的内部可以访问,

其他地方一律不得访问。

protected

(只修饰成员)受保护的,

只有在当前类内部及所有的子类内部可以访问。

只有继承父类后,才可以调用它的属性

3、非访问修饰符

对于类,可以使用finalabstract

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不同:

例如:

下面示例说明staticpublic方法之间的区别:

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("好好学习,天天向上!!!");
        }
    }
}


推荐阅读
cjavapy编程之路首页