第六节 操作符详解

视频链接:刘铁猛老师的《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

posted @   不爱菠萝的菠萝君  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
主题色彩
点击右上角即可分享
微信分享提示