当前位置:首页 > 数据榜单

运算符和表达式 - 列出所有运算符和表达式 - C# reference

admin 2026-08-24 01:08:43 7524

C# 提供了许多运算符。

内置类型支持其中许多运算符,因此可以使用这些类型的值执行基本作。

C# 语言参考记录了 C# 语言的最新发布版本。 它还包含即将发布的语言版本公共预览版中功能的初始文档。

本文档标识了在语言的最后三个版本或当前公共预览版中首次引入的任何功能。

小窍门

若要查找 C# 中首次引入功能时,请参阅 有关 C# 语言版本历史记录的文章。

这些运算符包括以下组:

使用数值作数执行算术运算的算术运算符

比较数值作数的比较运算符

使用作数执行逻辑作的bool

使用整型类型的作数执行按位或移位运算的按位和移位运算符

检查其作数是否相等的相等运算符

通常,可以 重载 这些运算符。 通过重载运算符,可以指定用户定义的类型的作数的运算符行为。

最简单的 C# 表达式是文本(例如 整数 和 实 数)和变量的名称。 可以使用运算符将它们合并为复杂的表达式。 运算符 优先级 和 关联性 决定了执行表达式中的作的顺序。 可以使用括号更改运算符优先级和关联性施加的计算顺序。

在以下代码中,表达式的示例显示在赋值右侧:

int a, b, c;

a = 7;

b = a;

c = b++;

b = a + b * c;

c = a >= 100 ? b : c / 10;

a = (int)Math.Sqrt(b * b + c * c);

string s = "String literal";

char l = s[s.Length - 1];

List numbers = [..collection];

b = numbers.FindLast(n => n > 1);

通常,表达式生成一个结果,并且可以包含在另一个表达式中。 方法 void 调用是不生成结果的表达式的示例。 它只能用作 语句,如以下示例所示:

Console.WriteLine("Hello, world!");

下面是 C# 提供的一些其他类型的表达式:

内插字符串表达式 ,提供方便的语法来创建格式化字符串:

var r = 2.3;

var message = $"The area of a circle with radius {r} is {Math.PI * r * r:F3}.";

Console.WriteLine(message);

// Output:

// The area of a circle with radius 2.3 is 16.619.

允许你创建匿名函数的 Lambda 表达式:

int[] numbers = { 2, 3, 4, 5 };

var maximumSquare = numbers.Max(x => x * x);

Console.WriteLine(maximumSquare);

// Output:

// 25

允许直接在 C# 中使用查询功能的查询表达式:

int[] scores = { 90, 97, 78, 68, 85 };

IEnumerable highScoresQuery =

from score in scores

where score > 80

orderby score descending

select score;

Console.WriteLine(string.Join(" ", highScoresQuery));

// Output:

// 97 90 85

可以使用 表达式正文定义 为方法、构造函数、属性、索引器或终结器提供简洁的定义。

运算符优先级

在具有多个运算符的表达式中,先计算优先级较高的运算符,然后再计算优先级较低的运算符。 相同优先级的运算符按词法顺序计算。 在以下示例中,首先执行乘法,因为它的优先级高于加法:

var a = 2 + 2 * 2;

Console.WriteLine(a); // output: 6

使用括号更改运算符优先级施加的计算顺序:

var a = (2 + 2) * 2;

Console.WriteLine(a); // output: 8

下表列出了从最高优先级到最低优先级的 C# 运算符。 每行中的运算符具有相同的优先级。

运营商

类别或名称

x.y、f(x)、a[i]、x?.y、x?[y]、x++、x--、x!、new、typeof、checked、unchecked、default、nameof、delegate、sizeof、stackalloc、x->y

主要

+x、、-x、!x~x、++x、--x^x(T)xawait、&x、、 *xtrue and false

Unary

x..y

范围

switch、with

switch 和 with 表达式

x * y、x / y、x % y

乘法性的

x + y、x – y

累加性

x << y、x >> y、x >>> y

转变

x < y、x > y、x <= y、x >= y、is、as

关系和类型测试

x == y、x != y

平等

x & y

布尔逻辑 AND 或 按位逻辑 AND

x ^ y

布尔逻辑 XOR 或 按位逻辑 XOR

x | y

布尔逻辑 OR 或 按位逻辑 OR

x && y

条件“与”

x || y

条件“或”

x ?? y

Null 合并运算符

c ? t : f

条件运算符

x = y、x += y、x -= y、x *= y、x /= y、x %= y、x &= y、x \|= y、x ^= y、x <<= y、x >>= y、x >>>= y、x ??= y、=>

赋值和 lambda 声明

有关逻辑模式组合器的优先级的信息,请参阅 Patterns 文章的“逻辑模式”部分的“优先级”和“顺序”。

运算符关联性

当运算符具有相同的优先级时,运算符的关联性决定了执行作的顺序:

按从左到右的顺序计算左关联运算符。 除 赋值运算符 和 null 合并运算符外,所有二元运算符都是左关联运算符。 例如, a + b - c 计算结果为 (a + b) - c.

按从右到左的顺序计算右关联运算符。 赋值运算符、null 合并运算符、lambda 和条件运算符是右关联 运算符 ?: 。 例如, x = y = z 计算结果为 x = (y = z).

重要

在窗体P?.A0?.A1的表达式中,如果是Pnull,则A0既不A1计算也不计算。 同样,在窗体 P?.A0.A1的表达式中,因为 A0 当值为 null 时 P 不计算,两者 A0.A1都不计算。 有关更多详细信息,请参阅 C# 语言规范 。

使用括号更改运算符关联性施加的计算顺序:

int a = 13 / 5 / 2;

int b = 13 / (5 / 2);

Console.WriteLine($"a = {a}, b = {b}"); // output: a = 1, b = 6

作数评估

与运算符优先级和关联性无关,表达式中的作数从左到右计算。 以下示例演示计算运算符和作数的顺序:

Expression

评估顺序

a + b

a、b、+

a + b * c

a、b、c、*、+

a / b + c * d

a, b, /, c, d, *, +

a / (b + c) * d

a, b, c, +, /, d, *

通常,将计算所有运算符作数。 但是,某些运算符有条件地计算作数。 该条件表示此类运算符最左侧的作数的值定义是否应计算其他作数(或哪个作数)。 这些运算符是条件逻辑 AND () 和 OR (&&||)运算符、null 合并运算符和 ??null 条件运算符??=?.以及?[]条件运算符?:。 有关详细信息,请参阅每个运算符的说明。

C# 语言规范

有关更多信息,请参阅 C# 语言规范的以下部分:

表达式

操作员

另请参阅

运算符重载

表达式树