C#教程 - 运算符(Operator)
更新记录
转载请注明出处。
2022年9月12日 发布。
2022年9月10日 从笔记迁移到博客。
操作符(Operator)说明
在低级的指令系统中每一条指令都有一个操作符
表示该指令应进行什么性质的操作
在高级编程语言中操作符主要指运算符,结合操作数进行数值、逻辑运算
操作数
操作数是运算符作用于的实体
是表达式中的一个组成部分
它规定了指令中进行数字或逻辑运算的量
表达式是操作数与操作符的组合
主要操作数:
字面量
常量
变量
只读量
方法调用
元素访问
其他表达式
操作符分类(根据操作数数量)
一元运算符、二元运算符、三元运算符
一元运算符
+ 正号
- 负号
. 成员访问
++ 递减
-- 递增
! 取反
二元运算符
+ 加法
- 减法
* 乘法
/ 除法
% 求余
= 赋值
+= -= *= /= %= 复合表达式
三元运算符(TERNARY OPERATOR)(Conditional operator)
条件 ?结果1 :结果2
算术运算符(Arithmetic Operators)
注意:求余运算符支持浮点数,但要注意浮点数无法精确表示小数
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。
自增自减对int, uint, long, ulong, short, ushort, byte, and sbyte类在CLR有特殊的优化。
算术运算常见异常:
比较运算符(Relational Operators)
注意:在C#中数值不具有布尔意义
注意:引用类型的比较是比较的引用地址
注意:
string类型也是引用类型,但比较的是字符串,原因是类库中将其比较进行了重写
string比较区分大小写
委托类型比较时,与string类似,也是比较委托内容,而不是比较引用
Enum类型比较时,比较的是值
逻辑运算符(Logical Operators)
逻辑表达式注意短路(short-circuiting)问题
在与运算中,如果第一个条件不通过则不会进行第二个条件的运算
在或运算中,如果第一个条件通过则不会进行第二个条件的运算
位运算符(Bitwise Operators)
异或(Exclusive OR)
注意:位运算符不存在短路(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)
=
注意:
可以放在=左边的类型
变量(常量/只读量/本地变量)
属性
索引
事件
注意:+=和-=有个例外,在表示事件时,是映射到add和remove访问器
条件运算符
条件运算符与if.else比较:
条件运算符适合值二选一返回表达式的情景
if.else适合语句二选一的情景
转换溢出检测运算符
checked
注意:有溢出就抛出OverflowException
unchecked
注意:不检测溢出,丢失位也不会抛出异常
详情请看数据类型转换中的信息
typeof运算符
作用:获得类型的信息,获得参数的System.Type对象
注意:参数是类型,不是对象
返回值:返回值类型是System.Type
实例:
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)
建议:使用括号定义自己的优先级,而不是依赖语言定义的优先级
这样代码可读性更高,便于维护
结合性是指二元或多元运算符的运算顺序
结合性分为:右结合,左结合
除赋值运算符 和 条件运算符 是右结合,其他运算符都是左结合
本文来自博客园,作者:重庆熊猫,转载请注明原文链接:https://www.cnblogs.com/cqpanda/p/16677793.html