# 关键字 > **关键字**是对编译器具有特殊意义的预定义保留字符。它们不能在程序中用作标识符,除非它们有一个 @ 前缀。例如,@if 是有效的标识符,但 if 不是,因为 if 是关键字。 > > [关键字教程地址](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/) ## 修饰符 ### 访问修饰符 访问修饰符是关键字,用于指定成员或类型已声明的可访问性。 本部分介绍四个访问修饰符: - `public` - `protected` - `internal` - `private` 可使用访问修饰符指定以下六个可访问性级别: - [public](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/public):访问不受限制 - [protected](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/protected):访问限于包含类或者包含类的派生类 - [internal](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/internal):访问限于当前程序集 - [protected internal](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/protected-internal):访问限于当前程序集或包含类的派生类 - [private]():访问限于包含类 - [private protected](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/private-protected):访问限于包含类或当前程序集中包含类的派生类 **各种类型对象成员的默认方位修饰符及可用修饰符** | 对象 | 成员默认访问修饰符 | 可用修饰符 | | --------- | ------------------ | ------------------------------------------------------------ | | enum | public | 无 | | class | private | public、protected、internal、private、protected internal、private protected | | interface | public | public、protected、internal、private、protected internal、private protected | | struct | private | public、internal、private | > 具有`private`可访问性的interface成员必须具有默认的实现,并且只有C# 8.0后支持除public以外的修饰符。 ### 其他修饰符 - [abstract](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/abstract):抽象修饰符,可用于类、方法、属性、索引和事件。 标记为抽象的成员必须由派生自抽象类的非抽象类来实现。 - [async](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/async):使用`async`修饰符,可以将方法、lambda表达式或匿名方法指定为异步。 - [const](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/const):使用 `const` 关键字来声明某个常量字段或常量局部变量。 常量字段和常量局部变量不是变量并且不能修改。 - [event](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/event):用于声明事件。 - [extern](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/extern):`extern` 修饰符用于声明在外部实现的方法。 `extern` 修饰符的常见用法是在使用 Interop 服务调入非托管代码时与 `DllImport` 特性一起使用。 在这种情况下,还必须将方法声明为 `static`。 - [in(泛型修饰符)](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/in-generic-modifier):对于泛型类型参数,`in` 关键字可指定类型参数是逆变的。 可以在泛型接口和委托中使用 `in` 关键字。 - [new 修饰符](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/new-modifier):在用作声明修饰符时,`new` 关键字可以显式隐藏从基类继承的成员。 隐藏继承的成员时,该成员的派生版本将替换基类版本。 - [out 关键字(泛型修饰符)](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/out-generic-modifier):对于泛型类型参数,`out` 关键字可指定类型参数是协变的。 可以在泛型接口和委托中使用 `out` 关键字。 - [override 修饰符](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/override):扩展或修改继承的方法、属性、索引器或事件的抽象或虚拟实现需要 `override` 修饰符。 - [readonly](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/readonly):`readonly` 关键字是一个可在四个上下文中使用的修饰符: - 在字段声明中,`readonly` 指示只能在声明期间或在同一个类的构造函数中向字段赋值。 - 在 `readonly struct` 类型定义中,`readonly` 指示结构类型是不可变的。 - 在结构类型内的实例成员声明中,`readonly` 指示实例成员不修改结构的状态。 - 在 `ref readonly`方法返回中,`readonly` 修饰符指示该方法返回一个引用,且不允许向该引用写入内容。 - [sealed 修饰符 ](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/sealed):应用于某个类时,`sealed` 修饰符可阻止其他类继承自该类。 - [static 修饰符](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/static):使用 `static` 修饰符可声明属于类型本身而不是属于特定对象的静态成员。 - [unsafe 关键字](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/unsafe):`unsafe` 关键字表示不安全上下文,该上下文是任何涉及指针的操作所必需的。 - [virtual](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/virtual):`virtual` 关键字用于修改方法、属性、索引器或事件声明,并使它们可以在派生类中被重写。 - [volatile](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/volatile):`volatile` 关键字指示一个字段可以由多个同时执行的线程修改。 ## 语句关键字 | 类别 | c#关键字 | | ------------------ | ------------------------------------------------------------ | | 选择语句 | if、else、switch、case | | 迭代语句 | do、for、foreach、while | | 跳转语句 | break、continue、default、[goto](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/goto) 、return、[yield](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/yield) | | 异常处理语句 | throw、try-catch、try-finally、try-catch-finally | | Checked和Unchecked | [checked](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/checked)、[unchecked](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/unchecked),用于对整型算术运算和转换启用或关闭溢出检查 | | fixed语句 | [fixed](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/fixed-statement)语句可防止垃圾回收期重新定位可移动的变量 | | lock语句 | [lock](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/lock-statement)语句获取给定对象的互斥 lock,执行语句块,然后释放 lock。 | ## 方法参数 - [参数数组的 params 关键字](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/params):使用 `params` 关键字可以指定采用数目可变的参数的[方法参数](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/method-parameters)。 参数类型必须是一维数组。 - [in 参数修饰符](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/in-parameter-modifier):`in` 关键字会导致按引用传递参数,但确保未修改参数。 它让形参成为实参的别名,这必须是变量。 - [ref 关键字](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/ref):`ref` 关键字指示按引用传递值。 - [out 参数修饰符](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/out-parameter-modifier):`out` 关键字通过引用传递参数。它与 [ref](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/ref) 关键字相似,只不过 `ref` 要求在传递之前初始化变量。 ## 命名空间关键字 - [namespace 关键字](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/namespace):关键字用于声明包含一组相关对象的作用域。 可以使用命名空间来组织代码元素并创建全局唯一类型。 - using:`using` 关键字有三个主要用途: - [using 语句](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/using-statement)定义一个范围,在此范围的末尾将释放对象。 - [using 指令](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/using-directive)为命名空间创建别名,或导入在其他命名空间中定义的类型。 - [using static 指令](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/using-static)导入单个类的成员。 ## 泛型类型约束关键字 - [new 约束](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/new-constraint):`new` 约束指定泛型类声明中的类型实参必须有公共的无参数构造函数。 若要使用 `new` 约束,则该类型不能为抽象类型。 - [where(泛型类型约束](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/where-generic-type-constraint):泛型定义中的 `where` 子句指定对用作泛型类型、方法、委托或本地函数中类型参数的参数类型的约束。 ## 访问关键字 - [base 关键字 ](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/base):`base` 关键字用于从派生类中访问基类的成员。 - [this 关键字](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/this):`this` 关键字指代类的当前实例,还可用作扩展方法的第一个参数的修饰符。 ## 文字关键字 - [null 关键字](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/null):`null` 关键字是表示不引用任何对象的空引用的文字值。 `null` 是引用类型变量的默认值。 普通值类型不能为 NULL,[可为空的值类型](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/builtin-types/nullable-value-types)除外。 - [bool 类型关键字](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/builtin-types/bool):`bool` 类型关键字是 .NET [System.Boolean](https://docs.microsoft.com/zh-cn/dotnet/api/system.boolean) 结构类型的别名,它表示一个布尔值,可为 `true` 或 `false`。 - [default](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/default) ## 上下文关键字 | 关键字 | 说明 | | :----------------------------------------------------------- | :----------------------------------------------------------- | | [add](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/add) | 定义一个自定义事件访问器,客户端代码订阅事件时会调用该访问器。 | | [and](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/operators/patterns#logical-patterns) | 创建在两个嵌套模式均匹配时匹配的模式。 | | [async](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/async) | 指示修改后的方法、lambda 表达式或匿名方法是异步的。 | | [await](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/operators/await) | 挂起异步方法,直到等待的任务完成。 | | [dynamic](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/builtin-types/reference-types) | 定义一个引用类型,实现发生绕过编译时类型检查的操作。 | | [get](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/get) | 为属性或索引器定义访问器方法。 | | [global](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/operators/namespace-alias-qualifier) | 未以其他方式命名的全局命名空间的别名。 | | [init](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/init) | 为属性或索引器定义访问器方法。 | | [nint](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/builtin-types/nint-nuint) | 定义本机大小的整数数据类型。 | | [not](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/operators/patterns#logical-patterns) | 创建在否定模式不匹配时匹配的模式。 | | [nuint](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/builtin-types/nint-nuint) | 定义本机大小的无符号整数数据类型。 | | [or](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/operators/patterns#logical-patterns) | 创建在任一嵌套模式匹配时匹配的模式。 | | [partial](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/partial-type) | 在整个同一编译单元内定义分部类、结构和接口。 | | [record](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/builtin-types/record) | 用于定义记录类型。 | | [remove](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/remove) | 定义一个自定义事件访问器,客户端代码取消订阅事件时会调用该访问器。 | | [set](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/set) | 为属性或索引器定义访问器方法。 | | [value](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/value) | 用于设置访问器和添加或删除事件处理程序。 | | [var](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/var) | 使编译器能够确定在方法作用域中声明的变量类型。 | | [when](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/when) | 指定 `catch` 块的筛选条件或 `switch` 语句的 `case` 标签。 | | [where](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/where-generic-type-constraint) | 将约束添加到泛型声明。 (另请参阅 [where](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/where-clause))。 | | [yield](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/yield) | 在迭代器块中使用,用于向枚举数对象返回值或用于表示迭代结束。 | ## 查询关键字 | 子句 | 说明 | | :----------------------------------------------------------- | :----------------------------------------------------------- | | [from](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/from-clause) | 指定数据源和范围变量(类似于迭代变量)。 | | [where](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/where-clause) | 基于由逻辑 AND 和 OR 运算符(`&&` 或 `||`)分隔的一个或多个布尔表达式筛选源元素。 | | [select](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/select-clause) | 指定执行查询时,所返回序列中元素的类型和形状。 | | [group](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/group-clause) | 根据指定的密钥值对查询结果分组。 | | [into](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/into) | 提供可作为对 join、group 或 select 子句结果引用的标识符。 | | [orderby](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/orderby-clause) | 根据元素类型的默认比较器对查询结果进行升序或降序排序。 | | [join](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/join-clause) | 基于两个指定匹配条件间的相等比较而联接两个数据源。 | | [let](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/let-clause) | 引入范围变量,在查询表达式中存储子表达式结果。 | | [in](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/in) | [join](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/join-clause) 子句中的上下文关键字。 | | [on](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/on) | [join](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/join-clause) 子句中的上下文关键字。 | | [equals](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/equals) | [join](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/join-clause) 子句中的上下文关键字。 | | [by](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/by) | [group](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/group-clause) 子句中的上下文关键字。 | | [ascending](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/ascending) | [orderby](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/orderby-clause) 子句中的上下文关键字。 | | [descending](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/descending) | [orderby](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/orderby-clause) 子句中的上下文关键字。 |