VB.NET 對於型別的傳遞按值或者按引用

weixin_34377065發表於2006-07-13

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對標準的就是這麼踐踏的,呵呵


相關文章