1、Override和Overload
重载应该叫overload,重写叫override;重载某个方法是在同一个类中发生的!重写是在子类中重写父类中的方法。
1.override: 父类:public virtual string ToString(){return "a";}
子类:public override string ToString(){return "b";}
2.overload: 同一类中或父子关系类中皆可.
public string ToString(){return "a";}
public string ToString(int id){return id.ToString();}
重写(override)是用于重写基类的虚方法,这样在派生类中提供一个新的方法;
重载(overload)是提供了一种机制, 相同函数名通过不同的返回值类型以及参数来表来区分的机制。
2、托管和非托管的区别
托管代码就是Visual Basic .NET和C#编译器编译出来的代码。编译器把代码编译成中间语言(IL),而不是能直接在你的电脑上运行的机器码。中间语言被封装在一个叫程序集(assembly)的文件中,程序集中包含了描述你所创建的类,方法和属性(例如安全需求)的所有元数据。你可以拷贝这个程序集到另一台服务器上部署它。通常来说,这个拷贝的动作就是部署流程中唯一的一个操作。
托管代码在公共语言运行库(CLR)中运行。这个运行库给你的运行代码提供各种各样的服务,通常来说,他会加载和验证程序集,以此来保证中间语言的正确性。当某些方法被调用的时候,运行库把具体的方法编译成适合本地计算机运行的机械码,然后会把编译好的机械码缓存起来,以备下次调用(这就是即时编译)。随着程序集的运行,运行库会持续地提供各种服务,例如安全,内存管理,线程管理等等。这个程序被“托管”在运行库中。Visual Basic .NET和C#只能产生托管代码。如果你用这类语言写程序,那么所产生的代码就是托管代码。如果你愿意,Visual C++ .NET可以生成托管代码。当你创建一个项目的时候,选择名字是以.Managed开头的项目类型。例如.Managed C++ application。
非托管代码直接编译成目标计算机的机械码,这些代码只能运行在编译出它们的计算机上,或者是其它相同处理器或者几乎一样处理器的计算机上。非托管代码不能享受一些运行库所提供的服务,例如安全和内存管理等。如果非托管代码需要进行内存管理等服务,就必须显式地调用操作系统的接口,通常来说,它们会调用Windows SDK所提供的API来实现。就最近的情况来看,非托管程序会通过COM接口来获取操作系统服务。跟Visual Studio平台的其他编程语言不一样,Visual C++可以创建非托管程序。当你创建一个项目,并且选择名字以MFC,ATL或者Win32开头的项目类型,那么这个项目所产生的就是非托管程序。
总而言之,非托管代码是运行在公共语言运行库环境(CLR)的外部,由操作系统直接执行的代码。非托管代码必须提供自己的垃圾回收、类型检查、安全支持等服务;它与托管代码不同,后者从公共语言运行库中获得这些服务。
3、Equals和用“==”的区别
因为值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
4、拓展方法
拓展方法允许改变类,但是不需要该类的源代码。
拓展方法是静态方法,它是类的一部分,但实际上没有放在类的源代码中。
假定 Money类需要一个方法 AddToAmount(decimal amountToAdd)。但是,由于某种原因,程序集最初的源代码不能直接修改。 此时必须做的所有工作就是创建一个静态类,把方法 AddToAmount添加为一个静态方法。 对应的代码如下 :
注意AddToAmount()方法的参数,对于拓展方法,第一个参数是要拓展的类型,它放在this关键字的后面。这告诉编译器,这个方法是Money类的一部分。
5、webservice是什么?对其的了解?
webservice 是微软针对面向服务(SOA)编程开发出来的一种技术,它使用了wsdl描述语言来声明一个可被引用到的服务的接口,使用SOAP简单对象访问协议来进行 俱体数据的传输,比如方法参数及返回值。SOAP中传输的对象都是被序列化后的XML格式的数据,是可以穿透防火墙,进行不同应用之间的对象传输。
6、UDP链接与TCP链接有什么异同?
UDP协议不一定提供可靠的数据传输,也就是说该协议不能保证数据准确无误地到达目的地。但是,假如你的程序的目标是尽快地传输尽可能多的信息时可使用UDP来实现,比如QQ、YY语音等聊天程序。
TCP/IP提供可靠的数据传输,并在相互进行通信的设备或服务之间保持一个虚拟连接。在数据包接收无序、丢失或在交付期间被破坏时,负责数据恢复。
7、C#中private、protected、public、internal修饰符的区别
Private 私有访问,只限于本类成员访问,子类、实例都不能访问。
Protected 保护访问,只限于本类和子类访问,实例不能访问。
Public 公有访问,不受任何限制。
Internal 内部访问,只限于本项目内访问,其他不能访问。
8、冒泡排序,快排等基础的数据结构
1、冒泡排序基本思想:将n个记录看做纵向排列,每趟排序时按照自下而上对每对相邻记录进行比较,若次序不符合要求就交换。每趟排序结束时都能使排序范围内关键字最小的记录像气泡一样升到表上端的对应位置,整个排序过程共进行n-1趟,依次将关键字最小、次小、第三小…的各个记录“冒到”表的第一个、第二个、第三个… 位置上。
示例代码:
for (int i = 0; i < a.Length; i++ )
{
for(int j = a.Length-1;j>i;j--)
{
if(a[j] < a[j-1])
{
int temp = a[j];
a[j] = a[j - 1];
a[j - 1] = temp;
flag = 1;
}
}
}
2、快速排序:快速排序的思想是分治思想。
快速排序是找出一个元素作为基准,然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的值都不小于基准值。
实例代码:
int quicksort(vector<int> &v, int left, int right){
if(left < right){
int key = v[left];
int low = left;
int high = right;
while(low < high){
while(low < high && v[high] > key){
high--;
}
v[low] = v[high];
while(low < high && v[low] < key){
low++;
}
v[high] = v[low];
}
v[low] = key;
quicksort(v,left,low-1);
quicksort(v,low+1,right);
}
}
9、拆箱和装箱以及拆箱和装箱的性能损耗
所谓的装箱是把值类型转化成引用类型,拆箱就是把引用类型转化成值类型。
装箱过程中,值类型被复制并分配到托管堆,并把它转化成对应的引用类型,这个过程会造成性能的损失。
在拆箱过程中,将托管堆中的引用类型复制到栈中,转换成对应的类型,这个过程中也会造成性能的损失。