标识符和关键字

标识符

标识符是您分配给类型(类、接口、结构、委托或枚举)、成员、变量或命名空间的名称。 有效标识符必须遵循以下规则:

  • 标识符可以包含字母、十进制数字、连接字符(_)。
  • 标识符必须以字母或 _开头。
  • 不能使用 C# 关键字作为标识符,但您可以通过在标识符上使用 @ 前缀来声明与 C# 关键字相同的标识符。 @ 不是标识符名称的一部分。 例如,@if 声明了一个名为 if 的标识符。

如下例所示:

// 正确的命名
_size
@int
@www
student_name

// 错误的命令
student@name
student name
1student
student.name

命名约定

除了规则之外,整个 .NET 还使用了许多标识符命名约定。

按照惯例,C# 程序对类型名称、命名空间和所有公共成员使用驼峰命令法(PascalCase)。 驼峰命令法——是一种编程命名约定,它规定由多个单词组成的变量名,每个单词的首字母都写成大写。

public class DataService
{
}
public record PhysicalAddress(
    string Street,
    string City,
    string StateOrProvince,
    string ZipCode);
public struct ValueCoordinate
{
}

在命名类型的公共成员时,例如字段、属性、事件、方法和局部函数,请使用驼峰命令法。

public class ExampleEvents
{
    // 一个公共字段,这些应该谨慎使用
    public bool IsValid;

    // 一个仅初始化属性
    public IWorkerQueue WorkerQueue { get; init; }

    // 事件
    public event Action EventProcessing;

    // 方法
    public void StartEventProcessing()
    {
        // 局部函数
        static int CountQueueItems() => WorkerQueue.Count;
        // ...
    }
}

局部变量使用首字母小写的驼峰命令法。

var i = 10;

var service = new DataService();

命名私有或内部字段时使用首字母小写的驼峰命令法,并在它们前面加上 _

public class DataService
{
    private IWorkerQueue _workerQueue;
}

使用 privateinternal 的静态(static)字段时,使用 s_ 前缀,对于线程静态字段使用 t_ 前缀。

public class DataService
{
    private static IWorkerQueue s_workerQueue;

    [ThreadStatic]
    private static TimeSpan t_timeSpan;
}

布局约定

良好的布局使用一致的格式来强调代码的结构并使代码更易于阅读。 .NET使用并推荐您也使用以下约定:

  • 使用默认的代码编辑器设置(智能缩进、四字符缩进、另存为空格的制表符)。
  • 每行只写一个语句。
  • 每行只写一个声明。
  • 如果续行没有自动缩进,请将它们缩进一个制表位(四个空格)。
  • 在方法定义和属性定义之间至少添加一个空行。
  • 使用括号使表达式中的子句明显,如以下代码所示。
if ((val1 > val2) && (val1 > val3))
{
    // 执行适当的操作。
}

注释约定

  • 将注释放在单独的行上,而不是放在代码行的末尾。
  • 以句点结束注释文本。
  • 在注释符号 (//) 和注释文本之间插入一个空格,如下例所示。
    // 以下声明创建一个查询。 它不运行查询。
    
  • 不要在注释周围创建格式化的星号块。
  • 确保所有公共成员都有必要的注释,提供有关其行为的适当描述。

关键字

关键字是预定义的、保留的标识符,对编译器具有特殊含义。 除非它们包含 @ 作为前缀,否则它们不能用作程序中的标识符。 例如,@if 是有效标识符,但 if 不是因为 if 是关键字。

本主题中的第一个表列出了在 C# 程序的任何部分中作为保留标识符的关键字。 本主题中的第二个表列出了 C# 中的上下文关键字。 上下文关键字仅在有限的程序上下文中具有特殊含义,并且可以用作该上下文之外的标识符。 通常,在 C# 语言中添加新关键字时,它们会作为上下文关键字添加,以避免破坏早期版本中编写的程序。

abstract as base bool
break byte case catch
char checked class const
continue decimal default delegate
do double else enum
event explicit extern false
finally fixed float for
foreach goto if implicit
in int interface internal
is lock long namespace
new null object operator
out override params private
protected public readonly ref
return sbyte sealed short
sizeof stackalloc static string
struct switch this throw
true try typeof uint
ulong unchecked unsafe ushort
ushort using virtual void
volatile while

上下文关键字

上下文关键字用于在代码中提供特定含义,但它不是 C# 中的保留字。 一些上下文关键字,例如 partialwhere,在一个或多个上下文中具有特殊含义。

add and alias ascending
args async await by
descending dynamic equals from
get global group init
into join let managed(函数指针调用约定)
nameof nint not notnull
nuint on or orderby
partial (类型) partial (方法) record remove
select set unmanaged value
var when where(过滤条件) where(查询子句)
with yield