{tabs-pane label="知识点"} C#语言
2) 类可以继承,也可以实现接口;结构不能继承,但可以实现接口。 3) 类可以有显式声明的无参数构造函数;结构不能包含显式的无参数构造函数。 4) 结构中不能有实例字段初始值设定,但类没有任何限制。 5) 类的构造函数里面可以不用对所有字段进行初始化;结构的构造函数里面必须对所有字段进行初始化。 6) 类可以有析构函数,但结构不行。
private:私有的,只有类的自身才能访问。 protected:受保护的,只有类的自身及其派生类才能访问。 internal:内部的,同一个程序集里面的任何位置都能访问。 protected internal :内部受保护的,同一个程序集里面的任何位置,或者不同程序集中的派生类可以访问。 备注: 父类=基类 子类=派生类
不能被直接实例化。 可以包含任意个抽象成员。 不同点:
抽象类也是类,具有类的共同特点:单基类继承,多接口实现;接口不是类,只能继承多个接口。 -----继承一个父类,任意个接口 抽象类中可以包含已经实现的非抽象成员;接口中所有的成员都是抽象的、没有实现的。
拆箱:将object类型或接口类型转换为实际的值类型。
引用类型:类、接口、委托、数组、字符串。
值类型的变量,变量本身存储的就是实际的数据;引用类型的变量,变量本身存储的仅仅是实际数据的引用地址,而实际的数据存储在托管堆上。 在作为方法的参数进行传递时,值类型参数传递的是值的副本,在方法中对该值进行修改不会影响原始值;引用类型参数传递的是参数的引用地址,在方法中对该参数进行修改会对托管堆上该地址的实际数据进行修改,从而会影响原始值。
有符号整数(由小到大):sbyte、short、int、long 无符号整数(由小到大):byte、ushort、uint、ulong 浮点型:float、double、decimal 布尔型:bool 字符型:char 引用类型: string、object
重载(overload):同一个类中,同名的方法具有不同的参数签名的实现。重载的必要条件是方法具有不同的参数签名。 方法的参数签名是指方法的参数个数、参数的数据类型、参数是否有ref、out、params修饰(方法的返回值类型不属于方法的参数签名)。
condition ? first_expression : second_expression; 如果条件condition为 true,则计算第一表达式first_expression并以它的计算结果为准;如果为 false,则计算第二表达式second_expression并以它的计算结果为准。只会计算两个表达式其中的一个。 ?? 运算符称为 null 合并运算符,用于定义可以为 null 值的类型和引用类型的默认值。如果此运算符的左边不为 null,则此运算符将返回左边的值;如果此运算符的左边为null,则返回右边的值。
readonly:表示只读字段,其修饰的字段的值是在运行时计算的,在对象的实例构造函数或类的静态构造函数首次被调用时计算,之后字段的值便不能被更改。
string s = null :字符串变量s指向了空引用null,表示s没有引用任何对象,即没有给变量s分配内存空间。
2) 用于创建匿名类型的实例。 3) 在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员。
ref参数在传入方法之前必须进行初始化;而out参数在传入方法之前可以不用初始化。 ref参数在方法内部可以直接使用;而out参数在方法内部不能直接使用。 ref参数在方法内部可以使用也可以不使用;而out参数在方法返回之前必须对其赋值。
2) 给类型起别名。 3) 使用using声明的对象,可以确保在using代码块结束时,该对象所使用的资源被自动释放。
&&:逻辑与,表示对两个布尔型进行逻辑与操作,即当且仅当两边的条件都为true时,表达式才返回true。 |:按位或,表示对两个整数进行按位或运算。 ||:逻辑或,表示对两个布尔型进行逻辑或操作,即只要两边的条件中有一个为true,表达式就返回true。
as:用于对引用类型的变量进行类型转换。
计算机程序在运行过程中要使用内存,需要向操作系统申请内存空间。由于内存空间是有限的,所以程序在使用完内存之后要释放内存。垃圾收集器就是一种自动进行内存管理的机制,使得程序员不需要每次手动去分配和释放内存,由垃圾收集器全权负责内存的管理工作。这样可以使程序员的关注点转移到程序的功能和业务逻辑,提高了程序的安全性、稳定性、及开发效率。
事件也是一种委托。
打开连接。 创建命令对象,执行SQL语句。 关闭连接。
DataReader(连接式的):数据读取器。DataReader在从数据库中读取数据时是“面向连接的”,即DataReader在读取数据时是从数据库中一行一行读取,每次只会从数据库中读取一行数据(类似于数据库游标的行为),直到读完最后一行之后,才断开数据库连接。在整个读取的过程中,必须保持与数据库的连接处于打开状态。
SqlCommand:命令对象,用于对数据库执行SQL语句。 SqlDataAdapter:适配器对象,用于填充数据集和更新数据库。 SqlParameter:参数对象,用于执行参数化SQL语句。 SqlDataReader:读取器对象,用于从数据库中快速逐行读取数据。 SqlTransaction:事务对象,用于执行数据库事务。 ASP.NET
Forms验证:ASP.NET通过Web表单,为每个用户创建一个用cookie保存的身份验证票据,通过该票据验证用户身份。 Passport验证:由 Microsoft 提供的集中身份验证服务,通过将每个用户的信息提交给Passport 登录服务网站进行用户身份的验证。 None验证:自定义身份验证方式。
Response.Redirect:客户端重定向,服务器向客户端浏览器发送一个重定向信号和重定向的URL地址,浏览器收到该信号后,重新去请求要重定向的URL地址。由于重定向是发生在浏览器端,因此浏览器的地址栏会变成重定向后的URL。浏览器端重定向可以跨站点。
优点:简单便捷。 缺点:安全性差,且长度大小有限制。 Session:通过会话状态传值。 优点:当前会话中的所有页面均可使用,且能够传递任何对象。 缺点:可能会丢失(Session过期或失效等情况)。 Cookie:通过客户端Cookie传值。 优点:读取该Cookie的所有页面都可以使用。 缺点:只能够存储文本信息(字符串),且大小不能超过4KB。 Application:通过全局应用程序对象传值。 优点:整个应用程序都可以使用,且能够传递任何对象。 缺点:可能会产生并发问题。 Server.Transfer:通过服务器端重定向传值。 优点:可以将与最初请求相关的所有数据传递给重定向的页面。 缺点:资源消耗比较大。
通过HTTP-POST请求调用。 通过SOAP请求调用。
解决方法:可以将Session配置为“StateServer”或“SQLServer”——存储在状态服务进程或数据库中,可以避免丢失,但此时无法捕获Session_End事件。
页面基类:System.Web.UI.Page。
POST:向服务器提交数据。
Web Service是采用SOAP协议(简单对象访问协议)进行通信的,该协议基于HTTP协议,故可以实现跨防火墙通信。 Web Service可以很容易的实现分布式的应用程序。
页面局部缓存:将页面中的一部分放在用户控件中,对该部分进行缓存。 数据缓存:使用Cache类进行数据缓存。 客户端缓存:使用HttpCachePolicy类进行客户端(浏览器)缓存。
Web 应用程序是无状态的。每次从服务器请求网页时,都会创建网页类的一个新实例。这通常意味着在每次往返过程中将会丢失所有与该页面及其控件关联的信息。为了克服 Web 编程的这一固有局限性,ASP.NET 页框架包含了状态管理功能,可以在往返过程之间保存页和控件的相关联的信息及其值。这便是视图状态。
ascx:用户控件 asmx:Web Service ashx:一般处理程序 asax:Global.asax,全局应用程序配置
Response、(响应对象) Server、(服务器对象) Session、(会话对象) Cookie、 Application(应用程序对象)
.post:通过post方式发送请求。 .ajax:可以使用指定的方式来发送请求。.ajax方法是jquery中发送Ajax请求的最底层方法,可以完全自定义发送请求时的相关参数。 .getJSON()
调用open方法初始化请求 设置回调函数 发送请求
V:View,视图,是应用程序的数据显示部分,用于呈现页面。 C:Controller,控制器,是应用程序流程控制部分,用于处理请求逻辑,访问模型数据。
SQL Server
select top 10 * from A where id not in (select top 30 id from A order by id) order by id 方法二:
select top 10 * from A
where id>(select max(id) from (
select top 30 id from A order by id ) t)
方法三:
select * from (
select *,row_number() over (order by id) Row_No from A
) t where Row_No between 31 and 40
left join:左外联查询,left outer join的简写形式,以左边的表为基准与右边的表进行关联,连接查询出满足on条件的结果,但左表的数据会完全保留,其中右表中无法满足on条件的数据会在连接的结果中用null与左表数据补齐。 right join:右外联查询,right outer join的简写形式,以右边的表为基准与左边的表进行关联,连接查询出满足on条件的结果,但右表的数据会完全保留,其中左表中无法满足on条件的数据会在连接的结果中用null与右表数据补齐。
函数限制比较多,比如不能用临时表,只能用表变量等;而存储过程的限制相对就比较少,几乎所有的Sql代码都可以使用。 一般来说,存储过程实现了业务逻辑的功能,比较复杂;而函数实现的功能针对性比较强,用于完成单一目的功能。 对于存储过程来说可以返回一个或多个输出参数,也可以返回多个结果集,而函数只能返回一个值或者表对象。
作用:索引类似于一本书的目录,主要用于加快从表中查询数据的速度。
非聚集索引:表示索引中的结构与表中相应行的数据在物理磁盘上存储的顺序不相同的索引。
事务的ACID特性: 原子性(Atomicity):事务的执行是作为原子的,即不可再分。整个语句作为一个不可再分的执行单元,要么都执行,要么都不执行。 一致性(Consistency):在事务开始之前和事务结束之后,所有的数据都保持一致状态。 隔离性(Isolation):事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,中间某一时刻的数据。 持久性(Durability):事务完成之后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
DML触发器:当数据库中发生数据操作语言 (DML) 事件时将调用DML触发器。DML事件包括在指定表或视图中修改数据的 INSERT 语句、UPDATE 语句或 DELETE 语句。 DML触发器又分为: 1) after触发器(之后触发):在执行了 INSERT、UPDATE 或 DELETE 语句操作之后被触发。可以定义三种类型:INSERT触发器、UPDATE触发器、DELETE触发器。after触发器只能定义在表上。 2) instead of 触发器 (之前触发):instead of触发器也叫替代触发器,表示并不执行其定义的操作(INSERT、UPDATE、DELETE),而是仅执行触发器本身。既可以在表上定义instead of触发器,也可以在视图上定义。 DDL触发器:当数据库中发生数据定义语言 (DDL) 事件时将调用DDL触发器。DDL事件主要与以关键字 CREATE、ALTER 和 DROP 开头的SQL语句对应。
不带where条件的delete和truncate都用于删除表中的所有数据,但如果表中有自增长列,delete在删除所有数据之后,下一次插入新的数据时自增长列依然紧接着最后一次的数值的下一个;而truncate删除所有数据后,下一次插入新数据的自增长列的数值将被重置,重新开始。
union:在合并时会去除掉重复的记录。 union all:直接合并,对重复的记录不作处理。
) t where No<=3 SQL Server排名函数:row_number()、rank()、dense_rank() 区别:
当全局变量@@fetch_status的值不等于0时,表示游标已经到了最后。 算法
请使用递归算法来实现计算1+2+3+4+…+100的结果。
Program
static void Main(string[] args)
{
}
if (x <= 1)
return x;
else
return x + Sum(x - 1);
请实现一个冒泡排序算法。
static void Sort(int[] nums)
int temp;
for (int i = 0; i < nums.Length - 1; i++)
{
}
请实现一个方法,对于输入的任意字符串,统计出其中每一种字符出现的次数。
static void CountChar(string s)
Dictionary dic = new Dictionary();
foreach (char c in s)
{
}
foreach (KeyValuePair p in dic)
{
}
}
请手动实现一个将字符串转换为整数的方法,不要使用int.Parse、int.TryParse、Convert.ToInt32等任何类库方法。
static bool TryParse(string s, out int num)
{
if (string.IsNullOrEmpty(s))
{
num = 0; return false;
}
int result = 0;
bool minus = s[0] == '-' ? true : false;
if (minus && s.Length == 1)
{
num = 0; return false;
}
for (int i = minus ? 1 : 0; i < s.Length; i++)
{
if (s[i] >= '0' && s[i] <= '9')
{
result = (s[i] - 48) + result * 10;
}
else
{
num = 0;
return false; }
}
num = minus ? -result : result;
return true;
}