C#笔记(更新中... )


工程

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方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值