1.【基础要点】
- 变量在使用前必须赋值
- 转义符
空字符 \0
回车换行 \r\n
Tap \t - Console.ReadLine()只录入string类型
string gunName = Console.ReadLine();
- 源代码(.cs)——CLS编译——中间语言(exe)——CLR编译——机器码0 1
目的:【跨语言】 目的:【优化 跨平台】
CLS:公共语言规范 CLR:s公共语言运行库 - 将内容缩小
#region 注释
内容
#endregion
- 随机数
// 放在方法外,类内
static Random random = new Random();
int number = random.Next(1, 101);
//【可取下限,不可取上限,左等又不等,1~100】
Console.WriteLine(number);
- 自动补全 --> for/while/do + 两下Tab
- Write和WriteLine的区别
//在一行显示
Console.Write("a");
//显示后换行
Console.WriteLine("a");
- 方法注释
/// <summary>
/// 加法运算
/// </summary>
/// <param name="number01">加数a</param>
/// <param name="number02">加数b</param>
/// <returns></returns>
private static int AddNumber(int number01,int number02)
{
return (number01 + number02);
}
- 代码简洁,减少嵌套层数,代码是要给别人看的
- 选取方法名,按右键(或f12)转到定义,可以查看方法位置
- 重命名变量
- var判断类型
Array 数组父类 声明父类赋值子类
object 万类之祖 任意类型 - 形参传父类 实参传子类
- 加两个断点 F5直接进入到下一个断点 F11逐行运行
- TryParse方法
- 垃圾回收器
2.【基础格式】
using System; //引入命名空间(Console在System里)
namespace ConsoleApp2 //定义命名空间【类的住址】
{
class Program //定义类【做工具】
{
static void Main(string[] args) //定义方法【做功能】
{
Console.WriteLine("Hello World!");
string a = Console.ReadLine();*
Console.WriteLine("hello "+a);
}
}
}
3.【快捷键】
- 自动对齐快捷键:Ctrl + K + F
- 调试
(1)在可能出错的行加断点(开始地方)
(2)F5 启动调试
(3)F11 逐语句执行
(4)shift + F5 停止调试 - 补全语法 方法名+两下Tab
4.【占位符{}】
int b = 20;
string a ="adc";
Console.WriteLine("This is {0},This is {1}",a,b);//(一般)
/*
【重要】
※ string b = string.Format("This is {0}", a);
【数字字符串格式化】
{0:d2} -> 05
{0:c} -> 羊10.00 {0:p} -> 10.00%
*/
5.【数据类型】
-
(1)整形 【int】
sbyte byte
short
int uint
long ulong -
(2)非整形 【float】 【浮点型要加后缀,a = 0.1f】
float f 【无法准确表示1/10,要用decimal】
double d
decimal m -
(3)非数值型
char
string
bool
6.【数据类型转换】
- (1)string --> 其他
【Parse转换】 【类型.Parse(string变量)】
string a = "18";
int b = int.Parse(a);
Console.WriteLine(b+1);
- (2)其他 --> string
【ToString转换】 【变量.ToString()】
int a = 18;
string b = a.ToString();
Console.WriteLine(b + "years");
- (3)隐式转换 小范围->大范围
byte b3 = 100;
int i3 = b3;
- (4)显示转换 大范围->小范围 【(转换类型)变量】
int i4 =300;
byte b4 = (byte)i4;
7.【语句结构】
- (1)【选择结构】
(1)【if】
if(条件){
语句
}
else if(条件){
语句
}
else{
语句
}
(2)【switch】【不能判断float类型】
switch(变量){
case 常数1:
语句;
break;
default
语句;
break;
}
多个case执行同一语句
case 常数1:
case 常数2:
case 常数3:
语句;
break;
- (2)【循环结构】
【for适合知道运行多少次】for(初始化;循环条件;增减变量){
循环体
}
【continue 结束本次循环,继续下次循环】
【while适合达到一定条件(不知道要运行多少次)】
【do while】
do{
循环体
}while(判断条件)
8.【短路逻辑】
9.【定义方法(函数)】【实现一个功能】
定义方法: 【方法名称首字母大写】
[访问修饰符][可选修饰符] 返回类型 方法名称(参数列表)
{
//方法体
return 结果;
}
private static int Plus(int a,int b)
{
return (a + b);
}
调用方法:
方法名称(参数)
int sum = Plus(1,2);
10.【方法重载】
- 定义:方法名称相同,参数列表不同
- 作用:在不同的条件下,解决同一类问题,让调用者仅仅记住1个方法
11.【递归】
方法内部又调用自身的过程
- 优势:将复杂的问题简单化
- 缺点:性能较差
- 注意:堆栈溢出
12.【数组】
- (1)声明和初始化
- (2)数组长度 a.Length
- 一键改数组名 选中变量 -> 右键重命名 -> 进行修改
- (3)方法返回数组 数据类型[] 方法名
- (4)初始值
①整形 0
②非整形 0.0
③char \0
④string null
⑤bool false
- (5)foreach 读取全部元素
- (6)声明 父类类型 赋值 子类对象Array
- (7)object万类之祖
- (8)常用方法及属性
- (9)交错数组
- (10)参数数组 params
- 【当数组容量会改变时用集合】
13.【2048核心算法】
上下移动对列操作,左右移动对行操作
- 定义去零方法(针对一位数组):将0元素移到末尾
- 合并数据方法(针对一位数组):
-去零
-相邻相同合并,将后一个加到前一个元素,后元素归零
-去零 - 上移
-从上往下取列数据,形成一维数组
-调用合并数据方法
-将以为数组元素 还原至原列 - 下移动
-从下往上取列数据,形成一维数组
-调用合并数据方法
-将以为数组元素 还原至原列 - 左移动
-从左往右取行元素,形成一维数组
-调用合并数据方法
-将以为数组元素 还原至原行
14.【数据类型分类】
- (1)值类型:存储数据本身 -> 占用空间较小的
–声明在栈中,数据存储在栈中 - (2)引用类型:存储数据的引用(内存地址) -> 占用空间较大的
–声明在栈中,数据存储在堆中 - 方法在栈中 --> 方法中声明的变量在栈中
- 内存: --CPU与其他外部存储器(硬盘)交换数据的桥梁
–用于存储正在执行的程序与数据,数据必须加载到内 存才能被CPU处理 - 分配:程序运行时,CLR将申请的内存空间从逻辑上进行划分
–栈区
-空间小,读取速度快
-用于存储正在执行的方法,存储方法的参数以及变量等数据,方法执行完毕后,对应的栈帧(分配的空间)将被清除
–堆区
-空间大,读取速度慢
-存储引用类型的数据 - 局部变量
–没有默认值,没有初始值不能使用
–方法被调用时,存在栈中,方法调用结束时从栈中消除
【以下都是局部变量的时候】
15.【参数】
- 值参数 传递信息
- 引用参数 改变数据
- 输出参数(可以返回多个结果) 返回结果
–方法内部必须赋值
–传递进方法内部前可以不赋值
16.【拆装箱】值类型 -> object -> 值类型
- 【对数据性能消耗其实不大,只是面试必须要知道】
- (1)装箱box
- (2)拆箱 unbox
- (3)避免拆装箱
- 方法的参数尽量别写object
- 赋值的时候避免拿值类型和字符串连接,建议ToString一下
- (3)ILspy查看拆装箱次数
-代码生成
-打开软件,将exe文件拖拽到ILspy
-找到对应代码部分,选择IL语言
17.【String】
- (1)字符串常量具备字符串池特性
目的:提高内存的利用率
- (2)字符串的不可变性
【原因】如果字符串大于要替换的字符串,会导致内存泄漏
- 可变字符串StringBuilder
- 用for和Tostring直接连接会产生大量的垃圾
【优点】避免产生垃圾,可在原有空间修改字符串
【适用性】频繁对字符串操作(增加 替换 移除)
【缺点】如果范围超过预定值,会产生垃圾
- (3)常用方法
18.【枚举】enum 增强代码可读性,限定取值
- (1)简单枚举
- (2)选择多个枚举值 | 【标准枚举】
- (3)数据类型转换
19.【类与对象】 类是一种数据类型【封装多个数据】
- (1)类的组成
①数据成员
②方法成员
- (2)创建类
this对象中的成员变量 - (3)创建对象
- (4)成员变量【类中方法外】
-具有默认值
-变量可以与局部变量重名
-存在堆中,对象回收时,成员变量清除
- (5)访问修饰符
①private 私有的
②public 公共的 - (6)字段和属性
【可对写入或读取进行限制】
【可实现只读或只写】
- (7)构造函数【创建对象的方式】【创建对象时自动调用】
- (8)常用写法
- (9)自动属性
prop + tab + tab
20.【继承】
- (1)选继承的原因:
1.有共同的成员(代码)(如图中的Name)
2.概念上是统一的
Teacher中的Name和Student中的Name一样,可以使用继承 - (2)语法
class 子类名:父类名
- (3)protected
- (4)【 类型 决定能调用什么】
【父子类型 强转用 as】
21.【Static】
- (1)静态成员变量
静态成员变量 属于 类
实例成员变量 属于 对象
特点:被所有对象共享(在静态区),常驻内存
- (2)静态构造函数 【不能出现访问修饰符】
- (3)静态方法 【不能访问实例成员】
- (4)静态类 【不能被继承】
- (5)适用性
【工具类用静态类做,使用时直接类.方法就可以,不需要创建对象然后调用方法】
22.【二维数组方法】
23.【二维数组工具类】
24.【结构体】【值类型】
比如一个物体的位置,会经常发生改变
引用类型需要改变时,会产生垃圾
而值类型直接改数据,
提高性能
【不能直接用自动属性,除非在构造函数里面加:this()】
25.【2048核心类】
- (1)把参数都去掉,提为成员变量,目的:避免每次移动,产生垃圾
26.【松散耦合MVC】
Model View Controller
数据
显示(界面代码)
逻辑控制