C语言/C#的区别
C语言是面向过程语言 (1+1=2固定的)
C#是面向对象语言 (a+b=c可以随便赋值)
面对对象的思想:封装,多态,继承
1…NET简介
是一种多语言开发平台,用于构建和运行应用程序。
(类似于咱们学校)
2. .NET Framework包含一个非常大的代码,可以在客户语言(如C#)中通用面向对象编程技术(oop)来使用这些代码。
01 CLS 公共语言规范 输入的脚本程序
02 CIL 通用中间语言 工厂加工转换成01010计算机语言
03 CLR 公共语言运行库 开辟空间,回收内存。善后
编译运行过程:源代码→(CLS编译)→CIL(通用中间语言)→(CLR编译)→机器码
计算机语言: 01
二进制:0 1
十进制:阿拉伯数字
十六进制:0 1 2 3 4 5 6 7 8 9 A B C D E F
二进制→十进制 从右往左
十进制→二进制
二进制→十六进制
十六进制→二进制
十进制→二进制→十六进
0:0000 1:0001 2:0010 3:0011
4:0100 5:0101 6:0110 7:0111
8:1000 9:1001 A:1010 B:1011
C:1100 D:1101 E:1110 F:1111
2018.12.10
C# 语言 C-Sharp
C#是一种安全的,稳定的,简单的,优雅的,由C和C++衍生出来的面向对象编程语言。
一个C#的程序主要包括以下部分:
命名空间声明
一个Class类
Class方法
Class属性
一个Main方法
语句&表达式
注释
如何显示行号:工具→文本编辑器→C#→在行号前面打√
注释:// 注释后面的内容仅供说明使用不参与代码编译
如何全选注释:Ctrl+k Ctrl+c
解除注释:Ctrl+k Ctrl+u
Class:用于定义类的关键字
Program:这是类的名称。类是创建对象的蓝图或模板,它可以有数据成员和方法。
Static:是一个关键字,意味着对象不需要访问动态成员,所以可以节省内存
Void:方法的返回类型,它没有任何返回值。不需要使用return语句。
Main:是方法名称
String[]args:用于C#中的命令行参数
hello world:输出内容
System:引用头文件。
Console.WriteLine :输出
CW+双击Tab(自动换行)
Console Write()(不会自动换行)
Console.ReadKey()这行是暂停的意思,按下任意键退出
变量定义
内存-程序运行的环境?
数据-程序处理的是什么?
变量:内存中开辟一块用于存储数据的空间,是内存中所占的位置,其值可以更改,可以重复使用多次。
int 整数类型 在计算机中所占内存为4字节。
bit 比特 电脑记忆体中最小的单位,每一位代表0/1
Byte 字节 电脑存储中最小的单位
1Byte=8bit 1KB=1024Byte 1MB=1024KB 1G=1024MB 1T=1024G
float 小数类型 单精度浮点数 所占字节数4
double小数类型 双精度浮点数 所占字节数8
char:字符类型 所占字节数2 ‘a’
string 字符串 存储文本 符号是“hello world”
声明变量的规则
1.一个变量可以有字母,数字或者下划线组成
2.变量名称只能以字母或者下划线开头,不能以数字开头
3.变量名称不允许有空格
4.变量名称不能有任何的关键字或者保留字命名
变量的语法:变量的赋值
int a=10,b=5, C=1;
注意事项“局部变量在使用前必须赋值”,赋值的数据类型和变量的声明时的类型必须相同,同一个变量名只能声明一次,但可以多次赋值。
数据的基本运算:
1.赋值运算符
2.算数运算符 + - * / %
3.比较运算符> < = != ==等于 =赋值
4.逻辑运算符bool 值true false
&&与 ||或 !非
与 两个都满足为真 ,一个为假都为假
或 一个为真即为真
非 取反 真为假 假为真
一、与
条件1 条件2 结果
真 真 真
真 假 假
假 真 假
假 假 假
二、或
条件1 条件2 结果
真 真 真
真 假 真
假 真 真
假 假 假
三、非
条件 结果
真 假
假 真
5.快捷运算符
一个变量与另一个变量做算数运算后的结果在赋值给该变量
+= -= *= /= %=
6.一元运算符
一元运算符
自增++ 自减–是变量自身加一或者减一
++i i++本身都是自身+1,在赋值时是有区别的
a=++i前缀加一 先自增后赋值 结果为新值
b=i++ 后缀加一 先赋值后自增 结果为旧值0
7.三元运算符
具有三个操作数的运算符
结构为 数据类型 变量名=条件? 结果1:结果2:
2018.12.3
基本类型转换:类型转换可将一种类型的数据转换为另一种类型,它也被称为类型塑造声明变量后,类型是固定的,只能赋予某种类型的数值,
如果要赋值其他类型的数据就需要将其他类型转换为该类型
在C#中有两种类型转换:隐式转换 显示转换
隐式转换:即数据类型的转换由编译器自动进行,不需要人工干预的数据转换。
显示转换:与隐式转换相反的类型转换,即需要人工干预的数据转换。
小数类型转整数类型,采用去一法。float1.7=int 1 去掉后边所有小数
1.float double==int(int)
2.string ==int int.parse();
3.int ==string .Tostring();
2018.12.24
语句
代码块:在程序中可以使用一对大括号框柱一部分代码,被框住的代码区域称之为代码块。
作用域:可以理解为起作用的范围。
选择语句:if*****(语句一)else(语句二)**
如果 满足执行语句一 不满足的话执行语句二
if elseif else
if(满足表达式一)执行语句一
elseif(满足表达式二)执行语句二
*******此处可以有N个elseif
else(如果上述条件都不满足,则执行表达式)else语句
注意事项:
1.else 可有可无
2.每个else总属于前面最近的语句
3.单行语句可以不写大括号
switch case
概念:
计算表达式并对照多个数值分支到不同的代码块。
1.switch ()括号中可以是int string bool char 枚举
2.每个case标签后市常量表达式,不能相同
3.default:表示其余的意思,不满足所有Case
switch case和if else的区别
1.if else实现两路,三路分支比较方便,
switch case实现三路以上分支结构更清晰,让代码可读性更强。
因为case语句后面必须是定值,所以不是合作范围类的判断。
break:语句作用在case和case之间中断程序。
循环语句
1.for循环
for:对特定的条件进行判断,满足则执行循环体,不满足则退出循环,用于将某个语句或者语句块重复执行预定次数。
语法(初始值;取值范围;循环变量)
{
循环体
}
++i和i++计算结果是一样的,但是++i不需要中间变量接收,消耗时间短。
i++需要临时变量接收,耗时间。
2018.12.25
while语句
条件表达式true则执行循环体,用于次数不确定的情形
语法:
while(bool表达式)
{
循环体;
}
{0}在C#当中称为占位符
占位符就是先固定一个位置,然后再往里赋值。
默认从0开始。
注意:1.占位符无顺序要求
2.占位符编号不能超过总数-1
do while语句
执行语句块中的语句,直到条件表达式为false
与while的区别:
while语句先判断条件,满足时执行循环体
do while语句先执行循环体,满足条件在继续执行
跳转语句
用于将控制转移给另一段代码
常用的有:continue语句 break语句 return语句
continue:退出本次循环,执行下次循环
break:退出最近的循环体(不会继续执行),或switch语句
return:用于指定函数的返回值,return语句只能出现在函数体内,出现在代码中的任何地方都会出现语法错误
goto:可以循环到指定的位置
格式 起个名字:
goto:该名字;
视图->解决方案资源管理器->右键->在文件夹当中显示->bin->Debug->应用程序
2018.12.26
什么是方法
方法:就是对一系列语句的命名,表示一个功能或者行为使用方法可以提高代码的可重用性和可维护性。
访问修饰符:public(公有的) private(私有的) protected(受保护的)
总结:1.一个命名空间下可以有N个类 class+类名
2.方法书写格式 访问修饰符 返回类型 方法名(参数列表)
3.return返回结果
4.在其他类里面调用此类的话需要先实例化
类名 a=new类名()
返回值的类型
返回值:方法定义者告诉调用者的结果
如果方法有返回值,方法体中必须有return语句,且返回的数据与返回值类型必须兼容。
void代表无返回值类型,方法中的return可有可无
return后面的语句将不再执行
调用方法时,如果需要结果,声明相应类型的变量接收返回值数据。
参数:方法定义者需要调用传递的信息
定义方法时传递的参数叫形式参数,简称形参
调用方法时传递的参数叫实际参数,简称实参
实参与形参要一一对应(类型,数量,顺序)
值参数
默认位置参数,调用方法时复制实参变量所存储的内容。
作用:传递数据 语法(数据类型 参数名)
引用参数:使用ref关键字修饰
调用方法时赋值实参变量在栈中的引用。
作用:改变数据
语法:…(ref 数据类型 参数名)
栈:是一种受限的线性表。栈表里面的元素成员是先进后出。
输出参数
使用out 关键字修饰
调用方法时复制实参在栈中的引用
作用:返回结果
语法:…(out 数据类型 参数名)
与引用参数的区别:
ref要求实参必须在传递前进行赋值
out要求形参离开方法前必须赋值
2018.12.27
数组的含义
数组是一种存储相同类型元素的固定大小顺序集合,数组用于存储数据集合,但一般会将数组视为存储在连续存储器位置的相同类型的变量的集合
*****是一种空间连续的数据结构
***通过索引来操作数组中元素
定义数组:
语法:
声明数组:数据类型[ ]数组名;
初始化数组:
数组名=new 数据类型[ ];
初始化后内存中存储该数据类型的默认值为
整型为 0
非整形为 0.0
char为\0
string为 null
bool为false
将数组变量为初始化时可以为数组指定值
可以在数组初始化时对元素进行赋值
语法:
数据类型[ ]数组名=new 数据类型[ ]{元素1,元素2}
可以将数组变量复制到另一个目标数组变量中,在这种情况下,目标和源都指向形同的内存位置
声明加赋值
可以在数组声明时进行赋值
语法:数据类型[ ]数组名={元素1,};
int[ ]array={1,2,3,4,5};
元素个数即为数组的长度
程序员可以省略初始化,但编译器内部仍然会“new数据类型[ ]”
下标越界 索引 遍历
访问数组元素
1.可以通过for循环遍历,数组长度可以用 数组.Length求出
2.foreach是一种更简单明了的读取元素的语句。
局限性:
1.只能读取全部元素,不能修改元素。
格式:foreach(元素类型 变量名 in 数组名)
{
变量名表示数组中的每个元素;
}
多维数组
具有两个或多个索引的数组
语法:
声明+初始化
数据类型[,]数组名=new 数据类型[行数,列数];
初始化+赋值
数组名=new 数据类型[,]{{元素1,元素2},{元素3,元素4}};
int[,]array=new int[,]{{1,2}{3,4}};
读写元素
数组名[行索引,列索引]
array.GetLength(0)获取行数
array.GetLength(1)获取列数
交错数组
元素为数组的数组,每个元素都是一个新的一维数组
语法
定义:数组类型[ ][ ]数组名=new 数据类型[元素个数][];
string[ ][ ]array=new string[3][ ];
赋值
数组名[0]=new string[2];
读写元素 数组名[元素索引][子元素索引]
参数数组
2018.12.28
类型分布
通用类型系统CTS是.NET框架中的一个组成部分,为所有面向.NET框架的语言定义了数据类型的规则
内存分布
内存:是CPU与其他外部存储器交换数据的桥梁
用于存储正在执行的程序与数据及数据必须加载到内存才能被CPU处理
CLR:公共语言运行库
内存分配
分配:程序运行时,CLR将申请的内存空间从逻辑上进行划分
C#的类型和对象在应用计算机内存时,大体用到两种内存
1.栈区:空间小,读取速度快
2.堆区:空间大,读取速度漫
局部变量:定义在方法内部的变量
特点:没有默认值,必须自行设定初始值,否则不能使用
方法被调用时,存在栈中,方法调用结束时从栈中清除
值类型:直接开内存空间存储数据
例如:int float double bool
引用类型:string class
引用类型的变量持有的数据的引用。数据存储在堆中
垃圾回收器
GC(Garbage collection)是CLR中一种针对托管堆中自动回收释放内存的服务
GC线程冲栈中的引用开始跟踪,从而判定那些内存正在使用,若GC无法跟踪到某一快堆内存,那么就认为这块内存不在使用了,
即为可回收的。C#当中的垃圾回收机制是自动回收管理的。
值类型比较:比较的是数值
引用类型比较:比较的是引用地址而不是数据
赋值
使用赋值运算符赋值值类型是,赋值是复制的存储的数据
赋值引用类型时,赋值时复制的是引用地址而不是数据
内存格局
内存格局通常分为四个区
全局数据区:存放,静态数据,常量
代码区:存放所有的程序代码
栈区:存放运行而分配的局部变量,参数,返回数据,返回地址
堆区:即自由存储区
进程:拥有自己独立的栈和堆,既不共享堆,亦不共享栈,进程有操作系统调度
线程:拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦有操作系统调度
多线程:
托管堆:
内存开辟与回收:
2018.12.31
C#当中两大数据类型分别是:值类型和引用类型
装箱:将值类型转换为引用类型称为装箱
拆箱:将引用类型转换为值类型称为拆箱
装箱的步骤
1.内存分配:在托管堆中分配内存空间用来复制的时间数据
2.完成实际数据的复制:将值类型实际数据复制到新分配的内存中
3.地址返回:将托管堆中的对象地址返回给引用类型数据
拆箱的步骤:
1.检查实例:首先检查进行拆箱操作的引用类型是否为null,如果为null则抛出异常,如果不为null则继续检查变量是否未拆箱
2.地址返回:返回已装箱变量的实际数据部分的地址
3.数据复制:将托管堆中的实际数据复制到栈中
装箱和拆箱操作要额外消耗CPU和内存资源,所以在C#2.0之后引用了泛型来减少装箱和拆箱操作,减少消耗。
泛型:它
代表通用类型可以代替任意的数据类型,使得类型参数化,从而达到只需要一个方法就可以操作多种数据的目的
字母A-Z A最小 Z最大
字母a-z a最小 z最大
字母A与小写的字母a比较 小写a最大
ASCLL码值 小写字母比对应的大写字母大32位
list 泛型T 字典(键值对) 继承 单例
字符串:
特性:字符串常量具备字符串池特性
常量字符串具有不可变性
字符串常量一旦进入内存,就不得再次改变因为如果在原位置改变会是其他对象内存被破坏,
导致内存泄漏,当遇到字符串变量引用新值时会在内存中新建一个字符串,将该字符串地址交由该变量引用
枚举:
定义:列举某种数据的取值
作用:增强代码的可读性,限定取值
枚举的关键字 enum
语法:enum 枚举名字{值1,值2,值3***}
枚举元素默认为int、准许使用的枚举类型有byte sbyte short ushort int uint long ulong.
每个枚举元素都是有枚举值默认情况下,第一个枚举的值为0,后面每个枚举的值依次递增1,可以修改值,后面枚举数的值依次递增
枚举的初始值为0
用法:代替一些常用的,但是命名较复杂的定义
2019.1.1
面向对象思想 封装 继承 多态
封装:把一些东西封装成类,每个类对自身可以进行管理。拥有独立的属性。如public(公有的)protected(受保护的)
private(私有的) 其他的类可以调用此类中公有的和受保护的方法或属性
继承:子类继承与父类,父类有的东西,子类中也就有了。子类可以继承父类的公有的,受保护的。子类也可以开拓属于自己的东西。
继承的好处:1.减少代码的复用
2.方便管理
基类(父类)派生类(子类)
多态:一个类的实例的相同方法在不同情况的表现形式
类是抽象概念,即为生活中的“类别”
对象是类具体的事例,即属于某个类别的个体
例如:学生是一个类,该学生的学号,性别,宿舍号等等属于其对象
创建类:
语法:
访问级别:class 类名
{
类的成员;
}
在其他类中调此类里面的方法
类名 引用名=new 类名();构造函数
创建对象的过程也称为实例化
访问修饰符
用于修饰类及类成员的访问可见范围
public:所属类的成员以及非所属类的成员都可以访问
private:只有所属类的成员才能访问。(类成员的默认级)
protected:与public类似
属性:对字段起保护作用,可实现只读,只写功能
本质就是对字段的读取与写入方法
语法:[访问修饰符]数据类型 属性名
{
get{return 字段;}
set{字段=value}
}
通常以公有属性和一个私有字段对应
属性只是外壳,实际上操作的私有字段
1.创建新类
2.在main方法里调用类的方法
3.继承 子类继承父类
4.get 字段
get:只能读不能写
set:只能写不能读
自动属性
当属性访问器中不需要任何其他逻辑时,使用自动属性即可,使其更加简洁
本质就是一个字段两个方法
语法
[访问修饰符]数据类型 属性名{get;set;}
构造函数主要是用来创建对象时为对象赋初值来初始化对象。总与new运算符一起使用在创建对象的语句中 A a=new A()
1.构造函数具有和类一样的名称
2.构造函数是在实例化类时最先执行的方法,通过这个特性可以给对象赋初值
3.构造函数没有返回值,也不能用void修饰,只有访问修饰符
4.每个类至少有一个构造函数,如果用户没有定义,系统会初始化一个默认构造函数
this 关键字
表示对当前对象的引用
访问当前类成员时,使用this关键字,可以提高代码的可读性,
在没有歧义的情况下可以省略
其主要的用法有三种
1.在类的内部使用this是指“当前对象的”
2.在构造函数圆括号尾部使用是指“调用其他的构造函数”
3.在使用索引器时使用this关键字作为修饰符
2019.1.2
static 静态
一、静态类
static class
静态类与非静态类的区别在于静态类不能实例化,也就是说不能使用new关键字创建静态类类型变量。在声明一个类时,使用static关键字,具有两个方面意义:
首先,它防止程序员写代码来实例化该静态类;其次它防止在类的内部声明任何实例字段或方法。
1.静态类的主要特征:
(1)仅包含静态成员
(2)无法实例化
(3)静态类的本质,是一个抽象的密封类,所以不能被继承,也不能被实例化
(4)不能包含实例化构造函数
(5)如果一个类下面的所有成员,都需要被共享,那么可以把这个类定义为静态类
2.静态类与私有构造函数的区别:
(1)私有构造器方式仍然可以从类的内部对类进行实例化,而静态类禁止从任何地方实例化类,其中包括从类自身内部
(2)使用私有构造器的类中,是允许有实例化成员的,编译器不允许静态类有任何势力成员
(3)使用静态类的优点在于,编译器能够执行检查以确保不知偶然的添加实例化成员,编译器将保证不会创建此类的实例
(4)C#编译器会自动把他标记为sealed这个类将类制定为不可发展,换言之,不能从他派生出其他类。父类基类 子类派生类
二、静态成员
1.通过static关键字修饰,是属于类,实例成员属于对象,在这个类第一次加载的时候,这个类下面的所有静态成员会被加载。
2.静态成员只被创建一次,所以静态成员只有一份,实力成员有多少个对象,就有多少份。
3.类加载的时候,所有的静态成员就会被创建在“静态存储区”里面,一旦创建直到程序退出,才会被回收
4.成员需要被共享的时候,方法需要被反复调用的时候就可以把这些成员定义为静态成员
5.在静态方法中,不能直接调用实例成员,因为静态方法被调用的时候,对象还有可能不存在
6.this/base关键字在静态方法中不能使用,因为还有可能对象还不存在
7.可以创建这个类的对象,制定对象的成员在静态方法中操作
8.在实例方法中,可以调用静态成员,因为这个时候静态成员肯定存在
9.非静态类可以包含静态的方法、字段、属性或事件
10.无论对一个类创建多少个实例,它的静态成员都只有一个副本
11.静态方法和属性不能访问其他包含类型中的非静态字段和事件,并且不能访问任何对象的实例成员;
12.静态方法只能被重载而不能被重写,因为静态方法不属于类的实例成员
13虽然字段不能声明为static const,但const字段的行为在本质上是静态的。这样的字段属于类,不属类的实例
三、静态方法
1.静态方法是不属于特定对象的方法
2.静态方法可以访问静态成员
3.静态方法不可以直接访问实例成员,可以在实例函数调用的情况下,实例成员作为参数传给静态方法
4.静态方法也不能直接调用实例方法,可以间接调用,首先要创建一个类的实例,然后通过这一特定对象来调用静态方法
四、静态构造函数
1.静态类可以有静态构造函数,静态构造函数不可继承
2.静态构造函数可以用于静态类,也可以用于非静态类
3.静态构造函数无法访问修饰符,无参数,只有一个static标志
4.静态构造函数不可被直接调用,当创建类实例或引用任何静态成员之前,静态构造函数被自动执行,并且只执行一次。
2019.1.4
什么是结构体
关键字 Struct
定义:与类的语法相似用于封装小型相关变量的值类型
适用性:表示点,颜色等S轻量级的对象。如创建存储1000个点的数组,如果使用类,将为每个对象分配更多内存。使用结构可以节省资源
Struct 名字
{
结构体中不能有实例字段初始值设定项
}
结构体构造函数
1.构造函数:
结构体总会包含无参数的构造函数
2.构造函数必须初始化所有字段
3.当时有new运算符创建一个struct对象时,它将调用相应的构造函数。与类不同。可以不在使用new运算符的情况下实例化结构体
4.如果不使用new运算符,则字段保持未分配,并且所有字段初始化之前不能使用对象
类与结构体的区别
1.类存储在堆上,结构体存储在栈上
2.类是引用类型,结构体是值类型
3.堆空间大,但访问速度较慢
4.栈空间小,访问速度相对较快
5.当我们描述一个轻量级对象时,结构体可以提高效率,成本低
6.从需求出发,假如我们在传值的时候希望传递的是地址而不是对象的拷贝,就应该是类了
7、值类型存储在栈上,引用类型存储在堆上
冒泡排序:
是一种计算机科学领域的较简单的排序方法。
它重复的走访要排序的元素列,依次比较两个相同的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。
走访元素的工作是重复的进行直到没有相邻元素需要交换,也就是说该元素已经排序完成
冒泡排序算法的原理如下:
1.比较相邻的元素,如果第一个比第二个大,就交换他们两个
2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数
3.针对所有的元素重复以上的步骤,除了最后一个
4.持续每次对越来越少的元素重复上面的步骤,知道没有任何一个相邻元素需要比较