C# 关键字
修饰符
访问修饰符
访问修饰符共有四个
- public
- protected
- internal
- private
可以定义六个可访问性级别
声明的可访问性 | 访问范围 |
---|---|
public | 不受限制 |
protected | 包含类或派生于包含类的类型 |
internal | 当前程序集 |
protected internal | 当前程序集或派生自包含类的类型 |
private | 包含类 |
private protected | 包含类或当前程序集中派生自包含类的类型 |
命名空间中不能出现访问修饰符。如果没有在成员声明中指定访问修饰符,则使用默认的可访问性。
未嵌套在其他类型中的顶级类型只能具有 internal
或 public
可访问性。 这些类型的默认可访问性为 internal
。
成员 | 默认成员可访问性 | 允许的成员的声明的可访问性 |
---|---|---|
enum |
public |
无 |
class |
private |
public protected internal private protected internal private protected |
interface |
public |
无 |
struct |
private |
public internal private |
abstract
在类声明中庸abstract修饰符来指示某个类仅用于其他类的基类,不能用于自行实例化。abstract修饰的成员函数必须被派生类实现。
async
将方法,lambda表达式或匿名方法指定为异步。
const
使用 const
关键字来声明某个常量字段或常量局部变量。 常量字段和常量局部变量不是变量并且不能修改。 常量可以为数字、布尔值、字符串或 null 引用。
event
声明发布服务器类中的事件
external
声明在外部实现的方法
in(泛型修饰符)
对于泛型类型参数,in
关键字可指定类型参数是逆变的。 可以在泛型接口和委托中使用 in
关键字。
逆变使你使用的类型可以比泛型参数指定的类型派生程度更小。 这样可以隐式转换实现协变接口的类以及隐式转换委托类型。 引用类型支持泛型类型参数中的协变和逆变,但值类型不支持它们。
new(成员修饰符)
在用作声明修饰符时,new
关键字可以显式隐藏从基类继承的成员。 隐藏继承的成员时,该成员的派生版本将替换基类版本。
out(泛型修饰符)
对于泛型类型参数,out
关键字可指定类型参数是协变的。 可以在泛型接口和委托中使用 out
关键字。
协变使你使用的类型可以比泛型参数指定的类型派生程度更大。 这样可以隐式转换实现协变接口的类以及隐式转换委托类型。 引用类型支持协变和逆变,但值类型不支持它们。
override
扩展或修改继承的方法、属性、索引器或事件的抽象或虚拟实现需要 override
修饰符。不能重写非虚方法或静态方法。 重写基方法必须是 virtual
、abstract
或 override
。
override
声明不能更改 virtual
方法的可访问性。 override
方法和 virtual
方法必须具有相同级别访问修饰符。
randonly
readonly
关键字是一个可在四个上下文中使用的修饰符:
在字段声明中,
readonly
指示只能在声明期间或在同一个类的构造函数中向字段赋值。 可以在字段声明和构造函数中多次分配和重新分配只读字段。- 由于值类型直接包含数据,因此属于
readonly
值类型的字段不可变。 - 由于引用类型包含对其数据的引用,因此属于
readonly
引用类型的字段必须始终引用同一对象。 该对象是可变的。readonly
修饰符可防止字段替换为引用类型的其他实例。 但是,修饰符不会阻止通过只读字段修改字段的实例数据。
包含属于可变引用类型的外部可见只读字段的外部可见类型可能存在安全漏洞,可能会触发警告 CA2104:“不要声明只读可变引用类型。”
- 由于值类型直接包含数据,因此属于
在
readonly struct
类型定义中,readonly
指示结构类型是不可变的。在结构类型内的实例成员声明中,
readonly
指示实例成员不修改结构的状态。在
ref readonly
方法返回中,readonly
修饰符指示该方法返回一个引用,且不允许向该引用写入内容。
sealed
应用于某个类时,sealed
修饰符可阻止其他类继承自该类。
static
使用 static
修饰符可声明属于类型本身而不是属于特定对象的静态成员。 static
修饰符可用于声明 static
类。static
修饰符不能用于索引器或终结器。static
可以用于声明静态类,静态类无法被实例化。
unsafe
unsafe
关键字用于表示不安全上下文。
virtual
virtual
关键字用于修改方法、属性、索引器或事件声明,并使它们可以在派生类中被重写。virtual
修饰符不能与 static
、abstract
private
或 override
修饰符一起使用。
volatile
volatile
关键字指示一个字段可以由多个同时执行的线程修改。
语句关键字
方法参数
为不具有 in、ref 或 out 的方法声明的参数会按值传递给调用的方法。 可以在方法中更改该值,但当控制传递回调用过程时,不会保留更改后的值。 可以通过使用方法参数关键字更改此行为。
params
使用 params
关键字可以指定采用数目可变的参数的方法参数。 参数类型必须是一维数组。
在方法声明中的 params
关键字之后不允许有任何其他参数,并且在方法声明中只允许有一个 params
关键字。
in(参数修饰符)
in
关键字通过引用传递参数。 它让形参成为实参的别名,这必须是变量。 换而言之,对形参执行的任何操作都是对实参执行的。 in
参数无法通过调用的方法进行修改,相当于一个readonly的引用。
ref
ref
关键字指示按引用传递的值。 它用在四种不同的上下文中:
- 在方法签名和方法调用中,按引用将参数传递给方法。
- 在方法签名中,按引用将值返回给调用方。
- 在成员正文中,指示引用返回值是否作为调用方欲修改的引用被存储在本地,或在一般情况下,局部变量按引用访问另一个值。
- 在
struct
声明中声明ref struct
或readonly ref struct
。
按引用传递参数
在方法的参数列表中使用 ref
关键字时,它指示参数按引用传递,而非按值传递。 ref
关键字让形参成为实参的别名,这必须是变量。 换而言之,对形参执行的任何操作都是对实参执行的。 例如,如果调用方传递本地变量表达式或数组元素访问表达式,所调用方法会替换 ref 参数引用的对象,然后,当该方法返回时,调用方的本地变量或数组元素将开始引用新对象。
不要混淆通过引用传递的概念与引用类型的概念。 这两种概念是不同的。 无论方法参数是值类型还是引用类型,均可由
ref
修改。 当通过引用传递时,不会对值类型装箱。
若要使用 ref
参数,方法定义和调用方法均必须显式使用 ref
关键字。
引用返回值
引用返回值(或 ref 返回值)是由方法按引用向调用方返回的值。 即是说,调用方可以修改方法所返回的值,此更改反映在调用方法中的对象的状态中。
ref局部变量
ref 局部变量用于指代使用 return ref
返回的值。 无法将 ref 局部变量初始化为非 ref 返回值。 也就是说,初始化的右侧必须为引用。
out(参数修饰符)
out
关键字通过引用传递参数。 它让形参成为实参的别名,这必须是变量。 换而言之,对形参执行的任何操作都是对实参执行的。 若要使用 out
参数,方法定义和调用方法均必须显式使用 out
关键字。
命名空间关键字
类型测试关键字
泛型类型约束关键字
new约束
new
约束指定泛型类声明中的类型实参必须有公共的无参数构造函数。 若要使用 new
约束,则该类型不能为抽象类型。
当与其他约束一起使用时,new()
约束必须最后指定。
where(泛型类型约束)
泛型定义中的 where
子句指定对用作泛型类型、方法、委托或本地函数中类型参数的参数类型的约束。 约束可指定接口、基类或要求泛型类型为引用、值或非托管类型。 它们声明类型参数必须具备的功能。
访问关键字
base
从派生类中访问基类的成员
- 调用基类上已被其他方法重写的方法。
- 指定创建派生类实例时应调用的基类构造函数。
this
this
关键字指代类的当前实例,还可用作扩展方法的第一个参数的修饰符。
文字关键字
null、true、false和default