VB.NET 对于类型的传递按值或者按引用

VB.NET 对于类型的传递按值或者按引用,(byval byref) C# 多了个out。

有时候面试的时候我会问个小问题,嘿嘿,看看对C#基本的语法有没有熟悉。

比如

public void XXX( byval form as Form)

public void XXX(byref form as Form)

有啥区别?其实很简单对应为C++ 就是 void XXX( Form * form) 跟 void XXX(Form **form)

所谓的按照值传递跟引用传递都有一个基本的问题就是谁的值,谁的地址。

以上的两个方法,第一个传递的是Form这个对象的地址这个值。所以在第一个方法中你这样写

form.xxx=zzz //可以更改原来form对象的值

form=New Form()

form.xxx=yyy;

事实上,不会影响原来form的值。

而第二个就不一样,他传递的是地址的地址,所以他可以更改原来form的值。

这个问题放到WebService 中就更奇怪了。

[WebMethod()]
public void XXX( byval p as Person)

[WebMethod()]
public void YYY( byref p as Person)

我们都说webservice是没有状态的,那么第一个方法跟第二个方法有啥区别呢?第一个方法中如果也是类似的代码,他能够影响客户端传递给他的对象的状态吗? 第二个呢?

看看微软的实现,才发现他做了很多诡异的代码。

看看他的第二个方法的WSDL,明明return的是void的,他应是给你返回一个对象。

<soap:Body>
    <HelloWorldpersonResponse xmlns="http://tempuri.org/">
      <p>
        <Name>string</Name>
      </p>
    </HelloWorldpersonResponse>
  </soap:Body>

然后客户端的代理做什么操作呢?呵呵。以下代码

 Public Sub HelloWorldperson(ByRef p As Person)
            Dim results() As Object = Me.Invoke("YYY", New Object() {p})
            p = CType(results(0),Person)
        End Sub

MS对标准的就是这么践踏的,呵呵


原文地址:https://www.cnblogs.com/fuyingke/p/450004.html