重庆熊猫 Loading

C#教程 - 运算符(Operator)

更新记录
转载请注明出处。
2022年9月12日 发布。
2022年9月10日 从笔记迁移到博客。

操作符(Operator)说明

在低级的指令系统中每一条指令都有一个操作符

表示该指令应进行什么性质的操作

在高级编程语言中操作符主要指运算符,结合操作数进行数值、逻辑运算

操作数

操作数是运算符作用于的实体

是表达式中的一个组成部分

它规定了指令中进行数字或逻辑运算的量

表达式是操作数与操作符的组合

主要操作数:

​ 字面量

​ 常量

​ 变量

​ 只读量

​ 方法调用

​ 元素访问

​ 其他表达式

操作符分类(根据操作数数量)

一元运算符、二元运算符、三元运算符

一元运算符

+ 正号

- 负号

. 成员访问

++ 递减

-- 递增

! 取反

二元运算符

+ 加法

- 减法

* 乘法

/ 除法

% 求余

= 赋值

+= -= *= /= %= 复合表达式

三元运算符(TERNARY OPERATOR)(Conditional operator)

条件 ?结果1 :结果2

算术运算符(Arithmetic Operators)

image

image

注意:求余运算符支持浮点数,但要注意浮点数无法精确表示小数

Console.WriteLine(1.5F % 0.5F); //0
Console.WriteLine(1.5F % 0.2F); //0.09999

注意:The arithmetic operators (+, -, *, /, %) are defined for all numeric types except the 8- and 16-bit integral types。

image

自增自减对int, uint, long, ulong, short, ushort, byte, and sbyte类在CLR有特殊的优化。

image

算术运算常见异常:
image

比较运算符(Relational Operators)

image

注意:在C#中数值不具有布尔意义

注意:引用类型的比较是比较的引用地址
image

注意:

string类型也是引用类型,但比较的是字符串,原因是类库中将其比较进行了重写

string比较区分大小写

委托类型比较时,与string类似,也是比较委托内容,而不是比较引用

Enum类型比较时,比较的是值

逻辑运算符(Logical Operators)

image

逻辑表达式注意短路(short-circuiting)问题

在与运算中,如果第一个条件不通过则不会进行第二个条件的运算

在或运算中,如果第一个条件通过则不会进行第二个条件的运算

位运算符(Bitwise Operators)

异或(Exclusive OR)
image

image

注意:位运算符不存在短路(short-circuiting),而逻辑运算符存在短路

转换运算符

is operator

is

注意:无法用于用户自定义转换判断

注意:转换失败会抛出异常

is运算符内嵌变量(Introducing a pattern variable)

实例:

if (a is Stock s)
{
    Console.WriteLine (s.SharesOwned);
}

约等于:

Stock s;
if (a is Stock)
{
 s = (Stock) a;
 Console.WriteLine (s.SharesOwned);
}

实例:

if (a is Stock s && s.SharesOwned > 100000)
 Console.WriteLine ("Wealthy");

实例:

if (a is Stock s && s.SharesOwned > 100000)
    Console.WriteLine ("Wealthy");
else
    s = new Stock(); // s is in scope
Console.WriteLine (s.SharesOwned); // Still in scope

as operator

as

注意:只能转换引用类型或可以为null的类型

注意:无法用于用户自定义转换判断

实例:

赋值运算符(Assignment Operators)

=

注意:
​ 可以放在=左边的类型
​ 变量(常量/只读量/本地变量)
​ 属性
​ 索引
​ 事件

image

image

注意:+=和-=有个例外,在表示事件时,是映射到add和remove访问器

条件运算符

image

条件运算符与if.else比较:
条件运算符适合值二选一返回表达式的情景

​ if.else适合语句二选一的情景

转换溢出检测运算符

checked

注意:有溢出就抛出OverflowException

unchecked

注意:不检测溢出,丢失位也不会抛出异常

详情请看数据类型转换中的信息

typeof运算符

作用:获得类型的信息,获得参数的System.Type对象

注意:参数是类型,不是对象

返回值:返回值类型是System.Type

image

实例:

Type type = typeof(System.Random);

