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)#
注意:位运算符不存在短路(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
版权:本作品采用「不论是否商业使用都不允许转载,否则按3元1字进行收取费用」许可协议进行许可。
本文来自博客园,作者:重庆熊猫,转载请注明原文链接:https://www.cnblogs.com/cqpanda/p/16677793.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人