【一起来阅读《C#图解教程》吧】-- 表达式与运算符

整数字面量

  • 没有小数点
  • 带有可选的后缀
236//整型
236L//长整型
236U//无符号整型
236UL//无符号长整型

uint、ulong

实数字面量

f后缀为float 类型;d后缀为double类型

字符字面量

char c1 = 'd';//单个字符
char c2 = '\n';//简单转义序列

字符串字面量

  • 常规字符串:没什么好说的,string a = "Hello",类似这样

  • 逐字字符串

    • 有“@”作为前缀
    • 逐字字面量与常规字符串字面量区别在于转义字符串不会被求值。在双引号中间的所有内容,包括通常被认为是转义序列的内容,都被严格按字符串中列出的那样打印。也就是说如果在双引号之间的转义字符,将不再会被识别。
    • 逐字字面量的唯一例外是相邻的双引号组,它们被解释为单个双引号字符。

比较操作和相等性操作

对于大多数引用类型来说,比较它们的相等性时,将只比较它们的引用。

  • 浅比较:如果引用相等,也就是说,如果它们指向内存中相同对象,那么相等性比较为true,否则为false,即使内存中两个分离的对象在所有其他方面都完全相等。

image.png

  • 深比较:如果两个字符串有相同的长度和内容(区分大小写),那么相等性比较返回true,即使它们占用不同的内存区域 。

递增运算符和递减运算符

  • b = a++ 和 b = a--

a的值加1或减1并保存,但是返回给b的结果为递增或递减之前的旧值

  • b = ++a 和 b = --a

a的值加1或减1并保存,但是返回给b的结果为递增或递减之后的新值。
image.png

逻辑运算符

  • &:“位与” :产生两个操作数的按位与。仅当两个操作位都为1时结果位才是1
  • |: “位或”:产生两个操作数的按位或。只要任意一个操作位为1结果位就是1
  • ^: “位异或”:产生两个操作数的按位异或。仅当一个而不是两个操作数为1时结果位为1
  • ~:“位非”:操作数的每个为都取反。该操作得到的操作数的二进制反码(数字的反码是其二进制形式按位取反的结果。也就是说,每个0都变成1,每个1都变成0)

image.png

移位运算符

按位移位运算符向左或向右把位组移动指定数量个位置,空出的位用0或1填充

  • “<<”:表示左移,将数组左移给定数目个位置。位从左边移出并丢失。右边打开的位位置用0填充。
  • “>>”:表示右移,将数组右移给定数目个位置。位从右边移出并丢失。
  • 在移位有符号数时,底层表示法就很重要,因为把整数左移一位的结果与把它乘以2的结果相同。把它右移一位的结果和除以2相同。
  • 如果右移一个负数,最左边的位用0填充,这会产生一个错误的结果。最左边位置的0 标志一个正数。但这是不正确的,因为一个负数除以2不能得到一个正数 。为了适合这种情形,当操作数是有符号整数时,如果操作数最左边的位是1(标志一个负数),在左边移开的位位置用1而不是0填充。这保持了正确的二进制补码表示法。对于正数或无符号数,左边移开的位位置用0填充。

image.png

条件运算符

“?:”:表示基于条件的结果,返回两个值之一。

a = x < y ? 5 : 10;//表示如果x<y,则a为5,否则为10

用户定义的类型转换

可以为自己的类和结构定义隐式转换和显式转换。这允许把用户定义类型的对象转换成某个其他类型,反之亦然

隐式转换

使用声明隐式转换的语法如下。publi(和stat修饰符是所有用户定义的转换所必需的
image.png

   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,并且你在转换的时候需要显示的使用转换运算符
image.png
这里为了更易区分,使用了图片,代码没有多大变化,不过是从隐式转换成了显示,而对应的在转换的时候,应该要使用转换运算符了。

运算符重载

如果面对一个用户定义类型,运算符完全不知道如何处理它。运算符重载允许你定义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;
        }
    }

输出:
image.png

posted @   LemonInCup  阅读(80)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示