第六节 操作符详解
视频链接:刘铁猛老师的《C#语言入门详解》
https://www.youtube.com/watch?v=EgIbwCnQ680&list=PLZX6sKChTg8GQxnABqxYGX2zLs4Hfa4Ca
操作符概览
操作符的本质
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;
}
}
// 二者运行结果都一样
优先级与运算顺序
基本操作符、关键字的作用
typeof
- 查看某个类型的元数据(记录关于这个类的命名空间,名称,父名称,方法名称个数等信息)
default
- 帮助我们去获取一个类型的默认值
new
-
在内存中帮助我们创建一个内存中的实例,并且立刻调用这个实例的实例构造器 new Form();
-
还可以把该实例的内存位置 告诉通过赋值符号 交给引用这个实例的引用变量 Form f=new Form();
-
给匿名类型创建对象 var person= new {Name="Mr.Wang",Age=20}; {}是初始化构造器
-
new 作为关键字使用,这里的作用是将父类的Report方法给隐藏了
checked和unchecked
- 检查值是否有溢出
- checked 检查溢出 :输出 There's overflow!
- unchecked 不检查溢出:输出 0
- 作为关键字上下文用法
delegate作为操作符使用(已被lambda表达式取代)
sizeof
- 获得一个对象在内存中所占用的字节数(一个字节8位)
- 默认情况下,只能是基本数据类型,排除string和object,也就是结构体型的基本数据类型
- 非默认情况下,可以去获取自定义的结构体性的数据类型,但是需要放到不安全的上下文中
- 注意这里要使用unsafe,还需要在vs上设置
- 并且这里x打印的大小不是4+8=12,还是16(高级部分)
->
- 必须要放到不安全的上下文中(unsafe)
- C#规定 指针操作,取地址操作,运用指针访问成员操作 只能去操作结构体类型,不能操作引用类型
一元操作符
pStu &stu(指针、取地址引用&)
(T)x 强制类型转换
类型转换
隐式(implicit)类型转换
- 不丢失精度的转换
- 子类向父类的转换
- 装箱
显式(explicit)类型转换
- (T)x :有可能丢失精度(甚至发生错误)的转换,即cast(铸造的意思)
- 拆箱
- 使用Convert类
- ToString方法与各数据类型的Parse/TryParse方法
自定义类型转换操作符
- 示例1(显示类型操作符explicit)
- 示例2(隐式类型操作符implicit)
类型检查操作符
is
- 检验一个对象引用的实例(赋值符号后面的new)是不是某个类型的对象
- 类
- 测试:
as
- 如果是,就转换
- 类
- 测试:(as对比is,一样的效果)
逻辑、条件操作
逻辑“与”&
示例:
逻辑“或”|
示例:
逻辑“异或”^
示例:
条件AND &&
条件OR ||
null操作符
可空修饰符 ?
让值类型的对象可以赋值为null
合并修饰符 ??
如果x为null,y取1