值类型和引用类型
- 值类型放在栈里,
- 引用类型数据放在堆里,引用放在栈里
- 引用类型对象的数据部分始终存放在堆里。值类型对象或引用类型的数据的引用部分可以放在堆里,也可以放在栈里。
变量
1.局部变量——堆或堆和栈
2.类字段——堆
3.结构字段——栈或堆
4. 参数——栈
5. 数组元素——堆
参数
值参数:实参的值复制给形参,在栈上为形参分配内存
引用参数:形参是实参的别名,指向相同内存位置。不在栈上为形参分配内存
输出参数:形参是实参的别名,与引用参数相似,但必须要在方法内进行赋值
参数数组:允许传递可变数目的实参到方法,参数的类型不同要求不同
以上属于位置参数
命名参数:增强可读性
可选参数:从后往前
ref
ref可以创建一个变量的别名,
ref方法可以返回变量而不是值
类
类成员:字段和方法
字段
实例字段:不影响其他实例成员
静态字段:被类的所有实例共享
分部类和分布方法(partial)
分部类:
- 分部类的声明含有类成员的声明
- 分部类的声明可以在同一个文件也可以不在
- 组成类的所有分部类必须在一起编译
- 分部类可以有非分部方法
分布方法:
1.可以有定义部分而没有实现部分,反之不行
2.分部方法是隐式私有的,不能从类的外部调用
基类和派生类
屏蔽基类的成员:使用new修饰符
屏蔽数据成员:声明相同类型的成员和名称
屏蔽函数成员:声明相同签名的函数成员
屏蔽静态成员
基类访问:访问被隐藏的继承成员,base.成员名
基类引用:强制转换的形式转换成基类,对派生类无法进行访问。
虚方法和覆写方法:将基类的引用访问升至派生类
要求:相同签名和名称,基类方法标记为virtual,派生类方法标记为override
属性
- 属性是一个函数成员set赋值,get获取值,不一定为数据储存分配内存,属性常与字段关联
- set:有一个单独的隐式的值参value与属性的类型相同,拥有一个返回类型void
- get:没有参数,拥有一个与属性类型相同的返回类型
索引器:
可认为是属性的复数版
set get访问修饰符:
常用范式:get;private set
1.当成员既有set也有get,访问器才能有访问修饰符
2.只能有一个有修饰符
3.修饰符限制比成员等级更严格(私密)
方法
构造函数(一种特别的方法)
构造函数:1.构造函数名称与类名相同
2.构造函数不能有返回值
3.构造函数可以带参数,可以被重载
实例构造函数:
1.用于初始化实例的状态
2.从外部创建类的实例,需将构造函数声明为public。
默认构造函数:
没有参数,方法体为空
静态构造函数:
1.类只能有一个
2.不能有访问修饰符,不能使用this访问器
3.不能显式调用,系统会在类的任何实例被创造之前和类的任何静态成员被引用之前自动调用
扩展方法:
- 作用:使得编写的方法和声明它的类之外的类关联,在类的实例自身上调用该方法
- 要求:声明扩展方法的类为static,扩展方法本身为static,扩展方法包含关键字this作为它的第一个参数类型
运算符重载:
1.作用:定义运算符操作自定义类型的操作数
2.作用范围:只能用于类和结构
3.要求:声明同时使用static和public,运算符必须是要操作类或结构的成员
4.限制:不能创建新运算符,不能改变运算符的语法,不能重新定义运算符如何处理预定义类型,不能改变运算符的优先级和结合性,
5.其他:后置操作引用类型有问题