c#面试题(1)
下面的题目是我从网上搜集来的一下面试题,我自己写的答案,有什么错误的地方请大家也帮我纠正一下。
1. C#中 property 与 attribute的区别,他们各有什么用处,这种机制的好处在哪里?
property用法
get/set方法。主要用于类与外部程序之间的数据交互使用。增加了对类内部数据访问的安全性和方便性,在编译期就可以进行类型检查和访问权限检查。
attribute用法
[STAThread]
public void Thrd(){...}
attribute是一个派生自System.Attribute基类的类。attribute可在反射中被枚举,查询。(当编译器看到一个属性被附着给一个类型或成员时,它会搜索
具有指定属性名的System.Attribute派生类。如果编译器没有找到匹配的类,它就在指定的属性名后面加上Attribute,然后再进行搜索。因此,常见的使
用做法是将属性类名定义为以Attribute结尾,在使用时忽略名称的这一部分。)使用Attribute可以让用户把自定义的信息附属到实体上,还可以在运行时
动态查询,这些信息不仅可以被用户取出来作为一种类型的标注,它更可以被编译器所识别,作为编译时的一种附属条件参加程序的编译。举例如
[STAThread]和[MTAThread]线程模式属性,通过这两个属性可以指定线程是单线程模式还是多线程模式。(线程模型只影响使用COM interop的应用程
序,将这个属性应用于不使用COM interop的程序将不会产生任何效果。)
几个常用的属性:
AttributeUsage | Class | 指定另一个属性类的有效使用方式
CLSCompliant | 全部 | 指出程序元素是否与CLS兼容
Conditional | Method | 指出如果没有定义相关联的字符串,编译器就可以忽略对这个方法的任何调用
DllImport | Method | 指定包含外部方法的实现的DLL位置
STAThread | Method(Main) | 指出程序的默认线程模型为STA
MTAThread | Method(Main) | 指出程序的默认模型为多线程(MTA)
Obsolete | 除了Assembly、Module、Parameter和Return | 将一个元素标示为不可用,通知用户此元素将被从未来的产品
ParamArray| Parameter |允许单个参数被隐式地当作params(数组)参数对待
Serializable| Class、Struct、enum、delegate |指定这种类型的所有公共和私有字段可以被串行化
NonSerialized |Field| 应用于被标示为可串行化的类的字段,指出这些字段将不可被串行化
StructLayout| Class、struct |指定类或结构的数据布局的性质,比如Auto、Explicit或sequential
ThreadStatic |Field(静态) |实现线程局部存储(TLS)。不能跨多个线程共享给定的静态字段,每个线程拥有这个静态字段的副本
2. 讲一讲你理解的web service,在dot net framework中,怎么很好的结合xml?
我个人理解web service是跨网络提供服务的一项技术的集合,主要通过各种不同的协议来实现一个服务的支持,比如http(Hypertext Transfer Protocol) 协议,xml(eXtensible Markup Language),soap(Simple Object Access Protocol)协议,WSDL (Web Services Description Language),UDDI (Universal Description, Discovery and Integration)。.net framework中提出了xml web service的概念。这个概念主要阐述了,将xml web service作为一个英特网上进行分布式计算的基础构架。开放标准和通信,实现通过人与应用程序的协作,通过xml web service整合应用程序来创建一个平台。应用程序从不同的源中经过xml web service来整合实现。以下是.net关于xml web service的定义:
. xml web service通过一个标准的协议向web用户公布实用功能。大多数情况下这个协议是SOAP协议。
. xml web service通过一种方法去描述接口,这些信息必须足够详细以便用户能根据这些信息去实现一个客户应用程序。这个描述通常是以一个xml文档(Web Services Description Language)呈现。
.一旦xml web service被注册,那么潜在的用户可以很容易的通过Universal Discovery Description and Integration 找到这些服务。
3. C#, Java 和 c++的特点,有什么相同的地方,不同的地方,C#分别从c++和java中吸取了他们那些优点?
(1)语法比较相似
(2)都是面向对象编程语言,C#和Java是纯面向对象,而c++包含多种编程模式。
(3)C#, Java都有垃圾回收机制,而c++的内存释放需要程序员自己控制。
(4)C#, Java都是被编译一种中间语言的模式,然后在运行时由运行环境进行生产机器语言。而c++是直接编译到机器语言。
(5)C#, Java支持类单继承和接口多重继承,而C++支持类多重继承。
(6)C#从java中吸取了垃圾自动回收,类单继承和接口多继承,基于一个运行时环境便于平台移植,
(7)C#,Java没有指针,C++有
(8)C#加强了Java的属性概念,并在编译器进行安全类型检查和访问控制检查。C++没有
(9)C#, Java吸收了C++泛型编程的思想,和接口的思想并使其成为语言的一种特性。
(10)C#还支持对象索引机制。
(11)没有全局变量,都是从一个基类开始,具有自己的类体系结构,没有头文件概念,都是用层次名称空间来控制体系。
4. C#可否对内存进行直接的操作?
可以直接操作,只不过需要一下系统的API,如OpenMapingFile等。由于在托管代码中我们不能使用指针,那么需要使用unsafe标记来声明来使用指针对内存进行操作。如果是关于c#的内存分配问题,这个内容比较长,我将在另一篇文章里进行讨论。
5. 用Visual C++ 6.0编写的代码(unmanaged code),如何在CLR下和其他dot net component结合?
将unmanaged code 编译成dll, 然后通过DllImport属性的方式导入公开的方法到framework.
6. C#中的委托是什么?事件是不是一种委托?
可以把委托看作是经过.net包装的托管指针,使用委托先要定义委托,然后声明委托变量,事件是一种委托。
7. 描述一下C#中索引器的实现过程,是否只能根据数字进行索引?
C#中的索引器是通过一个特殊的属性this[]来实现的,也可以通过其他的类型来进行索引,如字符串。
8. C#中要使一个类支持FOREACH遍历,实现过程怎样?
类要实现IEnumerable接口, 并通过IEnumerable接口的GetEnumerator();返回一个IEnumerator对象。
private ArrayList m_list;
public CountryList () {
m_list = new ArrayList();
m_list.Add("China");
m_list.Add("America");
m_list.Add("England");
}
public IEnumerator GetEnumerator () {
return m_list.GetEnumerator();
}
}
9. 你对XMLHTTP、WEBSERVICE 了解吗?简单描述其特点、作用?
XMLHTTP是一组API函数集,可被JavaScript、JScript、VBScript以及其它web浏览器内嵌的脚本语言调用,通过HTTP在浏览器和web服务器之间收发XML或其它数据。XMLHTTP最大的好处在于可以动态地更新网页,它无需重新从服务器读取整个网页,也不需要安装额外的插件。该技术被许多网站使用,以实现快速响应的动态网页应用。例如:Google的Gmail服务、Google Suggest动态查找界面以及Google Map地理信息服务。
XMLHTTP是AJAX网页开发技术的重要组成部分。
除XML之外,XMLHTTP还能用于获取其它格式的数据,如JSON或者甚至纯文本。
WebService是由W3C组织定义的“一个软件系统被设计为支持跨网络实现机器到机器共同操作”。WebService经常使用诸如Web APIs来跨网络访问并执行远端系统上的服务。
10. 接口和抽象类有什么区别?你选择使用接口和抽象类的依据是什么?
接口是一个规范和比抽象类约束更强的类,接口不能拥有实体,而抽象类可以有实体。在定义规范的时候使用接口,在设计类体系是使用抽象类。
11. net的错误处理机制是什么
异常处理,通过抛出一个异常,在代码块中使用try... catch ... finally关键字来实现异常捕获和处理。.net的所有异常类都是从System.Exception类继承而来。
12. 您了解设计模式么?请列出您所知道的设计模式的名称。
用来在特定环境下解决问题的一个较优方法。
单件模式、桥接模式、工厂模式、抽象工厂模式、构建者模式、适配器模式、观察者模式、组合模式。
13. 什么是Application Pool?
应用程序池是将一个或多个应用程序链接到一个或多个工作进程集合的配置。应用程序池中的应用程序与其他应用程序被工作进程边界分隔,所以某个应用程序池中的应用程序不会受到其他应用程序池中应用程序所产生的问题的影响。
14. Remoting在客户端服务器怎么实现 ?
15. .什么叫应用程序域?什么是受管制的代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?
应用程序域是一个.net framework提供的执行托管代码的环境。这个环境是提供了一个隔绝的不可卸载的安全边界。你可以在一个应用程序域里加载装配件或可执行程序。并且一个应用程序域运行出错了,可以卸载掉而不用担心影响其他应用程序域的工作。
托管代码是为面向公共语言运行库的服务编写的代码。
强类型系统是对数据类型有严格的要求和限制,每一个变量和每一个表达式都有类型,在使用一个变量前系统都会进行类型检查。
简单的说装箱就是将值类型转换成引用类型,而拆箱刚好是相反的过程。
重载就是对于同名函数赋予不同的参数列表,以适应同的访问需求:如
void Output(string name) {}
void Output(string name, int start) {}
CTS:公共类型系统.主要是为了语言之间的进行标准化处理.
CLS:公共语言规范.主要是确保代码可以在任何语言中访问的最小标准集体
CLR:公共语言运行时.主要是管理代码..处理,加载代码,以及所有服务的代码