A.基础数据/基本数据 :值类型:
()括号中的数据代表字节数
(1)byte,sbyte (2)short,ushort,(4)int,uint,(8)long,ulong
(4)float,(8)double,(16)decimal double 取值范围最大,decimal精度最高
(2)char (1)bool
:引用类型
string 类型,类 类型。。。。。。。。
值类型和引用类型的区别:存储方式的不同
1.值类型的数据是直接存储在内存的栈中 例如 int a = 4 ; 在内存栈中开辟了4个字节内存去存储这个数据,变量a是这个内存的名字
2.引用类型的数据是存放在内存的堆中的,例如 string a = " 舒志恒!";在内存的堆中存放了 舒志恒!这个数据,在内存栈中 a变量存放的是一个地址的引用,就是说可以通过这个变量访问到堆中存放数据的地址。
string 和 stringBuilder的区别
字符串是不可以改变的,stringBuilder是可变的字符串,在频繁的对字符串进行修改的时候,推荐使用stringBuilder.
B.值类型的转换:显示转换,隐式转换
1.显示转换(强制类型转换),例如 int a = (int)12.5f;
2. 隐式转换 例如 double a = 12;
3.静态类提供了一系列值类型的转换方法Convert
C.常见的循环语句,判断语句。。。。
1. if() else{} if() else if() {} else{}......................................
2.for循环,while循环,do{} while();循环
D.数组(4种常见的排序方法 冒泡,选则,插入,快排,在博客里已有总结(代码实现了))
一维数组:一组数据集合
1.存储相同类型的数据
2.数据可以通过下标访问
int[] arr={};直接定义一般只限于声明数组时初始化数据;
int[] arr;
arr={};//错误的,不成立
int[] arr=new int[长度];
int[] arr=new int[]{,,,};
二维数组:int[,] arr = new int [行数,列数]; int[,] arr = {{},{},{}}
交错数组:int [][] arr = new int [行数][];
int[][] arr=new int[3][]{new int[]{10},new int[]{200,100},new int[]{3}};
arr[1][1]=300;
//{{10},{200,300},{3}}
E.面向对象,
1.类:程序中的基本单位:1,引用类型 2.对一类具有相同属性和方法的对象的集合,抽象统称;
自定义类时,未定义构造函数,那默认会自动添加一个无参构造函数;
自定义类时,定义构造函数,默认不创建;
类拥有实例成员:字段,属性,方法,索引器,事件;
类拥有常量,静态成员;
问 结构和类十分类似 ,它们之间有什么区别
1.结构是值类型 ,类是引用类型
2.结构不可以定义无参的构造函数 ,类可以定义无参的构造函数
3.结构可以不通过new操作符去初始化,类必须通过new操作符进行初始化
4.结构不可以继承,也不可以被继承,但可以实现接口。类可以继承,也可以被继承
5.结构在使用前必须进行数据初始化。
抽象类特点:
1.不可以实例化 2.可以定义抽象成员(属性,方法,索引器)3.子类继承抽象类必须重写抽象成员
abstract class F{
public abstract string Name{get;}
public abstract void move();
}
接口的特点:
1.不可以实例化 2.接口成员不可以有具体的实现,3.子类实现接口必须实现成员
interface IAction{
string Name{get;}
string GetName(); //默认修饰符都是public
}
类是单继承,接口是多实现
2.对象,万物皆对象,类的实例化。
3.封装:将数据和函数集合到一个个单元中(类中)作用:保存数据的安全性,防止数据被随意修改。
一般数据存储在字段中的,访问通过属性,数据处理用函数;
注意:单一性
4种访问修饰符:
public:对任何类和成员都公开,无限制访问
private:仅对该类公开
protected:对该类和其派生类公开
internal:只能在包含该类的程序集中访问该类
4.继承:子类只能继承一个父类,继承该类中所有非私有的成员;
做用:
1.节省开发时间,提高代码重用性;
2.进行代码扩展;(例如List)
F.委托(delegate)事件(event),匿名函数,lamda表达式
1.委托:一种类型,一种方法引用的类型;一个委托指向了一个方法的引用,或者说一个委托对象指向了方法的对象;
委托的定义格式:public delegate 返回值 MyDelegate(参数列表); Action 无参数,无返回值的委托,Action<T a> 参数为T型 a 类型的委托 Func<T> 返回值为 T型的委托
要注意的是Func<T>返回值类型为T类型的委托类型,当Fun中委托对象指向了多个方法时,返回最后一个执行的方法
附上一个小案例
下面看一个小案例,输入一个字符串
要求1。将所有的大写字母变成小写
2 。将所有的小写字母变成大些,
3。将输入的字符串后面+*号
static string ToUpper(string str)
{
return str.ToUpper();
}
static string ToLower(string str)
{
return str.ToLower();
}
static string ToStar(string str)
{
return str + "*";
}
static void Mydelegate(Func<string,string> func,string str)
{
Console.WriteLine(func(str));
}
在Main函数中测试
Mydelegate(ToUpper, "abc"); //ABC
Mydelegate(ToLower, "ABC"); abc
Mydelegate(ToStar, "abc"); abc*
2.事件
1.事件其实就是一种特殊的委托,一般用于传递消息
2.不允许在定义的外部使用 = 赋值,可以使用+= -= 移除添加方法等
3.实例(事件传递消息的案例 博客里总结了, 英雄攻击怪物的 热水器的题目)
3.写一个简单的匿名函数,和lamda表达式
匿名函数 Action a = delegate({Console.WriteLine("我是一个匿名函数")});
lamda表达式 Func<int > f = ()=>{return 12;};
G.集合(泛型) 非泛型
1.ArrayList 和List有什么区别?
性能的消耗 ArrayList 是非泛型的 进行数据存储是会涉及到频繁的装箱(拆箱)而每次装箱,拆箱,都涉及到cpu 分配内存,资源分配等等,十分消耗性能,
List是泛型 ,可以指定类型存储数据 推荐使用泛型减少性能的消耗
2.字典:键值对集合;通过键访问值;Dictionary
动态数组:List 通过下标访问
队列:Queue 先进先出
栈:Stack 后进先出(实例 要求实现一个栈,可以入栈和出栈,并求存储的最小值)
链表:LinkedList(数据的删除,和添加效率较高)
H.进程,多线程,Socket通信,Tcp/ip
1.进程是(cpu,内存分配的)一个资源单位,是程序运行时的一个实例
2.线程是程序执行时分配的最小单位, 一个进程可由多个线程组成,线程共享进程中的资源
3.实例(用多线程实现了一个猜数字小游戏)
Socket通信 三次握手,四次放手,和Socket通信的原理在博客中已有总结(加上代码实现了)