Remoting和WebService/Ref, Out, Params的区别/


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<A> arrA = new List<A>();

通常情况下,都建议使用泛型集合,因为这样可以获得得类型安全的直接优点而不需要从基集合类型派生并实现类型的特定成员。此外,如果集合元素为值类型,泛型集合的性能通常优于对应的非泛型集合类型(并优于从非泛基集合型类型派生的类型),因为使用泛型时不必对元素进行装箱。

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的,使用者可以开发和部署自己的宿主服务器。

这里还有两个重点:
1.Remoting的SingleTon和SingleCall模式
SingleTon模式:此为有状态模式。如果设置为SingleTon激活方式,则Remoting将为所有客户端建立同一个对象实例。当对象处于活动状态时,SingleTon实例会处理所有后来的客户端访问请求,而不管它们是同一个客户端,还是其他客户端。SingleTon实例将在方法调用中一直维持其状态。举例来说,如果一个远程对象有一个累加方法(i=0;++i),被多个客户端(例如两个)调用。如果设置为SingleTon方式,则第一个客户获得值为1,第二个客户获得值为2,因为他们获得的对象实例是相同的。如果熟悉Asp.Net的状态管理,我们可以认为它是一种 Application状态。
SingleCall模式:SingleCall是一种无状态模式。一旦设置为SingleCall模式,则当客户端调用远程对象的方法时, Remoting会为每一个客户端建立一个远程对象实例,至于对象实例的销毁则是由GC自动管理的。同上一个例子而言,则访问远程对象的两个客户获得的都是1。我们仍然可以借鉴Asp.Net的状态管理,认为它是一种Session状态。

2.WebService和SOAP支持处理的数据类型
不知道大家有没有遇到这种情况:在调用WebService并给一个方法传递了一个DataRow参数时,运行时会抛出异常: "没法将参数序列化!",如果把DataRow加入到DataSet中,并将DataSet作为参数传递再运行就OK了。 这是因为:XML WebService只能对数据集DataSet对象类型进行XML序列化,不能对DataRow对象类型进行XML序列化造成的错误.  所以了解一下XML WebService支持序列化的基  本数据类型是比较重要的.它支持的数据类型如下:
  1).基本数据类型.
      标准类型,如:int float bool DateTime string等基本数据类型
  2).枚举.
      支持枚举Enum定义的类型
  3).自定义对象.
      可以传递任意基于自定义类或结构创建的对象。 但要注意一点: 它只能传输数据成员(变量和属性). 如果定义了方法,则方法不能进行序列化传输,序列化后只剩下数据成员.
  4).DataSet对象
      支持DataSet,切记:不支持DataTable和DataRow,DataSet已经是Webservice能够支持的最小的可序列化对象.
  5).XmlNode对象
      基于XmlNode的对象可以表示XML文档的一部分.
  6).数组和集合
      可以使用任何被支持的类型的数组和简单集合,包括: DataSet对象/XmlNode对象和自定义对象.

顺便说明一下序列化的概念:
序列化是指将对象实例的状态存储到存储媒体的过程。在此过程中,先将对象的公共字段和私有字段以及类的名称转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本。要使一个类可序列化,最简单的方法是使用 Serializable 属性对它进行标记。给个例子:
[Serializable]
class MyUser
{
    public string sUserName;
    public int iAage;
    public override string ToString()
    {
        return string.Format("姓名:{0},年龄:{1}", sUserName, iAage);
    }
}
原文地址:https://www.cnblogs.com/wangzhuangye/p/1759322.html