1、简述 private、 protected、 public、 internal 修饰符的访问权限
private : 在类的内部才可以访问。
protected : 保护成员,该类内部和继承类中可以访问。
public : 公共成员,完全公开,没有访问限制。
internal: 当前程序集内可以访问。
2、ADO.NET中的五个主要对象
ado.net属于asp.net,是由asp.net编程语言编写的数据访问层的总括。
Connection:主要是开启程序和数据库之间的连接。Close和Dispose的区别,Close以后还可以Open,Dispose以后则不能再用。
Command:主要可以用来对数据库发出一些指令,例如可以对数据库下达查询、新增、修改、删除数据等指令,以及调用存在数据库中的存储过程等。
DataAdapter:主要是在数据源以及DataSet 之间执行数据传输的工作,它可以透过Command 对象下达命令后,并将取得的数据放入DataSet 对象中。
DataSet:这个对象可以视为一个暂存区(Cache),可以把从数据库中所查询到的数据保留起来,DataSet是放在内存中的。
DataSet 的能力不只是可以储存多个Table 而已,还可以透过DataAdapter对象取得一些例如主键等的数据表结构,并可以记录数据表间的关联。 DataSet包含若干DataTable,DataTable包含若干DataRow。
参考文章:
DataReader:当我们只需要循序的读取数据而不需要其它操作时,可以使用DataReader 对象。
DataReader对象只是一次一笔向下循序的读取数据源中的数据,这些数据是存在数据库服务器中的,而不是一次性加载到程序的内存中的。
只能(通过游标)读取当前行的数据,而且这些数据是只读的,并不允许作其它的操作。
总结:ADO.NET 使用Connection 对象来连接数据库,使用Command 或DataAdapter对象来执行SQL语句,并将执行的结果返回给DataReader 或 DataAdapter ,然后再使用取得的DataReader 或DataAdapter 对象操作数据结果。
DataSet和DataReader区别:
DataReader为在线操作数据, DataReader会一直占用SqlConnection连接,在其获得数据过程中其它操作不可以再使用SqlConnection连接对象。
DataSet为离线操作数据,DataSet会将数据一次性读入内存,然后断开连接,这时其它操作就可以使用SqlConnection连接对象。由于DataReader一次只读取一行数据,所以占用内存较小。但DataReader为只进且只读的,也就是只能单方向向前读取,如果你想回头去读取上一条数据是不允许的,并且不允许其修改数据。由于DataSet一次性读取所有数据,所以比较消耗资源,但也提高了灵活性,在断开数据库连接情况下你可以对数据进行任何增删改查,按照任意的顺序读取数据,并可以将其写回到数据库。有一点需要注意,DataReader一次读取一行并不意味了着这时在数据库中的数据被修改,可以读到新的数据,这是数据库层面的保护。3、列举ASP.NET 页面之间传递值的几种方式
常用的较简单有QueryString,Session,Cookies,Application,Server.Transfer。个人一般使用session和querystring来传值。
参考文章:
4、C#中的委托是什么?事件是不是一种委托?事件和委托的关系。
参考文章:
委托是C#中实现事件的基础,事件是封装过的委托实例。
其实事件就是一个狭义的委托,也就是事件是一个用于事件驱动模型的专用委托。
你可以在客户代码中直接调用委托来激发委托指向的函数,而事件不可以,事件的触发只能由服务代码自己触发。
也就是说在你的代码里委托你不但可以安排谁是它的调用函数,还可以直接调用它。而事件不能直接调用,只能通过某些操作触发。除此之此,事件拥有委托的所有功能,包括多播特性。即事件可以有多个事件处理函数,委托同样也可以是个多播委托.
5、override与重载(overload)的区别
参考文章:
6、属性和字段的区别是什么?
属性以灵活的方式实现了对私有字段的访问。
参考文章:
7、类(class)与结构(struct)的异同?
Class属于引用类型,是分配在内存的堆上的,是引用传递的。
Struct属于值类型,是分配在内存的栈上的,是复制传递的。加分的回答:Int32、Boolean等都属于结构体。
不能为结构定义默认(无參数)构造函数。在结构体中可以声明字段,但是声明字段的时候是不能给初始值的。
我们不能为结构体定义析构函数。
a、字段和赋值
b、关于构造函数
我们在变量传值的时候,我就是希望传递对象的拷贝,而不是对象的引用地址,那么这个时候也可以使用结构了。
类 结构 引用类型 值类型 一般需要封装有属性 一般公开字段无属性 有默认构造函数 隐式的无参数的构造函数在结构中无论如何都是存在的,所以程序员不能手动的为结构添加1个无参数的构造函数 无限制 在结构体的构造函数中,必须要为结构体的所有字段赋值 new时字段可以不完全初始化 必须完全初始化 必须new 可以不new 类中可以为字段赋值 结构中不可以 类值放在栈中 值放在堆中 可以被继承 不可以被继承 都可以写方法 都可以有构造函数 ...
参考文章:
8、堆和栈的区别?
栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;局部值类型变量、值类型参数等都在栈内存中。
堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小。
参考文章:
-第六节
9、GC是什么? 为什么要有GC?
GC是垃圾收集器。程序员不用担心内存管理,因为垃圾收集器会自动进行管理。
GC只能处理托管内存资源的释放,对于非托管资源则不能使用GC进行回收,必须由程序员手工回收。
一个例子就是FileStream或者SqlConnection需要程序员调用Dispose进行资源的回收。
要请求垃圾收集,可以调用下面的方法:GC.Collection()一般不需要手动调用GC.Collection()。
垃圾回收机制最好不要控制,一般GC会在最适合的时间进行垃圾回收,频繁调用GC.Collect()反而会造成不必要的资源耗费。
一般在编译的时候,编译器已经帮你添加了相应的FINALLY了,除非你很明确你使用的资源是否是非托管资源与该资源耗费的内存量。
一般涉及到数据流的,比如具有stream 特性的资源,最好都using()去控制。
10、abstract class和interface有什么区别?
相同点:
都不能被直接实例化,都可以通过继承实现其抽象方法。
不同点:
- 接口支持多继承;抽象类不能实现多继承。
- 接口只能定义行为;抽象类既可以定义行为,还可能提供实现。
- 接口可以用于支持回调(CallBack);抽象类不能实现回调,因为继承不支持。
- 接口只包含方法(Method)、属性(Property)、索引器(Index)、事件(Event)的签名,但不能定义字段和包含实现的方法;
抽象类可以定义字段、属性、包含有实现的方法。接口就是约束,约束就是针对行为(方法),属性(get,set方法)。
接口是描述规则的,所以接口是不能实例化的,而字段是必须要分配内存实例化的。
- 接口可以作用于值类型(Struct)和引用类型(Class);抽象类只能作用于引用类型。例如,Struct就可以实现接口,而不能继承类。
实现和继承是两码事。只允许实现接口,却不可以继承,本身不矛盾。
struct不能继承的一个原因是struct有固定的大小。
struct作为一种值类型使用,继承类不是搞复杂了,违反 struct设计的初衷。
参考文章:
11、是否可以继承String类?
String类是sealed类故不可以继承。 Sealed类是指密封类。
12、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行?
会执行,在return前执行。
加分的补充回答(也助记):读取数据库中数据的条数的程序
public int QueryCount()
{
…..
try
{
return cmd.ExecuteScalar();
}
finally
{
cmd.Dispose();
}
}
如果C#设计的是先执行cmd.Dispose()再执行return就会出现return执行失败了,因为cmd已经Dispose了。
finally中的代码一般都是释放资源,清除对象的,而return一般是用来返回数据的。
13、new 关键字用法
(1)new运算符:用于创建对象和调用构造函数。
(2)new修饰符:用于隐藏基类成员的继承成员。(3)new约束:用于在泛型声明中约束可能用作类型参数的参数的类型。参考文章:
14、
15、
数组的容量是固定的,您只能一次获取或设置一个元素的值。而ArrayList或List<T>的容量可根据需要自动扩充、修改、删除或插入数据。
在决定使用 List<T> 还是使用ArrayList 类(两者具有类似的功能)时,记住List<T> 类在大多数情况下执行得更好并且是类型安全的。
数组的大小在初始化时就已经决定无法改变,Arraylist是可以增加和减少,使用更灵活,操作更简单,但效率会低一些。
如果能够确定要存放的类型和个数的话建议使用数组,否则使用Arraylist。
以下是把Array数组中的值拷贝到ArrayList中去的实例用法
int[] a ={ 222, 333, 555 };
ArrayList arrList = new ArrayList(); foreach (object obj in a)//或foreach (int obj in a) { arrList.Add(obj); Response.Write(obj+"<br>"); }
16、什么是反射?
反射是.NET中的重要机制,通过反射,可以在运行时获得程序或程序集中每一个类型(包括类、结构、委托、接口和枚举等)的成员和成员的信息。
参考文章:
17、string str = null 与 string str =""说明其中的区别。
string str = null 不分配内存空间,而string str = \"\" 给它分配长度为空字符串的内存空间。
string str = null没有string对象,string str = “”有一个字符串对象。
18、接口是一种引用类型,在接口中可以声明( a),但不可以声明公有的域或私有的成员变量。
接口可以包含事件、索引器、方法和属性,不包括字段
a) 方法、属性、索引器和事件;
b)方法、属性信息、属性;
c) 索引器和字段; d) 事件和字段;19. 在ADO.NET中,对于Command对象的ExecuteNonQuery()方法和ExecuteReader()方法,下面叙述错误的是(c)。 a) insert、update、delete等操作的Sql语句主要用ExecuteNonQuery()方法来执行;
b) ExecuteNonQuery()方法返回执行Sql语句所影响的行数。 c) Select操作的Sql语句只能由ExecuteReader()方法来执行; d) ExecuteReader()方法返回一个DataReder对象;20. 下列关于C#中索引器理解正确的是(c )
a) 索引器的参数必须是两个或两个以上 b) 索引器的参数类型必须是整数型 c) 索引器没有名字 d) 以上皆非参考文章:
21、以下的C#代码,试图用来定义一个接口:
public interface IFile { int A; int delFile() { A = 3; } void disFile(); } 关于以上的代码,以下描述错误的是(d )。 a) 以上的代码中存在的错误包括:不能在接口中定义变量,所以int A代码行将出现错误; b) 以上的代码中存在的错误包括:接口方法delFile是不允许实现的,所以不能编写具体的实现函数; c) 代码void disFile();声明无错误,接口可以没有返回值; d) 代码void disFile();应该编写为void disFile(){};22、
Server.Transfer仅是服务器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;
Response.Redirect则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。
Server.Transfer是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。 这个过程中浏览器和Web服务器之间经过了一次交互。
Response.Redirect就是服务端根据逻辑发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求。这个过程中浏览器和Web服务器之间经过了两次交互。
23、StringBuilder 和 String 的区别?
答:String 在进行运算时(如赋值、拼接等)会产生一个新的实例,而 StringBuilder 则不会。所以在大量字符串拼接或频繁对某一字符串进行操作时最好使用 StringBuilder,不要使用 String
如果要操作一个不断增长的字符串,尽量不用String类,改用StringBuilder类。两个类的工作原理不同:String类是一种传统的修改字符串的方式,它确实可以完成把一个字符串添加到另一个字符串上的工作没错,但是在.NET框架下,这个操作实在是划不来。因为系统先是把两个字符串写入内存,接着删除原来的String对象,然后创建一个String对象,并读取内存中的数据赋给该对象。这一来二去的,耗了不少时间。而使用System.Text命名空间下面的StringBuilder类就不是这样了,它提供的Append方法,能够在已有对象的原地进行字符串的修改,简单而且直接。当然,一般情况下觉察不到这二者效率的差异,但如果你要对某个字符串进行大量的添加操作,那么StringBuilder类所耗费的时间和String类简直不是一个数量级的。
24、什么是viewstate,能否禁用?是否所用控件都可以禁用?
Viewstate是保存状态的一种机制,EnableViewState属性设置为false即可禁用。最有力的举例子:Label、TextBox在禁用ViewState后不同的表现来说明。
参考文章:
25. 不定项选择:
(1) 以下叙述正确的是: B C
A. 接口中可以有虚方法。B. 一个类可以实现多个接口。 C. 接口不能被实例化。 D. 接口中可以包含已实现的方法。
(2) 从数据库读取记录,你可能用到的方法有:B C D
A. ExecuteNonQuery B. ExecuteScalar C. Fill D. ExecuteReader
(3)对于一个实现了IDisposable接口的类,以下哪些项可以执行与释放或重置非托管资源相关的应用程序定义的任务?(多选) ( ABC )
A.Close B.Dispose C.Finalize D.using E.Quit
(4)以下关于ref和out的描述哪些项是正确的?(多选) ( ACD )
A.使用ref参数,传递到ref参数的参数必须最先初始化。
B.使用out参数,传递到out参数的参数必须最先初始化。
C.使用ref参数,必须将参数作为ref参数显式传递到方法。
D.使用out参数,必须将参数作为out参数显式传递到方法。
26. 单项选择:
(1)下列选项中,(C)是引用类型。
a)enum类型 b)struct类型 c)string类型 d)int类型
(2)关于ASP.NET中的代码隐藏文件的描述正确的是(C)
a)Web窗体页的程序的逻辑由代码组成,这些代码的创建用于与窗体交互。编程逻辑唯一与用户界面不同的文件中。
该文件称作为“代码隐藏”文件,如果用C#创建,该文件将具有“.ascx.cs”扩展名。
b)项目中所有Web窗体页的代码隐藏文件都被编译成.EXE文件。
c)项目中所有的Web窗体页的代码隐藏文件都被编译成项目动态链接库(.dll)文件。
d)以上都不正确。
(3)下列描述错误的是(D)
a)类不可以多重继承而接口可以;
b)抽象类自身可以定义成员而接口不可以;
c)抽象类和接口都不能被实例化;
d)一个类可以有多个基类和多个基接口;
27、通过超链接怎样传递中文参数?
用URL编码,通过QueryString传递,用urlencode编码 用urldecode解码
参考文章:
28、下面程序的执行结果是什么?
static void Main(string[] args)
{
Console.WriteLine(Calc());
Console.ReadKey();
}
static int Calc()
{
int i = 0;
try
{
return i;
}
finally
{
Console.WriteLine("finally");
i++;
}
}
答案:
finally
0
29、
30、下面程序的执行结果是什么?
public struct Point
{
public int x;
public int y;
public Point(int x, int y)
{
this.x = x;
this.y = y;
}
}
Point p1 = new Point(100, 100);
Point p2 = p1;
p1.x = 200;
Console.WriteLine("{0},{1}", p1.x, p2.x);
答案:
200,100