C# 中使用 class 关键字来定义类
该例定义了一个名为 Myclass 的类
可使用以下修饰符:
internal
内部的,为默认类型,只有当前项目中的代码才可以访问
public
公共的,可以被其他项目的代码访问
abstract
抽象的,不能实例化,只能被继承,可以有抽象成员
sealed
密封的,不能被继承
- abstract 和 sealed 类型可以是 public 或 internal 的类
- abstract 和 sealed 修饰符互斥
类成员
在类定义中,提供了该类所有成员的定义,包括字段、方法和属性,类成员有自己的访问级别,通过以下关键字之一来定义:
public
成员可以由任何代码访问
private
成员只能由类中的代码访问(默认关键字)
protected
成员只能由定义它的类或其派生类中的代码访问
internal
成员只能由定义它的程序集(项目)内部的代码访问
static
表明该成员是类的静态成员,而不是对象的实例成员
- protected 和 internal 两个关键字可以结合使用,由其定义的成员只能由程序集(项目)内部的类或派生类的代码访问
字段(变量)
字段即为类中的变量成员,用标准的变量声明格式(可以初始化)和前面定义的修饰符来定义
字段也可以使用特殊关键字 readonly 来定义,该关键字表示这个字段只能在执行构造函数的过程或是初始化时赋值(只读)
另外,可以使用关键字 const 来创建一个常量值,按照定义,const 成员也是静态的,所以不需要 static 修饰符(事实上如果同时使用会出现错误)
以上示例代码演示了三种字段的定义方法
方法(类函数)
方法(类函数)使用标准的函数格式、可访问性和可选的 static 修饰符来声明,可以使用以下关键字:
virtual
方法可以重写
abstract
方法是抽象的,必须在非抽象的派生类中重写
override
方法重写了一个基类方法(重写方法必须使用)
extern
方法定义放在其他地方
- 以下为一些例子
- 如果使用了 static 关键字,这个方法就只能通过类来访问,不能通过对象实例来访问,即该方法属于类而不是成员
- 如果使用了 override 关键字,也可以使用 sealed 来指定在派生类中不能对这个方法做进一步的修改,即派生类不能重写该方法
属性
属性的定义方式与字段类似,但比字段复杂,属性可以在修改状态前执行一些额外操作,实际上,它们可能并不修改状态
属性拥有两个类似于函数的块,一个块用于获取属性的值,另一个块用于设置属性的值,这两个块也称为访问器,分别用 get 和 set 关键字定义,可以用于控制属性的访问级别
- get 关键字在属性或索引器中定义访问器方法,它将返回属性值或索引器元素。
- set 关键字在属性或索引器中定义访问器,它会向属性或索引器元素分配值。
使用 get 和 set 方法可以保护变量不被随意修改,可以忽略其中的一个块来创建只读或是只写属性,当然,这仅适用于外部代码,因为类中的其他代码可以访问这些代码块能访问的数据
属性的基本结构包括标准的可访问修饰符,类型名、属性名和 get/set 块(其中包含属性处理代码)
以上代码定义了一个私有变量 ans 和公共变量 Ans
get 定义了取出变量时的操作,此处取出了私有变量 ans
set 定义了给变量赋值时的操作,此处对私有变量 ans 进行了赋值
属性可以使用 virtual 、override和abstract关键字,就像方法一样,访问器也可以有自己的可访问性,如下
以上代码中,只有基于类或者派生类的代码才能使用 set 访问器
C# 6引入了一个名为“基于表达式的属性”的功能,这个功能可以把属性的定义减少为一行代码,例如,下面的代码对一个值进行数学计算
自动属性
自动属性提供了一种简化的语法声明属性,C#编译器会自动添加未键入的内容,确切的讲,编译器会声明一个用于存储属性的私有字段,并在属性的 get 和 set 块中使用该字段,使用者不必考虑细节
使用如下的代码结构定义一个自动属性
- 在C# 6中也可以定义一个只有 get 访问器的自动属性,和自动属性的初始化器,由以下代码定义