表达式和运算符

这篇笔记我们简单介绍下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 运算符

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相关的文档。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap