02010901 表达式和运算符

02010901 表达式和运算符

1. 比较运算符

  • 关系比较运算符和相对比较运算符用于比较它们的操作数并返回bool型值。与C和C++不同,C#中数字不具有布尔意义。

2. 比较操作和相等操作

图片链接丢失
左边a和b的引用相同返回true;右边引用不同,即使两个AClass对象的内容完全相同,任然返回false。
  • 对于大多数引用类型来说,比较它们的相等时,只比较它们的引用,这称为浅比较。

    • 如果引用相等,也就是说它们指向内存中相同的对象,那么想等下为true,否则为false。
  • string类型对象也是引用类型,但它的比较方式不同。比较字符串的相等性是,将比较它们的长度和内容(区分大小写),这称为深比较。

    • 如果两个字符串有相同的长度和内容(区分大小写),那么相等性返回true,即使它们占用不同的内存区域。
    • 委托也是引用类型,并且也是深比较。比较委托的想等性时,如果两个委托都是null,或两者的调用列表中有相同数目的成员,并且调用列表相匹配,那么比较返回true。

3. 运算符重载

3.1 运算符重载是什么
  • C#运算符被定义为使用预定义类型作为操作数来工作。如果面对一个用户定义类型,运算符完全不知道如何处理它。
  • 运算符重载允许你定义C#运算符应该如何操作自定义类型的操作数。
3.2 运算符重载的注意事项
  • 运算符重载只能用于类和结构。
  • 为类和结构重载一个运算符x,可以声明一个名称为operator的方法并实现它的行为(例如operator +和operator - 等)。
    • 一元运算符的重载方法带有一个单独的class或struct类型的参数。
    • 二元运算符的重载方法带有两个参数,其中至少有一个必须是class或struct类型。
public static LimitedInt operator - (LinmitedInt x) // 一元
public static LimitedInt operator + (LimitedInt x, double y) // 二元。

注意,运算符重载的方法声明需要以下条件:
1. 声明必须同时使用static和public修饰符。
2. 运算符必须是要操作的类或结构的成员。
  • 运算符重载基本格式
class LimitedInt Return
{
    public static LimitedInt operator + (LimitedInt x, double y) // @1
    {
        LimitedInt li = new LimitedInt();
        li.TheValue = x.TheValue + (int)y;
        return li;
    }
    
    public static LimitedInt operator - (LimitedInt x)
    {
        LimitedInt li = new LimitedInt();
        li.TheValue = 0; // 在这个LimitedInt类中,减值就是赋值为0。
        return li;
    }
}

注意,在@1处:
1. public static是必须的。
2. operator是关键字。
3. +是运算符。
4. LimitedInt x和double y是操作数,操作数必须有一个是class或struct类型。
  • 不是所有运算符都能被重载,本书后面章节会讨论。

4. typeof运算符

  • typeof运算符返回作为其参数的任何类型的System.Type对象。通过这个对象,可以了解类型的特征。
    • 对任何一直类型,只有一个System.Type对象。不能重载typeof运算符。
// typeof运算符语法示例
Type t = typeof(SomeClass); // Type是System命名空间中的一个类。
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// 使用typeof运算符获取SomeClass类的信息,并打印出它的供公有字段和方法的名称。
using System;
using System.Reflection; // 使用反射命名空间来全面利用检测类型信息的功能

namespace Demo01
{

    class SomeClass
    {
        public int Field1;
        public int Field2;

        public void Method1()
        {

        }

        public void Method2()
        {

        }
    }
    class Program
    {
        static void Main()
        {

            Type t = typeof(SomeClass);
            FieldInfo[] fi = t.GetFields();
            MethodInfo[] mi = t.GetMethods();

            foreach (FieldInfo f in fi)
                Console.WriteLine($"Field: {f.Name}");
            foreach (MethodInfo m in mi)
                Console.WriteLine($"Method: {m.Name}");

            Console.ReadLine();
        }
    }
}

控制台输出:
Field: Field1
Field: Field2
Method: Method1
Method: Method2
Method: Equals
Method: GetHashCode
Method: GetType
Method: ToString

5. GetType方法

  • GetType方法也会调用typeof运算符,该方法对么个类型的每个对象都有效。
// 使用GetType方法获取对象类型的名称
using System;

namespace Demo01
{

    class SomeClass
    {
    }
    class Program
    {
        static void Main()
        {
            SomeClass sm = new SomeClass();
            Console.WriteLine($"{sm.GetType().Name}");

            Console.ReadLine();
        }
    }
}

控制台输出:
SomeClass

6. nameof运算符

  • nameof运算符返回用来表示变量、类型或者成员的字符串。
  • nameof目前看不懂,后续再补充。

结尾

书籍:C#图解教程

著:【美】丹尼尔 · 索利斯;卡尔 · 施罗坦博尔

译:窦衍森;姚琪琳

ISBN:978-7-115-51918-4

版次:第5版

发行:人民邮电出版社

※敬请购买正版书籍,侵删请联系85863947@qq.com※

※本文章为看书或查阅资料而总结的笔记,仅供参考,如有错误请留言指正,谢谢!※

posted @ 2025-08-11 20:36  qinway  阅读(5)  评论(0)    收藏  举报