1.根据线程安全的相关知识,分析以下代码,当调用test方法时 i>10时是否会引起死锁?并简要说明理由。
public void test(int i) { lock(this) { if(i>10) { i--; test(i); } } }
不会发生死锁。int型是按值传递的,所以每次改变都是一个副本,因此不会发生死锁。但如果int换做一个object,那么死锁会发生。
2.简要谈一下您对.Net构架下remoting和Webservice两项技术的理解以及实际中的应用?
WS主要是可利用HTTP,穿透防火墙。
而Remoting可以利用TCP/IP,二进制传送提高效率。
3.什么是方法签名?
方法签名由方法名称和一个参数列表(方法的参数顺序和类型)组成。并没有返回值和访问修饰符。
4.怎样实现类中的某个方法不会被覆盖(override)?
class CC { public virtual void Print() { Console.WriteLine("CC"); } } class DD:CC { public sealed override void Print() { Console.WriteLine("DD"); } }
sealed override。则在DD的子类中则无法覆盖DD中的Print方法。
5.类可以继承多个接口么?如果这些接口中包含相同方法名呢?
可以。可以使用 完全限定接口成员名。
6.const和readonly有什么区别?
const在声明时必须初始化,而readonly则不需要。readonly只能在 声明时 或 构造函数中被初始化。
const关键字用来声明编译时常量,readonly用来声明运行时常量。
7.写出一条Sql 语句: 取出表A 中第31 到第40 记录(SQLServer, 以自动增长的ID 作为主键, 注意:ID 可能不是连续的。)
答案1: select top 10 * from A where id not in (select top 30 id from A)
答案2: select top 10 * from A where id > (select max(id) from (select top 30 id from A )as A)
答案3: select *
from (
select ROW_NUMBER() OVER (ORDER BY GroupID ASC) AS [GSort],*
from AA
) AS TA
where [GSort]>30 AND [GSort]<=40
注:
row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)。
8.请说明在.Net中常用的几种页面间传递参数的方法,并说明他们的优缺点。
session(viewstate)简单,但易丢失;
application是全局;
cookie简单,但可能不支持,可能被伪造;
input type="hidden"简单,可能被伪造;
url参数简单,显示于地址栏,长度有限制;
数据库稳定,安全,但性能相对较弱。
9.接口和类的异同?
接口和类都是类,不同的是,接口只包含方法或属性的声明,不包含具体实现方法的代码,接口可以实现多重继承,而类只能是单继承,继承接口的类必须实现接口中声明的方法或属性。
接口主要定义一种规范,统一调用方法,在大型项目中,接口整发挥着重要的作用。
10.DataReader 和DataSet 的异同。
DataReader 和DataSet 最大的区别在于,DataReader 使用时始终占用SqlConnection,在线操作数据库..任何对SqlConnection 的操作都会引发
DataReader 的异常..因为DataReader 每次只在内存中加载一条数据,所以占用的内存是很小的..因为DataReader 的特殊性和高性能.所以DataReader 是只进的..你读了第一条后就不能再去读取第一条了..DataSet 则是将数据一次性加载在内存中.抛弃数据库连接..读取完毕即放弃数据库连接..因为DataSet 将数据全部加载在内存中.所以比较消耗内存...但是确比DataReader 要灵活..可以动态的添加行,列,数据.对数据库进行回传更新操作。
11.在c#中using 和new 这两个关键字有什么意义?说出你所知道的意义?
using可以引入命名空间;在using语句里声明的变量,使用完后会自动调用Dispose方法(实现IDisposable接口)。
new:实例化变量,调用构造函数,修饰一个方法,泛型声明中用于对泛型参数的约束。
12.死锁的必要条件?怎么克服?
系统资源不足;进程的推进的顺序不合适;资源分配不当;一个资源每次只能被一个进程使用,一个资源请求资源资源时,而此时这个资源已阻塞,对已获得资源不放,进程获得资源时,未使用完前,不能强行剥夺。
13.接口是否可以继承接口?抽象类是否可以实现接口?抽象类是否可以继承实体类?
接口可以继承接口;抽象类可以实现接口;抽象类也可以继承实体类,但有条件:实体类必须有明确的构造函数。
子类在实例化的时候,必定调用父类的构造函数。
public class t { //若类未定义任何构造函数 系统会自动生成一个无参构造函数 public t() { } } public abstract class c : t { //若类未定义任何构造函数 系统会自动生成一个无参构造函数 public c():base()//未指定base的情况下 子类默认调用base() { } }
14.构造器Constructor 是否可以被继承?是否可以被Override?
Constructor 不可以被继承,因此不能被重写(Overriding),但可以被重载(Overloading).
15.当一个线程进入一个对象的方法后,其它线程是否可以进入该对象的方法?
不可以,一个对象的方法只能由一个线程访问。
16.用最有效的方法算出等已8 对于几?
2<<3
17.C#是否可以对内存直接进行操作?
C#是可以对内存进行直接操作的,虽然很少用到指针,在用的时候需要在前面加上unsafe。在.NET中使用了垃圾回收机制(GC)功能,它代替了程序员,不过在C#中不可以直接使用finalize方法,而是在析构函数中调用基类的finalize()方法。
非安全代码
非安全代码就是不在CLR完全控制下执行的代码,它可能会导致一些问题,因此他们必须用“unsafe”进行表明。
unsafe { //unsafe context .................. }
在其他一些地方也可以使用关键字“unsafe”,例如我们可以将类或方法标明为非安全的:
unsafe class Class1{} unsafe static void FastMove(int *p, int *pdi,int length){...}
18.谈谈final,finally,finallize 的区别?
final: 用于申明属性,方法和类;属性不可变,方法不可以被覆盖,类不可以被继承。
Finally:是异常处理语句结构中,表示总是被执行的部分。
Finalize:表示是object类个一个方法,在垃圾回收机制中执行的时候会被调用被回收对象的方法。
19.HashMap 和Hashtable 区别?
HashMap是Hashtable的轻量级实现,非线程安全的实现,他们都实现了Map接口。主要区别是HashMap键值可以为空null,效率可以高于Hashtable。
20.C#中委托是什么?事件是不是一种委托?
委托是一种安全的类似于函数指针,但是他比指针要安全的多,它可以把方法作为一个参数传递给另一个方法,可以理解为指向函数的引用。
事件是一种消息机制,它是一种委托,委托不带方法体。
委托是安全的函数指针:
- C或C++,int (*P)() 定义了一个指向返回值为整型的函数指针,无需关心函数参数;
- 委托则需指定具体的参数类型,个数等;
21.new的几种用法?
- 实例化对象;
- 隐藏继承自父类的方法;
- 泛型声明中对泛型参数的约束(泛型参数必须有公共无参构造函数);
class ItemFactory<T> where T : new() { public T GetNewItem() { return new T(); } }
22.任何把一个Array 复制到Arraylist 中?
- 使用foreach语句逐条加入到ArrayList;
- 使用ArrayList的Adapter方法,ArrayList list1=ArrayList.Adapter(array);
- 直接使用构造方法传入,因为Array实现了ICollection:ArrayList list3 = new ArrayList(array);
arrayList.ToArray()可以转换为数组;
23.概述反射和序列化?
反射:
反射是一种动态分析程序集、模块、类型、字段等目标对象的机制。可以用反射动态的创建类型的实例,将类型绑定到现有的对象,或从现有的对象类型里获取类型,然后调用类型的方法或访问字段和属性等。
他的实现依托于元数据。元数据是存储在PE(portable executable可移植执行)文件中的数据块,它详细记录了程序集或模块内部的结构,引用类型、程序集和清单。(大体可分为:定义表,引用表,清单表)。
序列化:
对象的序列化,是指把实例对象转换为可方便存储、传输和交互的流。
如:序列化一个对象,用HTTP通过internet在客户端和服务器之间传递该对象,在另一端用反序列化从该流中重新获得到对象。
24.UDP和TCP连接有何异同?
TCP是传输控制协议,提供的是面向连接的,是可靠的字节流服务;当用户和服务器彼此进行数据交互的时候,必须在他们数据交互前要进行TCP连接之后才能传输数据;TCP提供超时重拨,检验数据功能。
UDP是用户数据报协议,是一个简单的面向数据报的传输协议,是不可靠的连接。
25.进程和线程的理解?
进程是比线程大的程序运行单元,都是由操作系统的系统运行单元。一个程序中至少要有一个进程;一个进程中,至少要有一个线程;
线程的划分尺度要比进程要小,进程拥有独立的内存单元,而线程是共享内存的,从而极大的提高了程序的运行效率,同一个进程中的多个线程可以并发执行。
26.什么叫应用程序域?什么是托管代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS 和CLR 分别作何解释?
应用程序域:就是为安全性、可靠性、隔离性和版本控制,及卸载程序提供的隔离边界。它通常由运行库宿主创建,应用程序域提供了一个更安全,用途更广的处理单元。
托管代码:使用CLR编译语言编译器开发编写的代码就叫托管代码。
装箱和拆箱:是把值类型转换为引用类型的过程,是隐式的,相反的过程就是拆箱,是显式的。
CTS 是公共类型系统,CLS 是公共语言规范,CLR 公共语言运行库。
强类型系统:每个变量和对象都必须具有申明类型。
27.值类型和引用类型的区别?
值类型的值是存放在堆栈中的,作为函数参数传递时,改变其值,不改变变量原有的值,而引用类型的值是存放在堆中的,其引用的地址是存放在堆栈中的,改变其值也就改变了变量原有的 值。值类型不允许包含null 值,然而可空类型可以将null 赋值给值类型。
28.ASP.net 的身份验证方式有哪些?
windows,forms,passport。
29.解释一下UDDI、WSDL 的意义及其作用?
UDDI是统一描述集成协议,是一套基于Web的,分布式的,为WEB服务提供的信息注册的实现标准规范,同时为也是为企业本身提供的web服务注册以让别的企业能够发现并访问的协议标准。提供了基于标准的规范,用于描述和发现服务,还提供了一组基于因特网的实现。
WSDL是一个基于XML的描述WEB服务的接口。
30.SOAP?
简单对象访问协议:是在分布式环境中,交换信息并实现远程调用的协议。是一个基于XML的协议。使用SOAP可以不考虑任何传输协议,但通常还是HTTP协议,可以允许任何类型的对象或代码。在任何平台上,以任一种语言相互通信,它是一种轻量级协议。
31.如何理解.net 中的垃圾回收机制?
.NET 中的垃圾回收机制是引用程序对内存的回收和释放。当每次用new关键字创建一个对象时,运行库都要从托管堆中为其分配内存,因为空间是有限的,最终垃圾回收机制是要回收不用的内存的。已释放内存,重新使用。
32.能用foreach 遍历访问的对象需要实现?
实现IEnumerable接口或声明GetEnumerator方法的类型。
33.Heap 与stack 的差别?
Heap是堆,空间由手动操作分配和释放的,它是存储区很大的自由存储区。
Statck是栈,是由操作系统自动分配和释放的,栈上的空间是有限的。程序在编译期间变量和函数分配内存都是在栈上进行的,且在运行时函数调用时的参数传递也是在栈上运行的。