值类型:后进先出
private:私有成员,类内部可访问,类和类成员
public:公开成员,没有访问限制,所有的都可以访问,类和类成员
protected:保护成员,类内部和继承类可访问,类和内嵌类
internal:同一程序集下可访问,类和内嵌类
internal protected/protected internal:同一程序集下可访问,类和内嵌类
**
**
DataConnection 连接数据库
DataCommand 执行语句命令
DataSet 数据存储器
DataAdapter 适配器,用于填充数据
DataReader 数据读取器,用于向前只读的数据流
**
**
事件:是一种消息机制,它是特殊的委托;
委托:将方法作为方法的参数代入到另一个方法中。
委托和事件没有可比性,因为委托是类型,事件是对象。
委托的本质,是一个类,而事件,是一个委托类型的私有变量加上两个公有方法(事件的+=和-=),这是本质区别。
**
**
重载:方法名称相同,参数列表不同,调用时编译器会根据实际传入参数的形式,选择与其匹配的方法执行;
重写:当一个子类继承父类时,子类中的方法父类中的方法名称、参数个数、参数类型一致时,就说明这个子类重写了其父类。
相同点:都是多态的体现,同名方法
不同点:
重载是参数不同,重写必须一致;
重载可以没有返回值,重写返回值必须一致;
重载编译时多态,重写运行时多态;
重载不需要继承,重写必须继承。
out参数
输出参数
①方法中的out参数在方法体结束前,必须对out参数赋值;
②方法中的形参为out类型时,对应的实参也必须带有out关键字;
③在调用out参数的方法时,必须准备一个相同类型的变量来接收out的结果,并且必须带有关键字;
④可视作out参数为方法的返回值
ref参数
引用传参
①方法中的形参为ref类型时,则对应得实参也必须带有ref关键字;
②调用方法时,方法内如果发生变化时,那么这个参数会永久性的发生改变
**
**
索引器不止是根据数字进行索引,参数的个数和类型都是任意的,用reflector反编译可以看出,索引器的内部本质上就是set_item、get_item方法。
索引的语法:
public string this[string s],通过get、set块来定义取值、赋值的逻辑
索引可以有多个参数、参数类型任意
索引可以重载。
如果只有get没有set就是只读的索引。
索引其实就是set_Item、get_Item两个方法。
**
**
属性可以对设值、取值的过程进行非法值控制,例如:年龄不能设置为负值;而字段则不能进行这样的设置。
虽然一般情况下get读取的值就是set设置的值,但是可以让get读取的值不是set设置的值的。
**
**
装箱
将值类型转换成引用类型----将小的包装成大的
拆箱
将引用类型转换成值类型----将大的拆分成小的-----前提是先装箱
**
**
CTS:通用类型系统:一种确定公共语言运行库如何定义、使用和管理类型的规范;
CLS:公共语言规范:是许多应用程序所需的一套基本语言功能;
CLR:公共语言运行库:运行代码并提供使开发过程更轻松的服务。
**
**
不同点:
类:属于引用类型,可以继承和被继承,有构造函数和析构函数,必须有new初始化,可以有字段赋值;
结构:属于值类型,不可以继承和被继承,没有构造函数但可以添加,没有析构函数,可以不new初始化,没有字段赋值
相同点:
①基类型都是对象(object),c#中所有类型的基类型都是object;
②都有属性和方法
**
**
不同点:
类能实例化,接口不能实例化。
接口不包含方法的实现。
类只能单继承,接口可以多继承。
接口中不能包含常量、字段、构造函数、析构函数、静态成员。
相同点:
接口、类都可以从多个接口继承。
接口和类都可以包含事件、索引器、属性。
虚拟virtual、2. 抽象abstract
抽象方法是只有方法名称,没有方法体,子类继承父类时必须重写父类抽象方法;
(虚拟)虚函数有方法体,子类可以继承父类,也可以重写,但是子类可以覆盖,也可不覆盖。
相同点:都是为了重写
两者区别:
(1)虚方法有方法体,抽象方法没有方法体。抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化;
(2)抽象方法只能在抽象类中声明,虚方法不是;
(3)派生类必须重写抽象类中的抽象方法,虚方法则不必要。
**
**
字符串属于引用类型:
string来自System.Object 的命名空间,
string是C#中的类,String是.net Framework的类,
string是关键字,String不是,也就是说string不能作为类、结构、枚举、字段、变量、方法、属性的名称,而String可以
StringBuilder属于引用类型
来自System.Text的命名空间,自身是类,使用时必须实例化,支持空参数构造,默认是空字符串,它是可变参数,初始化时,如果字符串长度超出初始化的大小时,
会开辟一个新的地址空间,将原来字符串的内容复制到新的空间中,再追加超出的长度,旧空间会自动销毁,引用新空间地址,新空间大小是旧空间大小的基础倍。
**
DataReader是数据管理提供者类,而DataSet是一般性数据类。
DataSet获取数据需要通过桥梁DataAdapter的填充,由于DataReader本身就是管理提供者,它可以通过Command的ExecuteReader()方法就可以获取数据。
DataReader是在线处理,当连接关闭后就不能读取数据;DataSet可以离线处理数据,它是把数据从数据库拷贝到本地存储,在关闭连接的情况下仍然可以在DataSet中处理数据,甚至可以在本地存储的表格中增加限制。
DataReader只能正向读取数据,但不能修改数据;DataSet可以按任何顺序读行,可以按灵活的方式搜索、排序和过滤这些行,甚至可以改变这些行,然后将这些改变同步到数据库中。
从DataReader读取数据的速度快于DataSet。
由于DataSet是离线处理,所以当在事务处理中要锁定数据库时,不可以使用DataSet。因为当DataSet被填充以后,会自动断开与数据库的连接,此时不可能再对数据库进行锁定。
**
注意:
DataReader使用时始终占用SqlConnection,在线操作数据库
每次只在内存中加载一条数据,所以占用的内存是很小的
是只进的、 只读的
DataSet则是将数据一次性加载在内存中.抛弃数据库连接…读取完毕即放弃数据库连接(非连接模式)
DataSet将数据全部加载在内存中.所以比较消耗内存…但是确比DataReader要灵活…可以动态的添加行,列,数据.对数据库进行 回传更新操作(动态操作读入到内存的数据)
**
好处:①封装了唯一性,可严格控制客户怎样访问以及何时访问;
②内存中只有一个对象,可节约系统资源,提高系统性能;
如何实现:
①将构造函数私有化
②使用一个公开静态类
③使用一个静态属性进行判断当前窗口是否被创建
**
**
采用try…catch…catch…结构,发生错误时,层层上抛,直到找到匹配的catch为止。
try:一个 try 块标识了一个将被激活的特定的异常的代码块。后跟一个或多个 catch 块。
catch:程序通过异常处理程序捕获异常。catch 关键字表示异常的捕获。
finally:finally 块用于执行给定的语句,不管异常是否被抛出都会执行。
**
**
第一范式:字段不能有冗余信息,所有字段都是必不可少的。
第二范式:满足第一范式并且表必须有主键。
第三范式:满足第二范式并且表引用其他的表必须通过主键引用。
**
利用SQL关键字对网站进行攻击。
防止:
使用参数化的SQL就可以避免SQL注入;
存储过程执行所有的查询。
**
**
保证数据库完整性:
实体完整性:每个表中必须有一个指定的字段;
区域完整性:针对表中的某个字段进行特殊化限制;
参照完整性:表与表之间的特殊化关联限制
**
左联接:如果左表的某一行在右表中没有匹配行,则右联接的结果集行中,右表的所有选择列表均为空(上下排列);
右联接:将返回表中的所有行,如果右表的某一行在左表中没有匹配行,则左表返回空值(左右排列)
**
**
事务:事务是指一个工作单元,它包含了一组数据操作命令,这组命令要么执行,要么不执行;
视图:视图是一种虚拟表,可对虚拟表进行增改查操作;
索引:索引像书的目录,它提供了数据的逻辑,合理划分索引能够大大提高数据库性能;
**
**
两种写法:
SELECT TOP(5) * FROM [User] WHERE ID NOT IN(SELECT TOP(10) ID FROM [User] ORDER BY ID ASC)
SELECT TOP(5) * FROM [User] WHERE ID>(SELECT MAX(ID) FROM [User] WHERE ID IN(SELECT TOP(10)ID FROM [User] ORDER BY ID ASC))
**
**
①数组是静态的,定长的,不能改变其大小,集合是不定长的,可根据其内容改变大小;
②数组声明其类型,集合不声明;
③数组是多维的,集合是一维的;
④数组存放类型只能是一种,集合不止一种
**
23.假设int i=21;
求~i结果为-22;
求i%5的结果为1;
求int j=(i/5)++的结果为4
**
数据定义语言(DDL):Data Definition Language,用来定义和管理数据库及其对象,例如:create、alter、drop等;
数据操纵语言(DML):Data Manipulation Language,实现对数据库表,各对象的操作,例如:insert、update等;
数据控制语言(DCL):Data Control Language,实现对数据库进行安全管理和权限管理等控制,例如:grant、revoke、deny等
**
服务端:
①创建一个Socket对象,用函数Socket();
②用指定的IP地址、端口号信息建立一个EndPoint对象;
③使用函数Bind()绑定EndPoint;
④开始监听listen();
⑤连接客户端,用函数accept();
⑥收发数据,用函数Send()和Receive();
⑦关闭网络连接
⑧关闭监听
服务端:
①创建一个Socket对象,用函数Socket();
②用指定的IP地址、端口号信息建立一个EndPoint对象;
③设置要连接对方的IP地址、端口号信息;
④连接服务器,用函数connect();
⑤收发数据,用函数Send()和Receive();
⑥关闭网络连接
**
**
数据访问层(DAL)主要是存放对数据类的访问,即对数据库的添加、删除、修改、更新等基本操作
业务逻辑层(BLL)对传送数据进行逻辑判断分折,并进行传送正确的值。
表示层(UI)为了与用户交互的界面。
优点:
①降低层与层之间的依赖;
②有利于标准化;
③利于层与层之间的复用;
④扩展性强;
⑤安全性高;
⑥有利于后期的维护与升级
**
**
①加快系统的运行速度
②封装复杂操作
③实现代码重用
④增强安全性
⑤减少网络流量
**
**
简单数据类型:数字类型(Number),字符串类型(String),布尔类型(bool)
复杂数据类型:空类型(null),未定义类型(undefined),对象类型(Object)
**
**
“ ”:是字符串类型的默认值,占用内存
null:null用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象。转换为值返回0.
undefined:当声明的变量还未被初始化时,变量的默认值为undefined。转换为值返回NAN。
**
**
相同点:
都是客户端将数据以报文形式提交给服务器。
HTTP协议中的两种发送请求的方法。HTTP的底层是TCP/IP。所以GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP链接。
不同点:
get 方法:【默认值】将数据附加在网址的后面进行传输
①所有出现文件名(URL)的地方都可以打开,进行get方式传值
②只能用来传输少量的数据
③在网址后面可以直接看到,不安全
④GET产生一个TCP数据包;
post方法:不会附加在网址后面(隐形的传值)
①post方式可以传大量数据(上传文件)
②隐形传输,非常安全
③POST产生两个TCP数据包。
**
**
const是静态常量:是指编译器在编译时会对常量进行解析,并将常量的值替换成初始化的值;
ReadOnly是动态常量:是指在运行时获得的,编译器在编译期间标识为只读常量,而不用常量的值代替;
区别:
Const修饰的常量在声明的时候必须初始化,ReadOnly则可以延迟到构造函数初始化;
Const常量既可以声明在类中还可以在函数体内,ReadOnly只能在类中;
Const修饰的常量在编译期间就被解析,ReadOnly修饰的常量则延迟到运行的时候才被解析
**
**
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 算法练习
{
class Program
{
static void Main(string[] args)
{
int[] arr = { 2, 54, 7, 23, 11, 89 };
for (int i = 0; i < arr.Length; i++)
{
for (int j = 0; j < arr.Length-i-1; j++)
{
if (arr[j]>arr[j+1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
for (int i = 0; i < arr.Length; i++)
{
Console.Write(arr[i]+" ");
}
Console.ReadLine();
}
}
}
**
**
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 斐波那契数列
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请输入斐波那契数列:");
int i=int.Parse(Console.ReadLine());
int result=GetSet(i);
Console.WriteLine("求出斐波那契数列第{0}是{1}",i,result);
Console.ReadLine();
}
//1,1,2,3,5,8
static int GetSet(int j)
{
int res = 0;
if (j==1)
{
res = 1;
}
else if (j==2)
{
res = 1;
}
else
{
res = GetSet(j - 1) + GetSet(j - 2);
}
return res;
}
}
}
**
**
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 随机数
{
class Program
{
static void Main(string[] args)
{
Random r = new Random();
int[] arr = new int[5];
for (int i = 0; i < arr.Length; i++)
{
arr[i] = r.Next(1, 21);
if (i>0)
{
for (int j = 0; j < i; j++)
{
if (arr[i]==arr[j])
{
i--;
}
}
}
}
for (int i = 0; i < arr.Length; i++)
{
Console.Write(arr[i]+" ");
}
Console.ReadLine();
}
}
}
**
**
C/S(客户端服务) B/S(浏览器端服务)
(体积)胖客户端 瘦客户端
(效率)本地运行 服务器端运行
(网络)依赖不强 必须依赖网络
(用户)体验更好 其次
**
**
***两种写法:***
//计算出重复的数字个数,然后减去获取不重复个数
int[]arr={1,1,3,5,6,7,2,3,3,5,5,6,6};
int count=0;
for(int i=0;i
**