这篇笔记我们简单介绍下C#语言中表达式和运算符的用法。
表达式是包含运算符和操作数的语法结构,C#中的运算符可以有1个、2个或3个操作数,可以作为操作数的结构包括:字面量、常量、变量、其它表达式等,表达式求值就是将运算符应用到操作数并最终得出一个值的过程。字面量是源代码中的数字或字符串,表示一个指定类型的固定值。
整数字面量可以使用后缀标识类型,比如L
代表长整型,U
代表无符号整型等;此外还可以使用0x
前缀表示16进制数,0b
前缀表示2进制数。
int a = 236; // 整型
long b = 236L; // 长整型
uint c = 235U; // 无符号整型
ulong d = 236UL; // 无符号长整型
int e = 0xff; // 16进制整型
int f = 0b101011; // 2进制整型
字符字面量使用单引号包裹,\x
前缀表示16进制转义序列,\u
表示Unicode转义序列;字符串字面量使用双引号包裹,也支持使用16进制转义序列或是Unicode转义序列。
char a = 'd';
char b = '\x0061';
char c = '\u005a';
string str = "abc";
C#语言中,基本的赋值、算术、逻辑、比较、条件运算符用法和大多数类C语言都相同。
赋值运算符除了最基本的=
还有一系列带运算的复合赋值运算符。
= 赋值
*= 带运算的复合赋值
/= 带运算的复合赋值
%= 带运算的复合赋值
+= 带运算的复合赋值
-= 带运算的复合赋值
<<= 带运算的复合赋值
>>= 带运算的复合赋值
&= 带运算的复合赋值
^= 带运算的复合赋值
|= 带运算的复合赋值
+ 加
- 减
* 乘
/ 除
% 取余
++ 递增运算符
-- 递减运算符
& 按位与
| 按位或
^ 按位异或
~ 按位非
<< 左移
>> 右移
&& 与
|| 或
! 非
条件运算符是一个三元运算符,基于条件返回两个值中的一个。
?: 条件运算符
typeof
运算符返回一个System.Type
对象,Type
是一个表示类型的类对象,类似Java中的Class
。其中包含了类型、全限定名、父类类型、成员属性等重要信息。下面代码从一个类中获取了Type
对象,并打印了其全限定类名。
Type t = typeof(Program);
Console.WriteLine(t.FullName);
类似C++语言,C#允许定义运算符重载来操作自定义操作数,类和结构体都支持定义运算符重载,也支持类或结构体与一个其它类型的运算符重载。
下面例子代码中我们定义了一个篮子Basket
类,其中包含苹果数量appleNum
和香蕉数量bananaNum
,我们重载了运算符+
,使其支持Basket
对象直接相加。
using System;
namespace Gacfox.Demo.Demonet
{
public class Basket
{
public int AppleNum { get; set; } = 0;
public int BananaNum { get; set; } = 0;
public Basket() { }
public Basket(int appleNum, int bananaNum)
{
this.AppleNum = appleNum;
this.BananaNum = bananaNum;
}
public static Basket operator +(Basket b1, Basket b2)
{
return new Basket(b1.AppleNum + b2.AppleNum, b1.BananaNum + b2.BananaNum);
}
}
class Program
{
static void Main()
{
Basket b1 = new Basket(0, 3);
Basket b2 = new Basket(3, 0);
Basket b3 = b1 + b2;
Console.WriteLine("{0} {1}", b3.AppleNum, b3.BananaNum);
}
}
}
不过这里要注意,不是所有的运算符都支持重载;乱用运算符重载也可能严重降低代码的可读性。运算符重载这部分内容使用上的限制可以查阅MSDN相关的文档。