目录
工程
solution和project
solution是最高级别,解决方案
project是解决某个具体的问题
解决方案包括多个具体的问题
简单的solution可能一个project,复杂的solution多个project
一个项目可以隶属于多个solution包含,这叫project的重用
快捷键:
Ctrl + .
:快速导入需要用到的包
Ctrl + 右花括号键
在快语句开头结尾跳转
```propfull + tab + tab``生成声明属性的完整代码
引用实例
引用变量引用实例
.
:成员访问操作符
栈
局部变量内存的分配,发生函数调用时才会使用栈
比较小,M
程序算法没写好,函数调用过多,或者程序错误,分配太多内存 StackOverflow 栈溢出
堆
存放实例(对象)
好多G
C#会自动回收不用的内存(C++分配内存之后如果忘记手动回收旧真的内存泄漏了)
C#数据类型:
常用:Class、Struct、enum(枚举)
所有类型都以object为基类型
引用类型变量在内存中分配四个字节的内存大小
Boxing、UnBoxing
装箱:从栈上往堆上搬东西,肯定会损耗性能。
拆箱:
方法的声明语法与调用
非静态方法和隶属于实例,静态函数的使用和类绑定。
parameter形参,声明变量。argument实参,调用方法时的真实条件。parameter是变量,argument是值,值和变量一定要匹配
构造器如果不声明定义,会有默认的构造器。创建实例时()就会自动调用构造器。构造函数不需要返回值类型,因为它不像方法和函数需要返回一个值。
ctor 再按两次tab键,自动创建构造器
栈从高地址往低地址分配,直到栈顶溢出
默认构造器
代码:
计算机内部实现:
局部变量(stu)是在栈分配内存,等待返回堆的地址
等new开始执行,就去堆找一块可用空间分配实例所需要的内存
分完实例,调用构造器,切割(int、string),初始化
再将内存地址赋值给stu,stu存的就是实例地址
自定义构造器
代码:
计算机内部实现:
操作符
优先级
委托
自己不直接去做,而是通过委托让别人间接去做
元素访问操作符 [ ]
访问字典,[ ]里面放的是索引
++、–
后置++、–遇上赋值,先赋值再++或–
typeof
default
获取一个类型的默认值
这里介绍三种类型
值类型:结构体类型和枚举类型
结构体类型
默认值是0
枚举类型
引用类型
new
new也是一个操作符
创建一个实例,并立马调用实例的实例构造器
先介绍一个关键字 var
作用:声明隐式类型变量
例如,
int x; //显示类型变量
声明x的时候明确告诉了编译器x变量的数据类型
var x; //隐式变量
隐式变量在赋值的时候自动确认是属于什么数据类型,编译器推断
赋值之后就确定类型了,就不能再转化类型了
继续new…
1、创建实例
new Form
2、调用实例构造器
()
3、这样就在内存中创建了一个实例(对象),并调用了默认的实例构造器
new Form();
此时,如果什么都不干,过一会这个实例就会被C#机制里的垃圾收集器回收
4、定义一个同类型的引用变量来引用这个实例
Form myForm
Form myForm = new Form();
总结:new能在内存里创建实例,并调用实例的实例构造器,获得实例的地址,再将这个实例的地址用赋值方式赋值给一个引用变量,例如上面的myForm。有了这个引用变量就可以通过变量访问实例。
除此之外,new还能调用实例的初始化器 { }
new作为关键字
checked、unchecked
C#是强数据类型,每个变量都有自己的数据类型
数据类型标识变量在内存中占多大的空间,一个值在内存中多占的空间决定了这个值能表达的范围
一旦超出这个范围就表示产生了溢出
checked是检查有没有溢出,unchecked是不用检查有没有溢出
上下文用法:
delegate
声明委托数据类型
当做操作符时,(已经有可以取代delegate作为操作符作用的技术了)
->
这个操作符直接操作内存,必须放在不安全的上下文
C#中,指针和取地址只能操作结构体
. and ->
先记住,指针用箭头,对象用点
委托详解
什么事是委托delegate?
函数指针
typeof int (* func)(int a, int b); 声明了函数指针类型,可以定义函数指针,通过函数指针调用函数
委托代码
直接调用和间接调用的结果
委托是一种类
委托和类是同级,如果将委托写在类的内部,就变成了嵌套委托类
委托封装了一种方法,通过使用委托动态调用方法
接口接口可以取代委托
事件
事件的声明
internal 加在类前面的关键字,限制了其他类对internal类的访问权限,限制范围是assembly(装配集:一个项目或解决方案资源管理器)
internal是把访问级别限制在了同一个装配集内
private是把访问级别限制在类体内,而类里的方法访问级别默认是private,这是因为要保证数据的安全性。
protected把访问级别限制在继承链上
类的继承
父类类型的变量可以引用子类的实例
一个类最多可以有一个基类,但可以有多个基接口
子类实例初始化时,会先调用父类构造器,然后再调用子类构造器。
如果父类构造器实例化,那么子类也要变化,因为子类不能继承父类的实例构造器,只能继承默认构造器。
类的访问级别是以类成员的访问级别为上限的。如果类被internal修饰,那类里的成员是不能被其他装配集里的类访问到的。
重写、多态
多态基于重写
紧耦合
解耦合
纯虚方法:接口方法
抽象方法:没有被完全实现
接口方法无论生成其他什么方法,都是用public修饰
从abstract方法到virtual方法或者实现方法,都是用override修饰
从virtual方法到override方法也要用override修饰
反射、依赖注入
.NET框架提供了反射
lambda
匿名方式
inline方法