.net(C#)葵花宝典

C#语言

类和结构的区别?
类是引用类型,结构是值类型。
类可以继承,也可以实现接口;结构不能继承,但可以实现接口。
类可以有显式声明的无参数构造函数;结构不能包含显式的无参数构造函数。
结构中不能有实例字段初始值设定,但类没有任何限制。
类的构造函数里面可以不用对所有字段进行初始化;结构的构造函数里面必须对所有字段进行初始化。
类可以有析构函数,但结构不行。
C#中类成员的访问修饰符有哪些?
public:公有的,任何位置都可以访问。
private:私有的,只有类的自身才能访问。
protected:受保护的,只有类的自身及其派生类才能访问。
internal:内部的,同一个程序集里面的任何位置都能访问。
protected internal :内部受保护的,同一个程序集里面的任何位置,或者不同程序集中的派生类可以访问。
面向对象的三大特征是什么?
继承、封装、多态

抽象类和接口的区别?
相同点:

不能被直接实例化。
可以包含任意个抽象成员。
不同点:

抽象类也是类,具有类的共同特点:单基类继承,多接口实现;接口不是类,只能继承多个接口。
抽象类中可以包含已经实现的非抽象成员;接口中所有的成员都是抽象的、没有实现的。
接口可以包含哪些成员?
方法、属性、事件、索引器

什么是装箱和拆箱?
装箱:将值类型转换为 object 类型或由此值类型实现的任何接口类型。
拆箱:将object类型或接口类型转换为实际的值类型。
 

C#中,哪些类型是值类型?哪些类型是引用类型?
值类型:结构、枚举。
引用类型:类、接口、委托、数组、字符串。
值类型和引用类型的区别?
一般情况下,值类型的数据存储在线程栈上,引用类型的数据存储在托管堆上。
值类型的变量,变量本身存储的就是实际的数据;引用类型的变量,变量本身存储的仅仅是实际数据的引用地址,而实际的数据存储在托管堆上。
在作为方法的参数进行传递时,值类型参数传递的是值的副本,在方法中对该值进行修改不会影响原始值;引用类型参数传递的是参数的引用地址,在方法中对该参数进行修改会对托管堆上该地址的实际数据进行修改,从而会影响原始值。
 

C#中的基本数据类型有哪些?
值类型:

有符号整数(由小到大):sbyte、short、int、long
无符号整数(由小到大):byte、ushort、uint、ulong
浮点型:float、double、decimal
布尔型:bool
字符型:char
引用类型:

string、object
重写和重载的区别?
重写:子类对基类中的虚成员(虚方法、虚属性等)或抽象成员(抽象方法、抽象属性等)进行覆盖,重新实现。
重载:同一个类中,同名的方法具有不同的参数签名的实现。重载的必要条件是方法具有不同的参数签名。
方法的参数签名是指方法的参数个数、参数的数据类型、参数是否有ref、out、params修饰(方法的返回值类型不属于方法的参数签名)。

 

 

构造函数是否可以被继承?是否可以被重写?
不能被继承,也不能被重写,但是在创建类的实例时会首先调用其基类的无参数构造函数。
C#中,运算符“?”和“??”的区别是什么?
?是和:结合在一起使用的,?:称为条件运算符(或三目运算符),该运算符根据布尔型表达式的值返回两个值之一。条件运算符的格式如下:
condition ? first_expression : second_expression;

如果条件condition为 true,则计算第一表达式first_expression并以它的计算结果为准;如果为 false,则计算第二表达式second_expression并以它的计算结果为准。只会计算两个表达式其中的一个。

?? 运算符称为 null 合并运算符,用于定义可以为 null 值的类型和引用类型的默认值。如果此运算符的左边不为 null,则此运算符将返回左边的值;如果此运算符的左边为null,则返回右边的值。
 

C#中,用const和readonly修饰的字段有什么区别?
const:表示常量,其修饰的值是在编译期间确定的,因此在声明时只能通过常量表达式指定其值。
readonly:表示只读字段,其修饰的字段的值是在运行时计算的,在对象的实例构造函数或类的静态构造函数首次被调用时计算,之后字段的值便不能被更改。
 

string s = ”” 和string s = null的区别?
string s = “” :字符串变量s指向了空字符串,表示给变量s分配了内存空间,只不过s指向了一个长度为零的空字符串对象。
string s = null :字符串变量s指向了空引用null,表示s没有引用任何对象,即没有给变量s分配内存空间。
C#中,new有几种用法?
用于创建对象和调用构造函数。
用于创建匿名类型的实例。
在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员。
 

 

C#中,ref和out在修饰方法参数时有什么区别?
ref和out都可以实现将一个指定的参数按照引用进行传递:

ref参数在传入方法之前必须进行初始化;而out参数在传入方法之前可以不用初始化。
ref参数在方法内部可以直接使用;而out参数在方法内部不能直接使用。
ref参数在方法内部可以使用也可以不使用;而out参数在方法返回之前必须对其赋值。
 

C#中,using有几种用法?
导入和引用命名空间。
给类型起别名。
使用using声明的对象,可以确保在using代码块结束时,该对象所使用的资源被自动释放。
 

C#中,&和&&,|和||有什么区别?
&:按位与,表示对两个整数进行按位与运算。
&&:逻辑与,表示对两个布尔型进行逻辑与操作,即当且仅当两边的条件都为true时,表达式才返回true。
|:按位或,表示对两个整数进行按位或运算。
||:逻辑或,表示对两个布尔型进行逻辑或操作,即只要两边的条件中有一个为true,表达式就返回true。
C#中,is和as有什么区别?
is:用于检查对象是否与给定的类型兼容。
as:用于对引用类型的变量进行类型转换。
 

什么是GC?为什么要用到GC?
GC:垃圾收集器(Garbage Collection)
计算机程序在运行过程中要使用内存,需要向操作系统申请内存空间。由于内存空间是有限的,所以程序在使用完内存之后要释放内存。垃圾收集器就是一种自动进行内存管理的机制,使得程序员不需要每次手动去分配和释放内存,由垃圾收集器全权负责内存的管理工作。这样可以使程序员的关注点转移到程序的功能和业务逻辑,提高了程序的安全性、稳定性、及开发效率。
什么是委托?事件跟委托是什么关系?
委托:表示具有一类相同签名的方法的封装类型。
事件也是一种委托。
ADO.NET中访问数据库的基本步骤是什么?
创建数据库连接对象。
打开连接。
创建命令对象,执行SQL语句。
关闭连接。
 

ADO.NET中,DataSet和DataReader的区别是什么?
DataSet:数据集,表示内存中的“数据库”。DataSet在从数据库中读取数据时是“面向非连接的”,即DataSet在读取数据的那一刻会与数据库进行连接,然后会一次性把数据库中所有的表以及数据读取到内存中,然后便断开数据库连接。
DataReader:数据读取器。DataReader在从数据库中读取数据时是“面向连接的”,即DataReader在读取数据时是从数据库中一行一行读取,每次只会从数据库中读取一行数据(类似于数据库游标的行为),直到读完最后一行之后,才断开数据库连接。在整个读取的过程中,必须保持与数据库的连接处于打开状态。
ADO.NET中常用对象有哪些?
SqlConnection:连接对象,用于执行与数据库的连接。
SqlCommand:命令对象,用于对数据库执行SQL语句。
SqlDataAdapter:适配器对象,用于填充数据集和更新数据库。
SqlParameter:参数对象,用于执行参数化SQL语句。
SqlDataReader:读取器对象,用于从数据库中快速逐行读取数据。
SqlTransaction:事务对象,用于执行数据库事务。
ASP.NET
ASP.NET中的身份验证有那些?
Windows验证:ASP.NET会结合Internet信息服务(IIS),为每个用户开启Windows账户,通过Windows账户验证用户身份。
Forms验证:ASP.NET通过Web表单,为每个用户创建一个用cookie保存的身份验证票据,通过该票据验证用户身份。
Passport验证:由 Microsoft 提供的集中身份验证服务,通过将每个用户的信息提交给Passport 登录服务网站进行用户身份的验证。
Server.Transfer与Response.Redirect有什么区别?
Server.Transfer:服务器端重定向,在服务器内部将请求从A页面重定向到B页面。由于是在服务器内部进行重定向,浏览器端并不知道服务器内部发生了重定向,因此浏览器的地址栏显示的URL不变,仍是最初请求的A页面。服务器端重定向不能跨站点。
Response.Redirect:客户端重定向,服务器向客户端浏览器发送一个重定向信号和重定向的URL地址,浏览器收到该信号后,重新去请求要重定向的URL地址。由于重定向是发生在浏览器端,因此浏览器的地址栏会变成重定向后的URL。浏览器端重定向可以跨站点。
ASP.NET 中页面之间传递值的几种方式?
QueryString(查询字符串):通过URL中的查询字符串(Default.aspx?id=5&name=abc)传值。
优点:简单便捷。

缺点:安全性差,且长度大小有限制。

Session:通过会话状态传值。
优点:当前会话中的所有页面均可使用,且能够传递任何对象。

缺点:可能会丢失(Session过期或失效等情况)。

Cookie:通过客户端Cookie传值。
优点:读取该Cookie的所有页面都可以使用。

缺点:只能够存储文本信息(字符串),且大小不能超过4KB。

Application:通过全局应用程序对象传值。
优点:整个应用程序都可以使用,且能够传递任何对象。

缺点:可能会产生并发问题。

Server.Transfer:通过服务器端重定向传值。
优点:可以将与最初请求相关的所有数据传递给重定向的页面。

缺点:资源消耗比较大。

什么是“Code-Behind”技术?
Code-Behind:代码隐藏技术,在ASP.NET中aspx页面通过其页面指令@Page,将页面的处理逻辑代码分离到另一个cs文件中,从而将页面的显示逻辑和处理逻辑分离,提高了页面的可维护性,并且不同职责的开发人员(程序员、美工)可以并行开发,提高了开发效率。
ASP.NET中调用Web Service的方法有哪些?
通过HTTP-GET请求调用。
通过HTTP-POST请求调用。
通过SOAP请求调用。
怎样理解web应用程序的“无状态编程”?
Web应用程序是基于HTTP协议的,而HTTP协议具有无状态性。即客户端向Web服务器发送HTTP请求,服务器接收到请求,将相应的内容发送给客户端。在这一过程中,服务器不会主动记录任何有关客户端请求的信息,在本次请求结束后,服务器也不会保存有关本次请求的任何信息——所有的请求、响应都是即时的,当请求结束后,与本次请求相关的所有资源都将被释放。所以当客户端下一次向Web服务器发送请求时,服务器并不知道该客户端之前有没有发送过请求,也不知道本次请求是第几次请求。这便是Web应用程序的无状态性。
Session有什么缺点?可以使用什么方法加以解决?
Session缺点:默认情况下Session的存储采用的是“InProc”配置,即存储在IIS进程内存中,当IIS重启或发生进程回收时,Session则会丢失。
解决方法:可以将Session配置为“StateServer”或“SQLServer”——存储在状态服务进程或数据库中,可以避免丢失,但此时无法捕获Session_End事件。
ASP.NET中所有自定义用户控件都必须继承自哪一个类?页面必须继承哪一个类?
用户控件基类:System.Web.UI.UserControl。
页面基类:System.Web.UI.Page。
向服务器发送请求有几种方式?
GET:向服务器请求数据。
POST:向服务器提交数据。
Web Service有哪些优点?
Web Service是基于XML的,与具体的语言和平台无关,故可以实现跨平台、跨语言通信。
Web Service是采用SOAP协议(简单对象访问协议)进行通信的,该协议基于HTTP协议,故可以实现跨防火墙通信。
Web Service可以很容易的实现分布式的应用程序。
ASP.NET缓存有几种实现方式?
页面输出缓存:将页面全部进行缓存。
页面局部缓存:将页面中的一部分放在用户控件中,对该部分进行缓存。
数据缓存:使用Cache类进行数据缓存。
客户端缓存:使用HttpCachePolicy类进行客户端(浏览器)缓存。
 

 

什么是ViewState?有什么作用?
ViewState:视图状态。
Web 应用程序是无状态的。每次从服务器请求网页时,都会创建网页类的一个新实例。这通常意味着在每次往返过程中将会丢失所有与该页面及其控件关联的信息。为了克服 Web 编程的这一固有局限性,ASP.NET 页框架包含了状态管理功能,可以在往返过程之间保存页和控件的相关联的信息及其值。这便是视图状态。
ASP.NET中常见文件的后缀名有哪些?
aspx:页面
ascx:用户控件
asmx:Web Service
ashx:一般处理程序
asax:Global.asax,全局应用程序配置
ASP.NET中的六大对象有哪些?
Request、Response、Server、Session、Cookie、Application

jquery中实现Ajax请求的常用方法有哪些?有什么区别?
$.get方法:通过get方式发送请求。
$.post:通过post方式发送请求。
$.ajax:可以使用指定的方式来发送请求。$.ajax方法是jquery中发送Ajax请求的最底层方法,可以完全自定义发送请求时的相关参数。
安全性方面get不如post
传值的大小有限制 get原则只能传1024字节
Get传值的时候 接受要用Reques.QuerString   post则用Request.Form
手动实现Ajax请求的步骤是什么?async javascript and XML
创建XMLHttpRequest对象
调用open方法初始化请求
设置回调函数
发送请求
MVC中的各个字母分别代表什么含义?在MVC框架中起什么作用?
M:Model,模型,是应用程序的数据处理逻辑部分,用于数据的访问。
V:View,视图,是应用程序的数据显示部分,用于呈现页面。
C:Controller,控制器,是应用程序流程控制部分,用于处理请求逻辑,访问模型数据。
MVC请求的处理过程?
请求到达服务器后,首先进入路由系统进行验证,如果请求的Url地址格式符合路由的定义,则将请求交给控制器中的方法进行处理。在方法中,可能会访问模型中的数据、处理相应的业务逻辑,然后方法将根据请求的内容返回一个适当的视图呈现给客户端。
SQL Server
写出一条Sql语句: 取出表A中第31条到第40条记录(SQL Server, 以自动增长的ID作为主键,  注意:ID可能不是连续的)。
方法一:
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 

请说出SQL Server中三种表连接的方式inner join、left join、right join的区别及对最终查询的结果的影响。
inner join:内联查询,查询出满足on条件的两个表的公共交集。
left join:左外联查询,left outer join的简写形式,以左边的表为基准与右边的表进行关联,连接查询出满足on条件的结果,但左表的数据会完全保留,其中右表中无法满足on条件的数据会在连接的结果中用null与左表数据补齐。
right join:右外联查询,right outer join的简写形式,以右边的表为基准与左边的表进行关联,连接查询出满足on条件的结果,但右表的数据会完全保留,其中左表中无法满足on条件的数据会在连接的结果中用null与右表数据补齐。
 

 

存储过程和函数的区别?
函数是可以嵌入在sql语句中使用的,比如函数可以作为查询语句的一个部分来调用;存储过程大多是作为一个独立的部分来执行,存储过程需要通过exec调用。
函数限制比较多,比如不能用临时表,只能用表变量等;而存储过程的限制相对就比较少,几乎所有的Sql代码都可以使用。
一般来说,存储过程实现了业务逻辑的功能,比较复杂;而函数实现的功能针对性比较强,用于完成单一目的功能。
对于存储过程来说可以返回一个或多个输出参数,也可以返回多个结果集,而函数只能返回一个值或者表对象。
数据库索引是什么?有什么作用?
数据库索引:是数据库表中一列或多列的值进行排序的一种结构。
作用:索引类似于一本书的目录,主要用于加快从表中查询数据的速度。
数据库索引的分类及区别?
聚集索引:表示索引中的结构与表中相应行的数据在物理磁盘上存储的顺序相同的索引。
非聚集索引:表示索引中的结构与表中相应行的数据在物理磁盘上存储的顺序不相同的索引。
什么是事务?它有哪些特性?
事务:执行单个逻辑功能的一组操作称为事务。事务是一个最小的工作单元,不论执行成功与失败都作为一个整体进行工作。
事务的ACID特性:

原子性(Atomicity):事务的执行是作为原子的,即不可再分。整个语句作为一个不可再分的执行单元,要么都执行,要么都不执行。
一致性(Consistency):在事务开始之前和事务结束之后,所有的数据都保持一致状态。
隔离性(Isolation):事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,中间某一时刻的数据。
持久性(Durability):事务完成之后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
使用事务最大的好处是什么?
事务最大的好处就是可以保证数据的完整性和一致性,因为事务要么全部执行成功,要么全部执行不成功。
SQL Server中,触发器分为哪几种?分别代表什么含义?
SQL Server中触发器主要分为两大类:

DML触发器:当数据库中发生数据操作语言 (DML) 事件时将调用DML触发器。DML事件包括在指定表或视图中修改数据的 INSERT 语句、UPDATE 语句或 DELETE 语句。
DML触发器又分为:

after触发器(之后触发):在执行了 INSERT、UPDATE 或 DELETE 语句操作之后被触发。可以定义三种类型:INSERT触发器、UPDATE触发器、DELETE触发器。after触发器只能定义在表上。
instead of 触发器 (之前触发):instead of触发器也叫替代触发器,表示并不执行其定义的操作(INSERT、UPDATE、DELETE),而是仅执行触发器本身。既可以在表上定义instead of触发器,也可以在视图上定义。
DDL触发器:当数据库中发生数据定义语言 (DDL) 事件时将调用DDL触发器。DDL事件主要与以关键字 CREATE、ALTER 和 DROP 开头的SQL语句对应。
delete和truncate有什么区别?
delete可以带where条件,用于删除指定条件的数据;truncate和table组合在一起使用“truncate  table 表名”,truncate不能带where条件。
不带where条件的delete和truncate都用于删除表中的所有数据,但如果表中有自增长列,delete在删除所有数据之后,下一次插入新的数据时自增长列依然紧接着最后一次的数值的下一个;而truncate删除所有数据后,下一次插入新数据的自增长列的数值将被重置,重新开始。
union和union  all的区别?
union 和 union  all都可以用作两张表数据的合并:

union:在合并时会去除掉重复的记录。
union all:直接合并,对重复的记录不作处理。
SQL Server中,有一张学生成绩表,有三个字段:学生ID,学生姓名,考试成绩。如何查询出成绩排在前三名的学生?(注意:可能会有并列名次)
select * from (

select *,dense_rank() over (order by 学生成绩 desc) No 

from 学生成绩表

) t where No<=3

SQL Server排名函数:row_number()、rank()、dense_rank()
区别:
 

 

 

SQL Server中,向一个表中插入了新数据,如何得到自增长字段的当前值?
select  @@identity

SQL Server中,游标有什么作用?如何知道游标已经到了最后?
作用:从包括多条数据记录的结果集中每次提取一条记录。游标类似于程序代码中对集合的遍历循环,能够遍历结果中的所有行,在遍历过程中,每次只读取一行的数据。
当全局变量@@fetch_status的值不等于0时,表示游标已经到了最后。
算法
请使用递归算法来实现计算1+2+3+4+…+100的结果。
class Program

{

static void Main(string[] args)

{

int total = Sum(100);

Console.WriteLine(total);

}

 

static int Sum(int x)

{

if (x <= 1)

return x;

else

return x + Sum(x - 1);

}

}

请实现一个冒泡排序算法。
public static void Sort(int[] nums)

{

int temp;

for (int i = 0; i < nums.Length - 1; i++)

{

for (int j = i + 1; j < nums.Length; j++)

{

if (nums[j] < nums[i])

{

temp = nums[i];

nums[i] = nums[j];

nums[j] = temp;

}

}

}

}

请实现一个方法,对于输入的任意字符串,统计出其中每一种字符出现的次数。
public static void CountChar(string s)

{

Dictionarydic = new Dictionary();

foreach (char c in s)

{

if (dic.ContainsKey(c))

{

dic[c]++;

}

else

{

dic.Add(c, 1);

}

}

foreach (KeyValuePairp in dic)

{

Console.WriteLine("字符:{0},出现次数:{1}", p.Key.ToString(), p.Value.ToString());

}

}

请手动实现一个将字符串转换为整数的方法,不要使用int.Parse、int.TryParse、Convert.ToInt32等任何类库方法。
public 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;

}

你可能感兴趣的:(.net(C#)葵花宝典)