Null相关的运算符(Null Operators)

??空接合运算符(Null-Coalescing Operator)

第一个操作数是可空类型的变量

第二个操作数相同基础类型的不可空值

运算逻辑:

如果第一个操作数不是null,返回第一个操作数

如果第一个操作数为null,则返回第二个操作数

即:第一个操作数 == null ? 第二个操作数 : 第一个操作数

语法:

操作数1 ?? 操作数2

实例:

int? panda = null;
Console.WriteLine(panda ?? 666);  //666
panda = 888;
Console.WriteLine(panda ?? 666);  //888

?.运算符(Null-Conditional Operator)

空条件运算符

注意:C#6起可用

运算逻辑:如果参数是NULL,则直接返回NULL,而不再继续执行

语法:

obj?.Test();

提示:常用于触发事件

实例:

using System;

namespace Test
{
    class TestClass
    {
        public int Test()
        {
            Console.WriteLine("Test");
            return 1;
        }
    }
    class Panda
    {
        static void Main()
        {
            //实例化类型
            TestClass obj = new TestClass();
            //变量赋值为null
            obj = null;
            //?.运算符
            int? result = obj?.Test();
            Console.WriteLine(result);

            Console.ReadKey();
        }
    }
}

实例:同时使用?和??

var result = authorName?.Length ?? 3;
Console.WriteLine(result);

Null-Coalescing Assignment Operator (C# 8)

注意:C#8起可用

??= operator

s ??= "Hello, world";

等同于:

if (s == null) s = "Hello, world";

获得名称

nameof()

获得类型、实例、字段、属性、方法的名称,返回字符串

注意:C#6起可用

实例:

nameof (StringBuilder) + "." + nameof (StringBuilder.Length);
//StringBuilder.Length

实例:

using System;

namespace PandaNamespace
{
    class Program
    {
        public static void Main()
        {
            Console.WriteLine(nameof(abc));
            Console.WriteLine(nameof(abcd));
            Console.WriteLine(nameof(Panda));
            Console.ReadKey();
        }

        public void abcd()
        {

        }

        private int abc = 123;
    }

    class Panda
    {

    }
}

特殊操作符

new 操作符

new 操作符用于创建一个新的类型实例 或 覆盖父类成员

实例:覆盖父类成员

class PandaFather
{
    public string PandaProperty { get; set; }
    public string PandaMethod()
    {
        return "PandaFather";
    }
}

class PandaSon : PandaFather
{
    public new string PandaProperty { get; set; }
    public new string PandaMethod()
    {
        return "PandaSon";
    }
}

override操作符

override操作符用于 重写虚方法 或 实现抽象类的成员

实例:实现抽象类成员

public abstract class PandaAbstractClass
{
    public abstract string Method1();
    public abstract string Property { get; set; }
}
public class PandaClass : PandaAbstractClass
{
    public override string Property 
    { 
        get
        {
            return "Panda666";
        }
        set
        {
        }
    }
    public override string Method1()
    {
        return "Panda666";
    }
}

实例:重写虚方法

public class PandaFather
{
    public virtual string Method()
    {
        return "PandaFather";
    }
}

public class PandaSon: PandaFather
{
    public override string Method()
    {
        return base.Method();
    }
}

checked和unchecked 操作符

checked 和unchecked 操作符用于整型算术运算时控制当前环境中的溢出检查

unsafe

用于标记代码非安全,可以在标记代码中使用C/C++指针

//非安全代码块
unsafe
{
    //code
}
//非安全方法
unsafe int SomeMethod()
{

}
class TestClass
{
    //非安全成员变量
    unsafe int* pr;
}

注意:不可以声明非安全局部变量

优先级和结合性(Operator Precedence and Associativity)

建议:使用括号定义自己的优先级,而不是依赖语言定义的优先级

​ 这样代码可读性更高,便于维护

image

结合性是指二元或多元运算符的运算顺序

结合性分为:右结合,左结合

除赋值运算符 和 条件运算符 是右结合,其他运算符都是左结合
image

posted @ 2022-09-12 08:16  重庆熊猫  阅读(1402)  评论(0编辑  收藏  举报