面向对象的理论知识
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Abstruct class 与Interface的区别
相同点:
1)都不能被初始化;
2)都支持抽象方法;
不同点:
1)abstract class的成员函数允许有函数体,interface不能
2)abstract class允许有成员变量,interface不能(interface只能含有事件,委托,函数,属性,索引器);
3)abstract class的方法允许含有可见性修饰符,interface不能(默认为public)
4)abstract class不能被多重继承,interface可以被多重继承(实现)
5)abstract class 可以拥有构造函数/静态构造函数,interface不可以
class 与Struct的区别
相同点:
1)它们都是创建对象的模板,用以抽象某类具有统统特征的对象;他们都包含数据和方法;2)它们在使用上没有太大的区别,除了关键字class和struct不同;
不同点:
1)Struct是值类型,它在内存中的存储方式是存储于堆(heap)上
2)Class是引用类型,它在内存中的存储方式是存储于栈(stack)上
Ref, Out, Params的区别
params 关键字可以指定在参数数目可变处采用参数的方法参数。在方法声明中的params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个params 关键字。
Out
这是一个引用传递L。
原则一:当一个方法(函数)在使用out作为参数时,在方法中(函数)对out参数所做的任何更改都将反映在该变量中。
原则二:当希望方法返回多个值时,声明out 方法非常有用。使用out 参数的方法仍然可以返回一个值。一个方法可以有一个以上的out 参数。
原则三:若要使用out 参数,必须将参数作为out 参数显式传递到方法。out 参数的值不会传递到out 参数。
原则四:不必初始化作为out 参数传递的变量,因为out 参数在进入方法(函数)时后清空自己,使自己变成一个干净的参数,也因为这个原因必须在方法返回之前为out 参数赋值(只有地址没有值的参数是不能被.net接受的)。
原则五:属性不是变量,不能作为out 参数传递。
原则六:如果两个方法的声明仅在out 的使用方面不同,则会发生重载。不过,无法定义仅在ref 和out 方面不同的重载。
ref仅仅是一个地址!!!
原则一:当一个方法(函数)在使用ref作为参数时,在方法中(函数)对ref参数所做的任何更改都将反映在该变量中。
原则二:调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
原则三:若要使用ref 参数,必须将参数作为ref 参数显式传递到方法。ref 参数的值可以被传递到ref 参数。
原则四:ref参数传递的变量必须初始化,因为ref参数在进入方法(函数)时后还是它自己,它这个地址指向的还是原来的值,也因为这个原因ref参数也可以在使用它的方法内部不操作。
原则六:如果两种方法的声明仅在它们对ref 的使用方面不同,则将出现重载。但是,无法定义仅在ref 和out 方面不同的重载。
经常会被问到的二个算法:冒泡排序和二分法。以下是两个比较经典的实现。
冒泡排序算法:
public void BubbleSort(int[] arr)
{
for (int i = 1; i < arr.Length; i++)
for (int j = 0; j < arr.Length - i; j++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
二分法查找:
public int HalfSearch(int key, int[] arr)
{
int left = 0;
int right = arr.Length - 1;
while (left <= right)
{
int middle = (left + right) / 2;
if (key == arr[middle])
return middle;
else if (key > arr[middle])
{
left = middle + 1;
}
else
{
right = middle - 1;
}
}
return -1;
}
1. 面试时有相当大的可能会被问到面向对像的特点:继承,封装,多态。
封装:每个对象都包含它能进行操作所需要的所有信息,这个特性称为封装,因此对象不必依赖其他对象来完成自己的操作。
继承:对象的继承代表了一种“is-a”的关系,如果两个对象A和B,可以描述为“B是A”,则表明B可以继承A。
多态:表示不同的对象可以执行相同的动作,但要通过它们自己的实现代码来执行。
2.集合
ArrayList是命名空间System.Collections下的一部分,它是使用大小可以按需要动态增加的数组实现IList接口。
3.泛型
泛型是具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。泛型集合类可以将类型参数用作它所存储的对象的类型占位符;类型参数作为其字段的类型和其方法的参数类型出现。
IList arrA = new List();
通常情况下,都建议使用泛型集合,因为这样可以获得得类型安全的直接优点而不需要从基集合类型派生并实现类型的特定成员。此外,如果集合元素为值类型,泛型集合的性能通常优于对应的非泛型集合类型(并优于从非泛基集合型类型派生的类型),因为使用泛型时不必对元素进行装箱。
4.委托和事件
委托是对函数的封装,可以当作给方法的特征指定一个名称。而事件则是委托的一种特殊形式,当发生有意义的事情时,事件对象处理通知过程。
委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。事件是在发生其他类或对象关注的事情时,类或对象可通过事件通知它们。
public delegate void CatShoutEventHandler();
public event CatShoutEventHandler CatShout;
EventArges是包含事件数据的类的基类。
一、Remoting和WebService
面试的时候有时候会被问到Remoting和Webservice技术的区别:
1. Remoting 是MarshByReference的,可以传变量的引用,直接对服务器对象操作。速度快,适合intranet(企业内部互联网)。
Webservice 是MarshByValue的,必须传对象的值。速度慢,可以过FIREWALL,配置比较简单,适合internet(因特网)。
2. 一般来说,Remoting是和平台相关的,需要客户和服务器都是.NET,但可配置特性比较好,可以自定义协议,可以使用Http或Tcp协议。
Webservice可以做到跨平台通信,但必须采用SOAP协议。
3. soap消息有rpc和文档两种样式。
文档样式的body元素中包含一个或多个元素,可以是任何内容,只要接受者理解就行了。rpc样式的的body元素中包含调用的方法或远程过程的名称,以及代表方法参数的元素。.net对这两种样式的实现就是Webservice 和Remoting
4.Remoting不仅能传输XML格式的SOAP包(HTTP),还能传输二进制的数据流(TCP)。Webservice只能传输SOAP包。
5.Remoting可以用于有状态的情况,Webservice是基于Http无状态的。
6.在Windows操作系统中,Webservice是基于.net framework和IIS框架之上的,而Remoting 则是不依赖于IIS的,使用者可以开发和部署自己的宿主服务器。