第一部份 Net 基础
1. 大致说明.Net Framework由哪几部份组成?
.NET编译工具,包含VB编译器、C#编译器等;
CLR(Common Language Runtime):通用语言运行库;
.NET Framework 核心类库;
2. 简述Solution 和 Project 的关系?
Solution意即“解决方案”,它可由一个或多个Project组成;
Project意即“项目”、“工程”或“项目”.
3. Assembly可分为几种形式部署?分别说明
分为Global和Private两种
Global Assembly Cache:
是全局的,引用GAC的时候,可选择是否Copy Local;
Private Assembly:只能复制到本地使用。
4. 变量可分为数值型别和参考类型两种,请简述这两种类型主要有哪些内容?
Value Type值类型变量直接存储数据
分为Simple类型、enum类型、struct类型、Nullable类型;
均继承于ValueType类,Simple、Nullable类型均是Struct类型;
Simple类型
有符号整形:
Sbyte、short、int、long
无符号整形
Byte、ushort、uint、ulong
IEEE浮点
Float、double
高精度小数型
Decimal
Unicode字符
Char
布尔型
bool
Reference Type引用类型变量存储对数据的引用
分为Class类型、Interface类型、Array类型、Delegate类型,object、string、dynamic
其它
void
var
Array和Delegate类型均是Class类型
5. 简述“装箱”和“拆箱”的区别?
装箱就是将值类型转换成引用类型(隐式转换),而拆箱就是将引用类型转换成值类型(显示转换)。
6. 简述Public、Protected、Internal、Protected Internal、Private的访问范围?
public:访问不受限制
protected:访问仅限于此类或从此类派生的类
Internal:访问仅限于此程序
Protected Internal:访问仅限于程序或从此类派生的类
Private:访问仅限于此类
7. = = 与Equals方法的区别?
==:比较的是2个对象的地址。
Equals:比较的是2个对象的内容。
8. 计算从1加到99的结果。(注意:要使用c#语言定义整型变量和使用循环语法
完成)
static void Main()
{
int sum=0;
for(int i=1;i<100;i++)
{
sum+=i;
}
Console.writeLine(sum);
}
9. 分别写出四种循环语法
for:
static voie Main(string[] args)
{
for(int i=0;i<args.length;i++)
{
Console.writeLine(args[i]);
}
}
foreach:
static voie Main(string[] args)
{
foreach(string s in args)
{
Console.writeLine(s);
}
}
while
static voie Main(string[] args)
{
int i=0;
while(i<args.Length)
{
Console.WriteLine(args[i]);
i++;
}
}
do
static voie Main(string[] args)
{
int i=0;
do
{
Console.WriteLine(i);
i++;
}while(i<args.Length)
}
10. 引用傳遞和值傳遞的區別?
引用传递,传递的是引用对象的内存地址。
值传递是将要传递的值作为一副本传递。
11. 分别写出资料类型转换(至少四种)的方法,代码举例
显式转换:string a=(string)5;
隐式转换:float a=10;
Parse转换:int i=int.parse("test")
静态类Convert提供的方法:
Int x=11;Double d=Convert.ToDouble(x);
12. 异常处理各关键字的作用
Try:一般情况下用try来执行一段程序。
catch:如果出现异常,则直接跳转执行catch部分(前提此catch获取了异常)。
finally:不管是否有导常都会执行finally中的内容。
throw:抛出异常。
throws用来标明一个成员函数可能抛出的各种"异常"。
第二部份 .NET核心類庫
1. 寫出out與ref的區別:都可以將參數值的更改保留
ref 要求必須在傳遞之前進行初始化。而对于out而言,必须在方法中对其完成初始化。
使用ref和out时,在方法的参数和执行方法时,都要加Ref或Out关键字。以满足匹配。
out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。
2. is和as的區別
is是用来判断某个对象是否是某种类型
as是用来强制转换类型的
3. 定义界面(隐式和显式实现两种)
public interface ITestInterface
{
string GetData(int value);
}
隐式實現:直接寫方法名 GetData();
显式实现:接口.方法名 ITestInterface.GetData();
4. 简述界面和抽象类别的区别?
区别一,两者表达的概念不一样。抽象类是一类事物的高度聚合,那么对于继承抽象类的子类来说,对于抽象类来说,属于“是”的关系;而接口是定义行为规范,
区别二,抽象类在定义类型方法的时候,可以给出方法的实现部分,也可以不给出;而对于接口来说,其中所定义的方法都不能给出实现部分。
区别三,继承类对于两者所涉及方法的实现是不同的。继承类对于抽象类所定义的抽象方法,可以不用重写,也就是说,可以延用抽象类的方法;而对于接口类所定义的方法或者属性来说,在继承类中必须要给出相应的方法和属性实现。
区别四,在抽象类中,新增一个方法的话,继承类中可以不用作任何处理;而对于接口来说,则需要修改继承类,提供新定义的方法。
| 接口 | 抽象类 |
多继承 | 支持 | 不支持 |
类型限制 | 没有 | 有,只能是引用类型 |
方法实现 | 继承类型中必须给出方法实现 | 继承类中可以不给出 |
扩展性 | 比较麻烦 | 相对比较灵活 |
多层继承 | 比较麻烦,需要借助虚函数 | 比较灵活 |
5. StringBuilder处理字符串和String有何分别?
String的不足之处:
长度固定,如果通过“+”来附加内容的话,会产生新的String实例,频繁会造成性能低下;
StringBuilder:长度是可变的,它可以通过以下方法来实现内容的增加,移除,替换等,不会产生新的实例。
Append:在内容最后处添加内容
Insert:在内容指定位置处添加内容
Remove:在内容指定位置处移除内容
Clear:清除所有内容
Replace:替换其中某个内容为新的内容
ToString:将StringBuilder中的内容转换为String
6. 如何在服务器端通过规则表达式来检验用户端的输入?
第一步:定义接口,在接口上面写上[ServiceContract]
第二步:在接口内部写一个获取用户输入信息的方法,在方法上加上[OperationContract]
第三步:新增一个类继承上面的接口,然后实现对应的方法,如下:
[ServiceContract]
public interface ImyService
{
[OperationContract]
string GetData(int value);
[OperationContract]
CompositeType GetDataUsingDataContract(CompositeType composite);
}
public class myService : ImyService
{
public string GetData(int value)
{
return string.Format("You entered: {0}", value);
}
public CompositeType GetDataUsingDataContract(CompositeType composite)
{
if (composite == null)
{
throw new ArgumentNullException("composite");
}
if (composite.BoolValue)
{
composite.StringValue += "Suffix";
}
return composite;
}
}
7. 字符编码主要分为哪几类?常见的有哪些?
ASCLL码
Encoding ascll=Encoding.ASCLL;
byte[] asc=ascll.GetBytes("a");
非ASCLL码:
Encoding GB2312=Encoding. GetEncoding("GB2312");
byte[] asc=GB2312.GetBytes("a");
Unicode码:
Unicode
UTF8码
UTF7\UTF16,UTF32
Base64编码、译码
8. 访问档案系统,可通过哪三个静态类来完成?
File
Directory
Path
9. 常用的集合(collection)有哪些?至少举例4个
ArrayList,SortedList,ArrayList,Hashtable,Queue,Stack
10. 常用的泛型(Generic)有哪些?至少举例4个
List<T>
LinkedList<T>
SortedList<tKey,Tvalue>
Dictionary<TKey,TValue>
SortedDictionary<TKey,TValue>
Queue<T>
Stack<T>
11. 常见的XML处理方式有哪些?至少举例一种
常见的XML处理方式有:DOM,SAX,JDOM,JDM4J,LinQ to XML
LinQ to XML
public static void CreateDocument()
{
string path = @"d:\website";
XDocument xdoc =new XDocument(newXDeclaration("1.0","utf-8", "yes"),
new XElement("Root","root"));
xdoc.Save(path);
}
第三部份 .NET高级程序设计
1. 为何要使用LinQ?LinQ有哪几类?至少举例说明3种
使用LINQ 能使程序员编写更少代码即可创建完整应用,能更快开发错误更少的应用程序,让开发者开发效率更高。
分类:
LinQ to Object
LinQ to SQL (引入System.Data.Linq.dll)
LinQ to Entity
Database First (引入System.Data.Entity.dll)
Model First (引入System.Data.Entity.dll)
Code First (引入EntityFramework.dll)
LinQ to XML
LinQ to DataSet
2. 为什么要使用多执行绪技术?至少举例说明三种多执行绪的具体使用方式
多执行技术能提高CPU的利用率,使程序运行速度大大提高。
创建多线程的方法主要有三种:Thread、ThreadPool、Timer
Thread thread=new Thread(new ThreadStart(Method));
thread.Priorty=ThreadPriority.Highest;
thread.Start();
ThreadPool:
两个重要的静态方法:
QueueUserWorkItem
RegisterWaitForSingleObject
ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadFunc),8);
Timer
通过构造Timer来实现和管理多线程,代码如下:
Timer timer=new Timer(new TimerCallback(TimerCall),3,1000,1000);
3. 为什么要使用反射技术?具体实现方式有几种?至少举例两种
为了更好地扩展程序的开发。所以使用反射技术。
Type
三个静态方法
GetType:一般取得类型的静态方法
GetTypeFromProgID:通过ProgID获取类型值
GetTypeFromCLSID:通过CLSID获取类型值
创建实例:
Activator.CreateInstance
Assembly静态方法:
Assembly.Load:
当前目录下的Assembly
Assembly.LoadFrom:
当前目录下的Assembly,但需带上后缀名
Assembly.LoadFile
自定义完整目录的Assembly
4. 为何要序列化和反序列化技术?至少举例说明两种具体的实现方式.
序列化可以将内存中的类写入文件或数据库中。比如将某个类序列化后存为文件,下次读取时只需将文件中的数据反序列化就可以将原先的类还原到内存中。也可以将类序列化为流数据进行传输。总的来说就是将一个已经实例化的类转成文件存储,下次需要实例化的时候只要反序列化即可将类实例化到内存中并保留序列化时类中的所有变量和状态。
目的就是持久化对象。
两种序列化方法:
XML序列化
staticvoidMain(string[] args)
{
inti = 10;
//声明Xml序列化对象实例serializer
XmlSerializer serializer = newXmlSerializer(typeof(int));
//执行序列化并将序列化结果输出到控制台
serializer.Serialize(Console.Out, i);
Console.Read();
}
}
XML反序列化:
staticvoidMain(string[] args)
{
using(StringReader rdr = newStringReader(@"<?xml version=""1.0"" encoding=""gb2312""?>
<int>10</int>"))
{
//声明序列化对象实例serializer
XmlSerializer serializer = newXmlSerializer(typeof(int));
//反序列化,并将反序列化结果值赋给变量i
inti = (int)serializer.Deserialize(rdr);
//输出反序列化结果
Console.WriteLine("i = "+ i);
Console.Read();
}
}
二进制序列化
//BinaryFormatter将对象序列化到文件中
List<string> inputList = new List<string>() { "测试","test","test"};
using (FileStream fsWriter = new FileStream(@"test.tmp",FileMode.Create,FileAccess.Write)) {
BinaryFormatter bf = new BinaryFormatter(); //序列化
bf.Serialize(fsWriter, inputList);
}
二进制反序列化
//BinaryFormatter将文件中的数据反序列化出来
List<string> outputList = new List<string>();
using (FileStream fsReader = newFileStream(@"gz168168.tmp",FileMode.Open,FileAccess.Read)) {
BinaryFormatter bf = new BinaryFormatter(); //反序列化
outputList = (List<string>)bf.Deserialize(fsReader);
}
5. 为何要使用委托技术?事件的实质是什么?举例说明常见的使用场景。
把方法的引用封装在委托对象中(把过程的调用转化为对象的调用,充分体现了委托加强了面向对象编程的思想。),然后把委托对象传递给需要引用方法的代码,这样在编译的过程中我们并不知道调用了哪个方法,这样一来,C#引入委托机制后,使得方法声明和方法实现的分离,充分体现了面向对象的编程思想。
事件就是委托的一个实例。
如果因为某一个事物引起另外其它几个事物(相同参数,以及相同返回类型)的发生就可以使用委托技术。
6. Web Service是一种什么技术?具体说明其核心要素
Web service是一个平台独立的,松耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。
核心要素:SOAP, WSDL (Web Services Description Language),UDDI( Universal Description Discovery and Integration,soap用来传递信息的格式, WSDL 用来描述如何访问具体的接口, uddi用来管理,分发,查询webService具体实现可以搜索 Web Services简单实例。