【一起来阅读《C#图解教程》吧】-- 表达式与运算符
整数字面量
- 没有小数点
- 带有可选的后缀
236//整型
236L//长整型
236U//无符号整型
236UL//无符号长整型
uint、ulong
实数字面量
f后缀为float 类型;d后缀为double类型
字符字面量
char c1 = 'd';//单个字符
char c2 = '\n';//简单转义序列
字符串字面量
-
常规字符串:没什么好说的,string a = "Hello",类似这样
-
逐字字符串
- 有“@”作为前缀
- 逐字字面量与常规字符串字面量区别在于转义字符串不会被求值。在双引号中间的所有内容,包括通常被认为是转义序列的内容,都被严格按字符串中列出的那样打印。也就是说如果在双引号之间的转义字符,将不再会被识别。
- 逐字字面量的唯一例外是相邻的双引号组,它们被解释为单个双引号字符。
比较操作和相等性操作
对于大多数引用类型来说,比较它们的相等性时,将只比较它们的引用。
- 浅比较:如果引用相等,也就是说,如果它们指向内存中相同对象,那么相等性比较为true,否则为false,即使内存中两个分离的对象在所有其他方面都完全相等。
- 深比较:如果两个字符串有相同的长度和内容(区分大小写),那么相等性比较返回true,即使它们占用不同的内存区域 。
递增运算符和递减运算符
- b = a++ 和 b = a--
a的值加1或减1并保存,但是返回给b的结果为递增或递减之前的旧值
- b = ++a 和 b = --a
a的值加1或减1并保存,但是返回给b的结果为递增或递减之后的新值。
逻辑运算符
- &:“位与” :产生两个操作数的按位与。仅当两个操作位都为1时结果位才是1
- |: “位或”:产生两个操作数的按位或。只要任意一个操作位为1结果位就是1
- ^: “位异或”:产生两个操作数的按位异或。仅当一个而不是两个操作数为1时结果位为1
- ~:“位非”:操作数的每个为都取反。该操作得到的操作数的二进制反码(数字的反码是其二进制形式按位取反的结果。也就是说,每个0都变成1,每个1都变成0)
移位运算符
按位移位运算符向左或向右把位组移动指定数量个位置,空出的位用0或1填充
- “<<”:表示左移,将数组左移给定数目个位置。位从左边移出并丢失。右边打开的位位置用0填充。
- “>>”:表示右移,将数组右移给定数目个位置。位从右边移出并丢失。
- 在移位有符号数时,底层表示法就很重要,因为把整数左移一位的结果与把它乘以2的结果相同。把它右移一位的结果和除以2相同。
- 如果右移一个负数,最左边的位用0填充,这会产生一个错误的结果。最左边位置的0 标志一个正数。但这是不正确的,因为一个负数除以2不能得到一个正数 。为了适合这种情形,当操作数是有符号整数时,如果操作数最左边的位是1(标志一个负数),在左边移开的位位置用1而不是0填充。这保持了正确的二进制补码表示法。对于正数或无符号数,左边移开的位位置用0填充。
条件运算符
“?:”:表示基于条件的结果,返回两个值之一。
a = x < y ? 5 : 10;//表示如果x<y,则a为5,否则为10
用户定义的类型转换
可以为自己的类和结构定义隐式转换和显式转换。这允许把用户定义类型的对象转换成某个其他类型,反之亦然
隐式转换
使用声明隐式转换的语法如下。publi(和stat修饰符是所有用户定义的转换所必需的
class Program
{
static void Main(string[] args)
{
LimitedInt li = 500;
int value = li;
Console.WriteLine("li:{0},value:{1}",li.TheValue,value);
while (true)
{
}
}
}
class LimitedInt
{
private const int MaxValue = 100;
private const int MinValue = 0;
private int theValue = 0;
public int TheValue
{
get { return theValue; }
set
{
if (value < MinValue)
{
theValue = 0;
}
else
{
theValue = value > MaxValue ? MaxValue : value;
}
}
}
public static implicit operator int(LimitedInt li)
{
return li.TheValue;
}
public static implicit operator LimitedInt(int x)
{
LimitedInt li = new LimitedInt();
li.TheValue = x;
return li;
}
}
以上输出为:li:100,value:100
显示转换
区别于隐式转换,显示转换使用字符explicit,并且你在转换的时候需要显示的使用转换运算符
这里为了更易区分,使用了图片,代码没有多大变化,不过是从隐式转换成了显示,而对应的在转换的时候,应该要使用转换运算符了。
运算符重载
如果面对一个用户定义类型,运算符完全不知道如何处理它。运算符重载允许你定义c#运算符应该如何操作自定义类型的操作数。
- 运算符重载只能用于类和结构。
- 为类或结构重载一个运算符x,可以声明一个名称为operator x的方法并实现它的行为(例如:operator +和operator -等)。
- 一元运算符的重载方法带一个单独的class或struct类型的参数 。
- 二元运算符的重载方法带两个参数,其中至少有一个必须是class或struct类型。
- 运算符重载的方法声明需要:
- 声明必须同时使用static和publc的修饰符。
- 运算符必须是要操作的类或结构的成员。
public static LimitedInt operator +(LimitedInt x, double y)
{
LimitedInt li = new LimitedInt();
li.TheValue = x.TheValue + (int) y;
return li;
}
以上为重载加法运算符的示例。
typeof 运算符
typeof运算符返回作为其参数的任何类型的System.Type对象。通过这个对象,可以了解类型的特征。不能重载typeof 运算符。
typeof 运算符为一元运算符
示例代码
class Program
{
static void Main(string[] args)
{
Type t = typeof(SomeClass);
FieldInfo[] fi = t.GetFields();
MethodInfo[] mi = t.GetMethods();
foreach (var f in fi)
{
Console.WriteLine("Field: {0}",f.Name);
}
foreach (var m in mi)
{
Console.WriteLine("Mthod: {0}", m.Name);
}
while (true)
{
}
}
}
class SomeClass
{
public int A;
public string B;
public void Add() { }
public int GeNum()
{
return 1;
}
}
输出:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)