第六节 操作符详解

发布时间 2023-06-08 08:23:52作者: 不爱菠萝的菠萝君

视频链接:刘铁猛老师的《C#语言入门详解》
https://www.youtube.com/watch?v=EgIbwCnQ680&list=PLZX6sKChTg8GQxnABqxYGX2zLs4Hfa4Ca

操作符概览

image.png

操作符的本质

image.png

class Program{
	static void Main(string[] args){
        int x=3;
        int y=4;
        int z=x/y;
        Console.WriteLine(z);// 0

        double a=3.0;
        double b=4.0;
        double c=a/b;
        Console.WriteLine(c);// 0.75
    }
}

自定义操作符运算 运算符重载

// 正常定义方法
internal class Program {
    static void Main(string[] args) {
        Person farther = new Person();
        farther.Name = "father";
        Person momther = new Person();
        momther.Name = "momther";
        List<Person> home = Person.GetMarray(farther, momther);
        foreach (Person homeItem in home) {
            Console.WriteLine(homeItem.Name);
        }
    }
}

class Person {
    public string Name;

    public static List<Person> GetMarray(Person p1, Person p2) {
        List<Person> people = new List<Person>();
        people.Add(p1);
        people.Add(p2);

        for (int i = 0; i < 11; i++) {
            Person child = new Person();
            child.Name = "child" + i.ToString();
            people.Add(child);
        }

        return people;
    }
}

// 自定义运算符操作
internal class Program {
    static void Main(string[] args) {
        Person farther = new Person();
        farther.Name = "father";
        Person momther = new Person();
        momther.Name = "momther";
        List<Person> home = farther + momther;
        foreach (Person homeItem in home) {
            Console.WriteLine(homeItem.Name);
        }
    }
}

class Person {
    public string Name;

    public static List<Person> operator +(Person p1, Person p2) {
        List<Person> people = new List<Person>();
        people.Add(p1);
        people.Add(p2);

        for (int i = 0; i < 11; i++) {
            Person child = new Person();
            child.Name = "child" + i.ToString();
            people.Add(child);
        }

        return people;
    }
}
// 二者运行结果都一样

image.png

优先级与运算顺序

image.png

基本操作符、关键字的作用

typeof

  • 查看某个类型的元数据(记录关于这个类的命名空间,名称,父名称,方法名称个数等信息)

image.png

default

  • 帮助我们去获取一个类型的默认值
  • image.png

new

  • 在内存中帮助我们创建一个内存中的实例,并且立刻调用这个实例的实例构造器 new Form();

  • 还可以把该实例的内存位置 告诉通过赋值符号 交给引用这个实例的引用变量 Form f=new Form();

  • 给匿名类型创建对象 var person= new {Name="Mr.Wang",Age=20}; {}是初始化构造器image.png

  • new 作为关键字使用,这里的作用是将父类的Report方法给隐藏了

image.png

checked和unchecked

  • 检查值是否有溢出image.png
  • checked 检查溢出 :输出 There's overflow!
    • image.png
  • unchecked 不检查溢出:输出 0
    • image.png
  • 作为关键字上下文用法image.pngimage.png

delegate作为操作符使用(已被lambda表达式取代)

  • image.png
  • image.png

sizeof

  • 获得一个对象在内存中所占用的字节数(一个字节8位)
  • 默认情况下,只能是基本数据类型,排除string和object,也就是结构体型的基本数据类型image.png
  • 非默认情况下,可以去获取自定义的结构体性的数据类型,但是需要放到不安全的上下文中image.png
    - 注意这里要使用unsafe,还需要在vs上设置
    - 并且这里x打印的大小不是4+8=12,还是16(高级部分)

->

  • 必须要放到不安全的上下文中(unsafe)
  • C#规定 指针操作,取地址操作,运用指针访问成员操作 只能去操作结构体类型,不能操作引用类型image.png

一元操作符

pStu &stu(指针、取地址引用&)

  • image.png

(T)x 强制类型转换

类型转换

隐式(implicit)类型转换

  • 不丢失精度的转换
    • image.png
  • 子类向父类的转换
    • image.png
    • image.png
  • 装箱

显式(explicit)类型转换

  • (T)x :有可能丢失精度(甚至发生错误)的转换,即cast(铸造的意思)
    • image.png
    • image.png
  • 拆箱
  • 使用Convert类
  • ToString方法与各数据类型的Parse/TryParse方法

自定义类型转换操作符

  • 示例1(显示类型操作符explicit
    • image.png
  • 示例2(隐式类型操作符implicit
    • image.png

类型检查操作符

is

  • 检验一个对象引用的实例(赋值符号后面的new)是不是某个类型的对象
    • image.png
    • image.png
    • 测试:
    • image.png
    • image.png
    • image.png

as

  • 如果是,就转换
    • image.png
    • image.png
    • 测试:(as对比is,一样的效果)
    • image.png
    • image.png

逻辑、条件操作

逻辑“与”&

示例:
image.png
image.png

逻辑“或”|

示例:
image.png
image.png

逻辑“异或”^

示例:
image.png
image.png

条件AND &&

image.png

条件OR ||

image.png

null操作符

可空修饰符 ?

让值类型的对象可以赋值为null
image.png
image.png

合并修饰符 ??

image.png
如果x为null,y取1

三元操作符 ? :

image.png