C# 关键字

修饰符

访问修饰符

访问修饰符共有四个

  • public
  • protected
  • internal
  • private

可以定义六个可访问性级别

声明的可访问性 访问范围
public 不受限制
protected 包含类或派生于包含类的类型
internal 当前程序集
protected internal 当前程序集或派生自包含类的类型
private 包含类
private protected 包含类或当前程序集中派生自包含类的类型

命名空间中不能出现访问修饰符。如果没有在成员声明中指定访问修饰符,则使用默认的可访问性。

未嵌套在其他类型中的顶级类型只能具有 internalpublic 可访问性。 这些类型的默认可访问性为 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 修饰符。不能重写非虚方法或静态方法。 重写基方法必须是 virtualabstractoverride

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 修饰符不能与 staticabstract privateoverride 修饰符一起使用。

volatile

volatile 关键字指示一个字段可以由多个同时执行的线程修改。

语句关键字

方法参数

为不具有 in、ref 或 out 的方法声明的参数会按值传递给调用的方法。 可以在方法中更改该值,但当控制传递回调用过程时,不会保留更改后的值。 可以通过使用方法参数关键字更改此行为。

params

使用 params 关键字可以指定采用数目可变的参数的方法参数。 参数类型必须是一维数组。

在方法声明中的 params 关键字之后不允许有任何其他参数,并且在方法声明中只允许有一个 params 关键字。

in(参数修饰符)

in 关键字通过引用传递参数。 它让形参成为实参的别名,这必须是变量。 换而言之,对形参执行的任何操作都是对实参执行的。 in 参数无法通过调用的方法进行修改,相当于一个readonly的引用。

ref

ref 关键字指示按引用传递的值。 它用在四种不同的上下文中:

  • 在方法签名和方法调用中,按引用将参数传递给方法。
  • 在方法签名中,按引用将值返回给调用方。
  • 在成员正文中,指示引用返回值是否作为调用方欲修改的引用被存储在本地,或在一般情况下,局部变量按引用访问另一个值。
  • struct 声明中声明 ref structreadonly 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

上下文关键字

查询关键字

参考资料

作者

Leslie Guo

发布于

2020-12-01

更新于

2021-10-11

许可协议

评论