第512篇--Interview Summary (.NET)
.NET面试基本知识总结,希望对亲们有用
1 ADO.NET 5 个对象?
DBConnection, DBCommand, DBAdapter, DataSet, DBDataReader
2 O/R Mapping? Hibernate 框架
读取配置,根据配置中的类名路径和字段名进行反射实例化,调用方法取值赋值
3 WCF安全机制?
传输安全(Transfer Security)、授权或者访问控制(Authorization OR Access Control)以及审核(Auditing.
4 Const vs readonly?
用 const 修饰符声明的成员叫常量,是在编译期初始化并嵌入到客户端程序
static readonly, 用 static readonly 修饰符声明的成员依然是变量,只不过具有和常量类似的使用方法:通过类进行访问、初始化后不可以修改。但与常量不同的是这种变量是在运行期初始化.
5 可以有两个UI线程不?why?
No
6 P/Invoke是什么?Extern 是什么意思?
[DllImport("User32.dll")]
static extern Boolean MessageBeep(UInt32 beepType); 导入外部的win32程序集
7 params 有什么用?
params 关键字在方法成员的参数列表中使用,为该方法提供了参数个数可变的能力, 在只能出现一次并且不能在其后再有参数定义,之前可以. (也就是说是最后一个参数)
8 中间语言IL作用?
使用托管代码的优点是显而易见的,主要有以下3个方面:1,平台无关性;2,提高性能;3,语言的互操作性。
9强类型系统?
所谓的强类型,指的是类型是明确的!
为了保证类型的明确性,强类型的语言的成员、变量必须声明明确的类型,而且要先声明后使用.
强类型是安全的数据类型,执行效率高,弱类型是“动态语言”,执行的时候,编译器才知道是什么类型。
10 解释文件系统为什么会存在数据冗余?这种数据冗余会导致哪两类典型的问题?
由于文件系统难于实现数据共享,因此,相同的数据可能会在多个文件中重复出现,即产生数据冗余。
数据冗余会导致数据(或更新)异常和数据不一致。
11 C# 上下文对象? 咋理解?
12 重载?
仅仅是返回值不同是不行的,一定要有参数不同(个数,类型,或是顺序).
13 Sealed? abstract?
abstract class Test11:Test22
{
public sealed override void method1() { }
public abstract override void method1() { }
}
14 为什么结构不能为无静态字段斌值?一定要在有参constructor中斌值。不能有无参constructor?
15 为什么抽象类继承实体类的时候,实体类要有明确的constructor?
16 abstract可以直接放在实例类前面吗?可以.
abstract方法可以放在实例类里面吗?不能,具有absract method表示当前这个类是abstract的,一定要在类前加abstract.
17 Static Nested class vs Inner class ?
18 死锁的必要条件?怎么克服?
答:系统的资源不足,进程的推进的顺序不合适,资源分配不当,一个资源每次只能被一个进程使用,一个资源请求资源时,而此时这个资源已阻塞,对已获得资源不放,进程获得资源时,未使用完前,不能强行剥夺。
19 Lock() 只能是针对引用类型
LockA和LockB也就相当于上述的两个学生,互相等待对方关灯,但谁也不肯先关灯,所以就死锁了.
20 抽象类可以继承实体类,但是有个条件,条件是,实体类必须要有明确的无参构造函数。
class InstanceClass
{
public InstanceClass(string str)
{
}
public InstanceClass()
{
}
}
abstract class BaseClass : InstanceClass
{
}
21 简要谈一下您对微软.NET 构架下remoting和webservice两项技术的理解以及实际中的应用。
答:WS主要是可利用HTTP,穿透防火墙。而Remoting可以利用TCP/IP,二进制传 送提高效率。
22 垃圾回收(garbage collection)
Dot Net的垃圾回收可以分为两个步骤,第一步进行“标记”,垃圾回收器假设所有的对象都是垃圾,然后开始遍历每一个“根”(根包含指向引用类型对象的一个指针,值类型对象永远不会被认为是一个根),如果发现一个根引用了一个对象(非NULL),就对对象进行标记。没有被标记的对象被认为是垃圾。第二个阶段就是“压缩”,其实就是将后面的对象移动到已经成为垃圾的对象位
置,使得原来的托管堆更为紧凑。从而释放了托管堆。
GC类中的方法影响何时对对象进行垃圾回收以及何时释放对象所分配的资源。此类中的属性提供以下信息:系统可用内存总量、对象的内存的周期类别(代).
23 Sleep and Wait?
sleep(): 为当前线程指定挂起的时间,是使线程停止一段时间,在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非“醒来”的线程具有更高的优先级.
wait():释放对象上的锁,并阻塞当前线程,直到它重新获取该锁。线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到.
24 DataTable可以作为Web Service参数传递吗?
因为DataSet处理DataTable的序列化以便进行封送处理,所以无法传递单个DataTable.
25 因为DataSet处理DaWSDL的意义及其作用?
UDDI 统一描述、发现和集成协议(UDDI,Universal De script ion,Discovery and Integration)是一套基于Web的、分布式的、为Web服务提供的信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web服务注册以使得别的企业能够发现的访问协议的实现标准。UDDI 提供了一组基于标准的规范用于描述和发现服务,还提供了一组基于因特网的实现;
WSDL 描述Web服务的公共接口。这是一个基于XML的关于如何与Web服务通讯和使用的服务描述。这是一个基于XML的,关于如何与Web服务通讯和使用的服务描述;
26 大概描述一下ASP.NET服务器控件的生命周期?
初始化、加载视图状态、处理回发数据、加载、发送回发更改通知、处理回发事件、预呈现、保存状态、呈现、处置、卸载;
27 设计模式:
1 简单工厂模式
AbstractProduct (ProductA, ProductB, ProductC, Productd)<----SimpleFactory
2 工厂模式:
AbstractProduct (ProductA, ProductB, ProductC, Productd)<----BaseFactory
(ProductAFactory,ProductBFactory,ProductCFactory,ProductDFactory)
3 抽象工厂模式:
AbstractProductA(ProductA1,ProductA2)
AbstractProductB(ProductB1,ProductB2)
AbstractFactory(ConcreteFactory1,ConcreteFactory2)
28 半分法把排序数组中元素找出来. [递归算法]
int BinarySearch(int[] a, int n)
{
int left=0;
int right=a.length-1;
int middle=0;
while(left<=right)
{
middle=(left+right)/2;
if(n<a[middle])
{
right=middle-1;
}
else if (n>a[middle])
{
left=middle+1;
}
else if (n==a[middle])
{
break;
}
}
if(left<=right) {return middle} // 找到了
else {return -1} // 没有找到
}
29 职业规划
技术再深入研究一下,做技术方面的项目管理
30 Strong name assembly?
我们知道,.Net使用Name、Version、Culture、PublicToken四个属性来唯一标识一个程序集,而不同产品前三个属性(Name、Version和Culture)完全相同的情况是有可能发生的,如此一来,这唯一标识程序集可重任就落到PublicToken的头上了.
在开发一般的、非共享的程序时,我们不需要使用强命名的程序集,仅将项目(Project)编辑成.DLL或者.EXE即可。但是,如果我们开发的是组件库、框架时,通过对程序集进行强命名,并使用将其部署到GAC中,可以保证我们的程序集不会出现版本问题.程序集的部署方式也有两种:私有部署和全局部署。
私有部署方式是:把程序集部署到应用程序的相关目录下。弱命名程序集只能进行私有部署。
全局部署方式是:把程序集部署到CLR知道的地方,CLR可以到这个地方查找到需要的程序集。强命名程序集可以进行两种部署。
.部署强命名程序集到GAC中,(我们可以使用工具GACUtil.exe,指定/i命令开关将一个程序集安装到GAC中。
31 Lock, Monitor
System.Threading.Monitor.Enter(obj);
try
{
DoSomething();
}
finally
{
System.Threading.Monitor.Exit(obj);
}
lock关键字比Monitor简洁,其实lock就是对Monitor的Enter和Exit的一个封装。
TryEnter能够有效的决绝长期死等的问题,如果在一个并发经常发生,而且持续时间长的环境中使用TryEnter,可以有效防止死锁或者长时间的等待。
比如我们可以设置一个等待时间:bool gotLock = Monitor.TryEnter(myobject,1000)Monitor.Pulse、Monitor.Wait
这两个都是非常有趣的东西,他们都只能操作已经被加锁的对象。比如lock的对象或者在同线程中Monitor.TryEnter的对象.
32 接口中只能包含方法、属性、索引器和事件的声明。不允许声明成员上的修饰符,即使是pubilc都不行,因为接口成员总是公有的,也不能声明为虚拟和静态的。如果需要修饰符,最好让实现类来声明。
所以,对比一个类,接口的特殊性是:当定义一个类时,可以派生自多重接口,而你只能可以从仅有的一个类派生。
接口是描述规则的,所以接口是不能实例化的,而字段是必须要分配内存实例化的。所以,接口只能有属性,不能有字段。这也是接口和抽象类的区别之一。接口不可以有字段,只有属性、方法.
33 sleep() 和 wait() 有什么区别?
答:sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非(a)“醒来”的线程具有更高的优先级
(b)正在运行的线程因为其它原因而阻塞。wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。
34 GC回收县体哪一代的,用什么方法?
Collect(Int32)强制对零代到指定代进行即时垃圾回收。
0,1代内存比较小,2代内存分配的比较大. 简单地把.NET的GC算法看作Mark-Compact算法。阶段1: Mark-Sweep 标记清除阶段,先假设heap中所有对象都可以回收,然后找出不能回收的对象,给这些对象打上标记,最后heap中没有打标记的对象都是可以被回收的;阶段2: Compact 压缩阶段,对象回
收之后heap内存空间变得不连续,在heap中移动这些对象,使他们重新从heap基地址开始连续排列,类似于磁盘空间的碎片整理。
Heap分为3个代龄区域,相应的GC有3种方式: # Gen 0 collections, # Gen 1 collections, #Gen 2 collections。如果Gen 0 heap内存达到阀值,则触发0代GC,0代GC后Gen 0中幸存的对象进入Gen1。如果Gen 1的内存达到阀值,则进行1代GC,1代GC将Gen
0 heap和Gen 1 heap一起进行回收,幸存的对象进入Gen2。
2代GC将Gen 0 heap、Gen 1 heap和Gen 2 heap一起回收,Gen 0和Gen 1比较小,这两个代龄加起来总是保持在16M左右;Gen2 的大小由应用程序确定,可能达到几G,因此0代和1代GC的成本非常低,2代GC称为full GC,通常成本很高。粗略的计算0代和1代GC应当能在几毫秒到几十毫秒之间完成,Gen 2 heap比较大时,full GC可能需要花费几秒时间。大致上来讲.NET应用运行期间,
2代、1代和0代GC的频率应当大致为1:10:100。
首先,GC并不是能释放所有的资源。它不能自动释放非托管资源。
第二,GC并不是实时性的,这将会造成系统性能上的瓶颈和不确定性
.NET GC使用"代"(generations)的概念来优化性能。代帮助GC更迅速的识别那些最可能成为垃圾的对象。在上次执行完垃圾回收后新创建的对象为第0代对象。经历了一次GC周期的对象为第1代对象。经历了两次或更多的GC周期的对象为第2代对象。代的作用
为了区分局部变量和需要在应用程序生存周期中一直存活的对象。大部分第0代对象是局部变量。成员变量和全局变量很快变成第1代对象并最终成为第2代对象。
每次都会扫描第0代,1/10的时间扫描第二代,1/100的时间扫描第二代.
有析构函数的对象需要垃圾收集器两次处理才能删除:第一次调用析构函数时,没有删除对象,第二次调用才真正删除对象。在链表开头的是些什么东东呢?
是局部变量, 全局变量, 静态变量, 指向托管堆的CPU寄存器. 在CLR中,它们被称之为根. 越新的对象,其生命周期越短。越老的对象,其生命周越长。
35 一般情况下,值类型存在stack中(不包括在引用中的值类型,如类的值字段,类中的引用字段,数组的元素这些都是随引用存储在受管制的堆)
引用类型存储在受管制的堆中。
4.如何有效释放非托管资源。
1)析构函数
2)继承IDisposable
IDisposable接口定义了Dispose方法,这个方法用来供程序员显式调用以释放非托管资源。使用using语句可以简化资源管理。
mySqlCommand.Dispose( );
myConnection.Dispose( );
当你把对象分配到using语句内时,C#的编译器就把这些对象放到一个try/finally块内:
using只能在编译时,那些支持IDispose接口的类型可以使用,并不是任意的对象
36确保dispose调用?
通过try…finally…代码块实现
try
{
//使用对象
conn.Open();
……
}
finally
{
//调用Dispose()方法释放对象
conn.Disponse();
}
通过using方式实现.
37类或结构的默认访问类型是internal.
类中所有的成员,默认均为private。
38 为什么类要有私有constructor?
私有构造函数是一种特殊的实例构造函数。它通常用在只包含静态成员的类中。如果类具有一个或多个私有构造函数而没有公共构造函数,则不允许其他类(除了嵌套类)创建该类的实例.
39 dispose finalize? 确保dispose得到调用,有什么机制?
非托管资源是指:所有的Window内核对象(句柄)都是非托管资源,如对于Stream,数据库连接,GDI+的相关对象,还有Com对象等等,这些资源并不是受到CLR管理;托管资源是指:由CLR管理分配和释放的资源,即由CLR里new出来的对象。
public virtual void Close()
{
this.Dispose(true);
GC.SuppressFinalize(this); //告诉GC,我已经显式调用了,你就不要调用析构method了
}
40 .NET本身用采了哪些设计模式?
1) 工厂方法模式: 在IDbConnection中定义了产生IdbCommand对象的工厂方法CreateCommand,具体的Command对象由具体的Connection对象创建。它与具体的数据库相关,不同数据库创建不同类型的Command对象。
2) 原型模式( Prototype Pattern): Net命名空间System提供了一个IConeable接口,此接口只有一个方法Clone(),只需要实现这个接口就可以实现原型模式(Prototype Pattern)了。
41单向链表的反转?
没有元素的单链表,或是只有一个元素的单链表,都是不需要反转的
递归和非递归.
42一个字符串查找另一个字符串出现的字次和位置.
do
{
foundPos = searchedStr.IndexOf(matchStr, startPos, StringComparison.Ordinal);
if (foundPos > -1)
{
startPos = foundPos + 1;
count++;
foundItems.Add(foundPos);
Console.WriteLine("Found item at position: " + foundPos.ToString());
}
} while (foundPos > -1 && startPos < searchedStr.Length);
43 深copy vs 浅 copy?
浅复制与深复制区别: 浅复制,被复制的所有变量都还有与原来对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象深复制,把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象
36 int 32是几个字节?string几个字节?
37 string 引用类型,理论上可接受长度是 Int32.MaxValue 即 2G.
int32 值类型,分配4个字节.
44 程序集是什么? namespace是什么?加载程序集?
程序集是包含一个或多个类型定义文件和资源文件的集合。它允许我们分离可重用类型的逻辑表示和物理表示.它允许我们将类型和资源划分到不同的文件中,这样程序集的使用者便可以决定将哪些文件打包在一起部署. 程序集是一个可重用、可实施版本策略和安全策略的单元. 简单地说就是一个dll或者一个exe 里面包含了很多类的定义和资源.
45 C#通过名字空间(namespace)来组织程序中的各种类型.
诸如 AppDomain 类的 CreateInstance 和 CreateInstanceAndUnwrap 之类的方法可以将程序集加载到应用程序域中。
Type 类的 GetType 方法可加载程序集。
System.AppDomain 类的 Load 方法可以加载程序集
卸载程序集:AppDomain.Unload()
46 ? ??什么意思?
? 是三元运算符 a??b 是指如果取左边的值(如果a不能null), 否则取右边的值(b).
47 DataReader和DataSet的异同
DataReader和DataSet最大的区别在于,DataReader使用时始终占用SqlConnection,在线操作数据库..任何对SqlConnection的操作都会引发DataReader的异常..因为DataReader每次只在内存中加载一条数据,所以占用的内存是很小的..因为DataReader的特殊性
和高性能.所以DataReader是只进的..你读了第一条后就不能再去读取第一条了..
DataSet则是将数据一次性加载在内存中.抛弃数据库连接..读取完毕即放弃数据库连接..因为DataSet将数据全部加载在内存中.
所以比较消耗内存...但是确比DataReader要灵活..可以动态的添加行,列,数据.对数据库进行回传更新操作...
48 工作线程更改UI线程的元素?
Winform: this.Invoke(new Action(() =>
{
progressBar1.Value = 10;
}));
WPF: this.Dispatcher.Invoke(new Action(()=>{
progressBar1.Value=20;
}));
49 概述o/r mapping 的原理
利用反射,配置 将类于数据库表映射
50 UDP连接和TCP连接的异同。
答:前者只管传,不管数据到不到,无须建立连接.后者保证传输的数据准确,须要连结.
51 SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息并执行远程过程调用的协议,是一个基于XML的协议
52 请解释web.config文件中的重要节点
appSettings包含自定义应用程序设置。
system.web 系统配置
compilation动态调试编译设置
customErrors自定义错误信息设置
authentication身份验证,此节设置应用程序的身份验证策略。
authorization授权, 此节设置应用程序的授权策略.
53 请解释什么是上下文对象,在什么情况下要使用上下文对象
上下文对象是指HttpContext类的Current 属性,当我们在一个普通类中要访问内置对象(Response,Request,Session,Server,Appliction等)时就要以使用此对象
54 应用程序域可以理解为一种轻量级进程。起到安全的作用。占用资源小
55 .Net Remoting 的工作原理是什么?
答:服务器端向客户端发送一个进程编号,一个程序域编号,以确定对象的位置
56 死锁的必要条件?怎么克服?
答:系统的资源不足,进程的推进的顺序不合适,资源分配不当,一个资源每次只能被一个进程使用,一个资源请求资源时,而此时这个资源已阻塞,对已获得资源不放,进程获得资源时,未使用完前,不能强行剥夺。
57 如何在C# winform中异步调用web services?
如果webservice有一个Get()方法。new出来一个Web Service得proxy以后,它会有一个GetAsync()的方法和一个GetCompleted的事件,注册GetCompleted事件,然后invoke GetAsync方法就可以了。3 圆形Button?---WinForm继承control类,然后在onpaint方法中来绘制按钮效果,指定Region,同时,要在
Onmousedown,Onmouseenter,Onmouseup,Onmouseleave,OnResize,OnLostFocus等方法中做一些相应的处理
57 实现防窗体闪烁的功能. 双缓冲的关键技术:
1、设置显示图元控件的几个属性: 必须要设置,否则效果不是很明显!
this.SetStyle(ControlStyles.OptimizedDoubleBuffer |
ControlStyles.ResizeRedraw |
ControlStyles.AllPaintingInWmPaint, true);
58 6 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是:通过SOAP在Web上提供的软件(服务),使用WSDL文件进行(说明),并通过(UDDI)进行注册。
59 二维数据?
int[,] a = new int[5, 6];
60 一个窗体如何访问另外一个窗体中的控件:
form2中化码加上(在vs自动生成的代码基础上加)
public string TextBox1sText{
get {return textBox1.Text;}
set {textBox1.Text = value;}
}
form1中
//在你的菜单事件中直接用
form2.TextBox1sText ="123";//注意,这里的form2是假定实例化过的.
61
public class A
{
public virtual void Show()
{
Console.WriteLine("A");
}
}
public class B : A
{
//public virtual void Show()
//{
// Console.WriteLine("B");
//}
//public new virtual void Show()
//{
// Console.WriteLine("B");
//}
public override void Show()
{
Console.WriteLine("B");
}
}
public class C : B
{
public override void Show()
{
Console.WriteLine("C");
}
}
62 静态字段-->静态构造Method-->实例字段-->实例构造Method(先去基类中调用基类的构造方法,同时,先要静态字段-->静态构
造Method-->实例字段)
public class A
{
public int a = 0; // Step 6
public static int b = 0; // Step 4
public A()
{
a = 1; // Step 7
}
static A()
{
b = 1; // Step 5
}
}
public class B : A
{
public int b = 0; // Step 3
public static int c=0; // Step 1
public B()
{
b = 1; // Step 8
}
static B()
{
c = 1; // Step 2
}
}
class Class6
{
[STAThread]
static void Main(string[] args)
{
A b = new B();
}
}
63 class B: Class
static field, static constructo, instance field, instance field
64 SoapSerializer, XmlSerializer, BinarySerializer区别
65 Delegate, event区别
以上可看出delegate与event的定义、初始化、订阅、调用方法基本完全一致,但event只可以在定义该event的类中初始化和调用,而delegate无此限制,这主要是为了防止其他类破坏了event的多播链. 其他类中只能订阅(+=)或取消订阅(-=)该event.event就是某个类发生一些事情时,通知对该事件感兴趣的客户的一种手段。
66 finally与return
try-catch-finally是很常用的语法结构,用来控制可能发生异常时的程序流程,其中catch和finally至少要有一个。初学try语法时可能会要问一个问题:如果在try块中return,那么finally还会执行吗?答案是肯定的。这个非常容易验证,就不举例子了。这样带来一些很好的特性,例如我们可以在try块中尝试打开数据库,然后读取数据,然后直接把得到的数据return出去,关闭数据连接的工作就交给finally来做——finally中先判断数据库是否正常打开了,打开了就关闭。这样代码写起来很清晰,每个部分各做各的事。这样我们也可以非常肯定的说,无论发生什么情况(只要不是进程被强行杀掉),finally中的内容一定是要执行
的。
那么是不是可以再问一个问题——如果在finally块中也写了return,那么会怎么样呢?试验一下就很容易知道,finally块中是不允许写return的,如果一定要写,就会得到一个编译期错误:
error CS0157: Control cannot leave the body of a finally clause
class Test
{
public static int count=1;
static Test ()
{
count++;
}
public Test()
{
count++;
}
}
class MyClass
{
[STAThread]
static void Main(string[] args)
{
Test t1 = new Test();
Test t2 = new Test();
var result = Test.count; // 4 why? 静态Coustructor只能运行一次
}
}
67 BigString中找SmallString,并找出所有的位置.
int i = 0;
int count = 0;
string bitStr = "redaabredjjkreddd";
string smallStr = "red";
while (bitStr.IndexOf(smallStr, i) >= 0)
{
i = bitStr.IndexOf("red", i) + 1;
count++;
}
67 Dictionary, list, SortedList 的内存,性能比较?
68 MVVM中的onpropertychanged("propertyname")-->onpropertychanged(this.propertyname)-->()=>{...怎样实现的,这里?}
69 扑克牌四种花色,A,B,C,D用设计模式,怎样做?
70 强类型程序集的证书,放在哪里?